diff options
Diffstat (limited to 'html')
105 files changed, 5909 insertions, 5909 deletions
diff --git a/html/000organization.cc.html b/html/000organization.cc.html index 091df0c2..c04b46e2 100644 --- a/html/000organization.cc.html +++ b/html/000organization.cc.html @@ -166,8 +166,8 @@ if ('onhashchange' in window) { <span id="L110" class="LineNr">110 </span><span class="Comment">//</span> <span id="L111" class="LineNr">111 </span><span class="Comment">// End Globals</span> <span id="L112" class="LineNr">112 </span> -<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> -<span id="L114" class="LineNr">114 </span> atexit<span class="Delimiter">(</span>teardown<span class="Delimiter">);</span> +<span id="L113" class="LineNr">113 </span><span class="Normal">int</span> <a href='000organization.cc.html#L113'>main</a><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> +<span id="L114" class="LineNr">114 </span> atexit<span class="Delimiter">(</span><a href='000organization.cc.html#L138'>teardown</a><span class="Delimiter">);</span> <span id="L115" class="LineNr">115 </span> <span id="L116" class="LineNr">116 </span> <span class="Comment">// End One-time Setup</span> <span id="L117" class="LineNr">117 </span> @@ -187,11 +187,11 @@ if ('onhashchange' in window) { <span id="L131" class="LineNr">131 </span><span class="Comment">//: Without directives or with the :(code) directive, lines get added at the</span> <span id="L132" class="LineNr">132 </span><span class="Comment">//: end.</span> <span id="L133" class="LineNr">133 </span><span class="Delimiter">:(code)</span> -<span id="L134" class="LineNr">134 </span><span class="Normal">void</span> setup<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L134" class="LineNr">134 </span><span class="Normal">void</span> <a href='000organization.cc.html#L134'>setup</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L135" class="LineNr">135 </span> <span class="Comment">// End Setup</span> <span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span> <span id="L137" class="LineNr">137 </span> -<span id="L138" class="LineNr">138 </span><span class="Normal">void</span> teardown<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L138" class="LineNr">138 </span><span class="Normal">void</span> <a href='000organization.cc.html#L138'>teardown</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L139" class="LineNr">139 </span> <span class="Comment">// End Teardown</span> <span id="L140" class="LineNr">140 </span><span class="Delimiter">}</span> </pre> diff --git a/html/001help.cc.html b/html/001help.cc.html index 5ce44e6b..3c853458 100644 --- a/html/001help.cc.html +++ b/html/001help.cc.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <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> <span id="L3" class="LineNr"> 3 </span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(before "End Commandline Parsing")</span> -<span id="L5" class="LineNr"> 5 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc <= <span class="Constant">1</span> || is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">"--help"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L5" class="LineNr"> 5 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc <= <span class="Constant">1</span> || <a href='001help.cc.html#L70'>is_equal</a><span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">"--help"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L6" class="LineNr"> 6 </span> <span class="Comment">//: this is the functionality later layers will provide</span> <span id="L7" class="LineNr"> 7 </span> <span class="Comment">// currently no automated tests for commandline arg parsing</span> <span id="L8" class="LineNr"> 8 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>argc <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -77,16 +77,16 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr"> 18 </span> << <span class="Constant">"Examples:</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L19" class="LineNr"> 19 </span> << <span class="Constant">" To load files and run 'main':</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L20" class="LineNr"> 20 </span> << <span class="Constant">" mu file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L21" class="LineNr"> 21 </span> << <span class="Constant">" To run 'main' and dump a trace of all operations at the end:</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L21" class="LineNr"> 21 </span> << <span class="Constant">" To run 'main' and dump a <a href='003trace.cc.html#L171'>trace</a> of all operations at the <a href='003trace.cc.html#L195'>end</a>:</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L22" class="LineNr"> 22 </span> << <span class="Constant">" mu --trace file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L23" class="LineNr"> 23 </span> << <span class="Constant">" To run all tests:</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L24" class="LineNr"> 24 </span> << <span class="Constant">" mu test</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L25" class="LineNr"> 25 </span> << <span class="Constant">" To load files and then run all tests:</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L26" class="LineNr"> 26 </span> << <span class="Constant">" mu test file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L27" class="LineNr"> 27 </span> << <span class="Constant">" To run a single Mu scenario:</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L28" class="LineNr"> 28 </span> << <span class="Constant">" mu test file1.mu file2.mu ... scenario</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L29" class="LineNr"> 29 </span> << <span class="Constant">" To run a single Mu scenario and dump a trace at the end:</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L30" class="LineNr"> 30 </span> << <span class="Constant">" mu --trace test file1.mu file2.mu ... scenario</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L27" class="LineNr"> 27 </span> << <span class="Constant">" To run a single Mu <a href='050scenario.cc.html#L57'>scenario</a>:</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L28" class="LineNr"> 28 </span> << <span class="Constant">" mu test file1.mu file2.mu ... <a href='050scenario.cc.html#L57'>scenario</a></span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L29" class="LineNr"> 29 </span> << <span class="Constant">" To run a single Mu <a href='050scenario.cc.html#L57'>scenario</a> and dump a <a href='003trace.cc.html#L171'>trace</a> at the <a href='003trace.cc.html#L195'>end</a>:</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L30" class="LineNr"> 30 </span> << <span class="Constant">" mu --trace test file1.mu file2.mu ... <a href='050scenario.cc.html#L57'>scenario</a></span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L31" class="LineNr"> 31 </span> << <span class="Constant">" To load files and run only the tests in explicitly loaded files (for apps):</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L32" class="LineNr"> 32 </span> << <span class="Constant">" mu --test-only-app test file1.mu file2.mu ...</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L33" class="LineNr"> 33 </span> << <span class="Constant">" To load all files with a numeric prefix in a directory:</span><span class="cSpecial">\n</span><span class="Constant">"</span> @@ -96,7 +96,7 @@ if ('onhashchange' in window) { <span id="L37" class="LineNr"> 37 </span> << <span class="Constant">" To pass ingredients to a mu program, provide them after '--':</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L38" class="LineNr"> 38 </span> << <span class="Constant">" mu file_or_dir1 file_or_dir2 ... -- ingredient1 ingredient2 ...</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L39" class="LineNr"> 39 </span> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L40" class="LineNr"> 40 </span> << <span class="Constant">" To browse a trace generated by a previous run:</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L40" class="LineNr"> 40 </span> << <span class="Constant">" To browse a <a href='003trace.cc.html#L171'>trace</a> generated by a previous run:</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L41" class="LineNr"> 41 </span> << <span class="Constant">" mu browse-trace file</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L42" class="LineNr"> 42 </span> <span class="Delimiter">;</span> <span id="L43" class="LineNr"> 43 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> @@ -107,7 +107,7 @@ if ('onhashchange' in window) { <span id="L48" class="LineNr"> 48 </span><span class="Comment">//: option will never follow a non-option.</span> <span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before "End Commandline Parsing")</span> <span id="L50" class="LineNr"> 50 </span><span class="Normal">char</span>** arg = &argv[<span class="Constant">1</span>]<span class="Delimiter">;</span> -<span id="L51" class="LineNr"> 51 </span><span class="Normal">while</span> <span class="Delimiter">(</span>argc > <span class="Constant">1</span> && starts_with<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">"--"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L51" class="LineNr"> 51 </span><span class="Normal">while</span> <span class="Delimiter">(</span>argc > <span class="Constant">1</span> && <a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">"--"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> <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> <span id="L54" class="LineNr"> 54 </span> <span class="Comment">// End Commandline Options(*arg)</span> @@ -126,15 +126,15 @@ if ('onhashchange' in window) { <span id="L67" class="LineNr"> 67 </span><span class="Comment">//: way, our 'build' script contains a little command to automatically</span> <span id="L68" class="LineNr"> 68 </span><span class="Comment">//: generate declarations for them.</span> <span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L70" class="LineNr"> 70 </span><span class="Normal">bool</span> <a href='001help.cc.html#L70'>is_equal</a><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 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> <span id="L72" class="LineNr"> 72 </span><span class="Delimiter">}</span> <span id="L73" class="LineNr"> 73 </span> -<span id="L74" class="LineNr"> 74 </span><span class="Normal">bool</span> starts_with<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">,</span> <span class="Normal">const</span> string& pat<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L74" class="LineNr"> 74 </span><span class="Normal">bool</span> <a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">,</span> <span class="Normal">const</span> string& pat<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> && b!=pat<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++a<span class="Delimiter">,</span> ++b<span class="Delimiter">)</span> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()</span> && b!=pat<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++a<span class="Delimiter">,</span> ++b<span class="Delimiter">)</span> <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> -<span id="L78" class="LineNr"> 78 </span> <span class="Identifier">return</span> b == pat<span class="Delimiter">.</span>end<span class="Delimiter">();</span> +<span id="L78" class="LineNr"> 78 </span> <span class="Identifier">return</span> b == pat<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span> <span id="L80" class="LineNr"> 80 </span> <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> @@ -200,20 +200,20 @@ if ('onhashchange' in window) { <span id="L141" class="LineNr">141 </span><span class="Comment">//: to the compiler, supported by Clang (GCC version only works sometimes:</span> <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> <span id="L143" class="LineNr">143 </span><span class="Delimiter">:(before "atexit(teardown)")</span> -<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> +<span id="L144" class="LineNr">144 </span><a href='001help.cc.html#L149'>initialize_signal_handlers</a><span class="Delimiter">();</span> <span class="Comment">// not always necessary, but doesn't hurt</span> <span id="L145" class="LineNr">145 </span><span class="CommentedCode">//? cerr << INT_MAX+1 << '\n'; // test overflow</span> <span id="L146" class="LineNr">146 </span><span class="CommentedCode">//? assert(false); // test SIGABRT</span> <span id="L147" class="LineNr">147 </span><span class="Delimiter">:(code)</span> <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> -<span id="L149" class="LineNr">149 </span><span class="Normal">void</span> initialize_signal_handlers<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L149" class="LineNr">149 </span><span class="Normal">void</span> <a href='001help.cc.html#L149'>initialize_signal_handlers</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L150" class="LineNr">150 </span> <span class="Normal">struct</span> sigaction action<span class="Delimiter">;</span> <span id="L151" class="LineNr">151 </span> bzero<span class="Delimiter">(</span>&action<span class="Delimiter">,</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>action<span class="Delimiter">));</span> -<span id="L152" class="LineNr">152 </span> action<span class="Delimiter">.</span>sa_sigaction = dump_and_exit<span class="Delimiter">;</span> +<span id="L152" class="LineNr">152 </span> action<span class="Delimiter">.</span>sa_sigaction = <a href='001help.cc.html#L157'>dump_and_exit</a><span class="Delimiter">;</span> <span id="L153" class="LineNr">153 </span> sigemptyset<span class="Delimiter">(</span>&action<span class="Delimiter">.</span>sa_mask<span class="Delimiter">);</span> <span id="L154" class="LineNr">154 </span> sigaction<span class="Delimiter">(</span><span class="Constant">SIGABRT</span><span class="Delimiter">,</span> &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> <span id="L155" class="LineNr">155 </span> sigaction<span class="Delimiter">(</span><span class="Constant">SIGILL</span><span class="Delimiter">,</span> &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 id="L156" class="LineNr">156 </span><span class="Delimiter">}</span> -<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> +<span id="L157" class="LineNr">157 </span><span class="Normal">void</span> <a href='001help.cc.html#L157'>dump_and_exit</a><span class="Delimiter">(</span><span class="Normal">int</span> sig<span class="Delimiter">,</span> <a href='001help.cc.html#L255'>unused</a> siginfo_t* dummy1<span class="Delimiter">,</span> <a href='001help.cc.html#L255'>unused</a> <span class="Normal">void</span>* dummy2<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L159" class="LineNr">159 </span> <span class="Normal">case</span> <span class="Constant">SIGABRT</span>: <span id="L160" class="LineNr">160 </span><span class="PreProc"> #ifndef __APPLE__</span> @@ -236,7 +236,7 @@ if ('onhashchange' in window) { <span id="L177" class="LineNr">177 </span> <span id="L178" class="LineNr">178 </span><span class="Comment">//: For good measure we'll also enable SIGFPE.</span> <span id="L179" class="LineNr">179 </span><span class="Delimiter">:(before "atexit(teardown)")</span> -<span id="L180" class="LineNr">180 </span>feenableexcept<span class="Delimiter">(</span>FE_OVERFLOW | FE_UNDERFLOW<span class="Delimiter">);</span> +<span id="L180" class="LineNr">180 </span><a href='001help.cc.html#L193'>feenableexcept</a><span class="Delimiter">(</span>FE_OVERFLOW | FE_UNDERFLOW<span class="Delimiter">);</span> <span id="L181" class="LineNr">181 </span><span class="CommentedCode">//? assert(sizeof(int) == 4 && sizeof(float) == 4);</span> <span id="L182" class="LineNr">182 </span><span class="CommentedCode">//? // | exp | mantissa</span> <span id="L183" class="LineNr">183 </span><span class="CommentedCode">//? int smallest_subnormal = 0b00000000000000000000000000000001;</span> @@ -249,7 +249,7 @@ if ('onhashchange' in window) { <span id="L190" class="LineNr">190 </span><span class="PreProc">#ifdef __APPLE__</span> <span id="L191" class="LineNr">191 </span><span class="Comment">// Public domain polyfill for feenableexcept on OS X</span> <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> -<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> +<span id="L193" class="LineNr">193 </span><span class="Normal">int</span> <a href='001help.cc.html#L193'>feenableexcept</a> <span class="Delimiter">(</span><span class="Normal">unsigned</span> <span class="Normal">int</span> excepts<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L194" class="LineNr">194 </span> <span class="Normal">static</span> fenv_t fenv<span class="Delimiter">;</span> <span id="L195" class="LineNr">195 </span> <span class="Normal">unsigned</span> <span class="Normal">int</span> new_excepts = excepts & FE_ALL_EXCEPT<span class="Delimiter">;</span> <span id="L196" class="LineNr">196 </span> <span class="Normal">unsigned</span> <span class="Normal">int</span> old_excepts<span class="Delimiter">;</span> @@ -266,22 +266,22 @@ if ('onhashchange' in window) { <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> <span id="L208" class="LineNr">208 </span><span class="Normal">template</span><<span class="Normal">typename</span> T> <span class="Normal">typename</span> T::mapped_type& get<span class="Delimiter">(</span>T& map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>& key<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L210" class="LineNr">210 </span> assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span>end<span class="Delimiter">());</span> +<span id="L210" class="LineNr">210 </span> assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> <span id="L211" class="LineNr">211 </span> <span class="Identifier">return</span> iter<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <span id="L212" class="LineNr">212 </span><span class="Delimiter">}</span> <span id="L213" class="LineNr">213 </span><span class="Normal">template</span><<span class="Normal">typename</span> T> <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>& get<span class="Delimiter">(</span><span class="Normal">const</span> T& map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>& key<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L215" class="LineNr">215 </span> assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span>end<span class="Delimiter">());</span> +<span id="L215" class="LineNr">215 </span> assert<span class="Delimiter">(</span>iter != map<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> <span id="L216" class="LineNr">216 </span> <span class="Identifier">return</span> iter<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <span id="L217" class="LineNr">217 </span><span class="Delimiter">}</span> -<span id="L218" class="LineNr">218 </span><span class="Normal">template</span><<span class="Normal">typename</span> T> <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>& put<span class="Delimiter">(</span>T& map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>& key<span class="Delimiter">,</span> <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>& value<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L218" class="LineNr">218 </span><span class="Normal">template</span><<span class="Normal">typename</span> T> <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>& <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>T& map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>& key<span class="Delimiter">,</span> <span class="Normal">typename</span> T::mapped_type <span class="Normal">const</span>& value<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L219" class="LineNr">219 </span> map[key] = value<span class="Delimiter">;</span> <span id="L220" class="LineNr">220 </span> <span class="Identifier">return</span> map[key]<span class="Delimiter">;</span> <span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span> <span id="L222" class="LineNr">222 </span><span class="Normal">template</span><<span class="Normal">typename</span> T> <span class="Normal">bool</span> contains_key<span class="Delimiter">(</span>T& map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>& key<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L224" class="LineNr">224 </span><span class="Delimiter">}</span> -<span id="L225" class="LineNr">225 </span><span class="Normal">template</span><<span class="Normal">typename</span> T> <span class="Normal">typename</span> T::mapped_type& get_or_insert<span class="Delimiter">(</span>T& map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>& key<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L225" class="LineNr">225 </span><span class="Normal">template</span><<span class="Normal">typename</span> T> <span class="Normal">typename</span> T::mapped_type& <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>T& map<span class="Delimiter">,</span> <span class="Normal">typename</span> T::key_type <span class="Normal">const</span>& key<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L226" class="LineNr">226 </span> <span class="Identifier">return</span> map[key]<span class="Delimiter">;</span> <span id="L227" class="LineNr">227 </span><span class="Delimiter">}</span> <span id="L228" class="LineNr">228 </span><span class="Comment">//: The contract: any container that relies on get_or_insert should never call</span> @@ -291,7 +291,7 @@ if ('onhashchange' in window) { <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> <span id="L233" class="LineNr">233 </span><span class="Comment">//: failbit and badbit. Just avoid eof() and use this helper instead.</span> <span id="L234" class="LineNr">234 </span><span class="Delimiter">:(code)</span> -<span id="L235" class="LineNr">235 </span><span class="Normal">bool</span> has_data<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L235" class="LineNr">235 </span><span class="Normal">bool</span> <a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L236" class="LineNr">236 </span> <span class="Identifier">return</span> in && !in<span class="Delimiter">.</span>eof<span class="Delimiter">();</span> <span id="L237" class="LineNr">237 </span><span class="Delimiter">}</span> <span id="L238" class="LineNr">238 </span> diff --git a/html/002test.cc.html b/html/002test.cc.html index 454d5dc8..88e7053e 100644 --- a/html/002test.cc.html +++ b/html/002test.cc.html @@ -70,7 +70,7 @@ if ('onhashchange' in window) { <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> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before "Globals")</span> <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> -<span id="L15" class="LineNr"> 15 </span><span class="Normal">const</span> test_fn Tests[] = <span class="Delimiter">{</span> +<span id="L15" class="LineNr"> 15 </span><span class="Normal">const</span> <a href='002test.cc.html#L12'>test_fn</a> Tests[] = <span class="Delimiter">{</span> <span id="L16" class="LineNr"> 16 </span><span class="PreProc"> #include </span><span class="Constant">"test_list"</span> <span class="Comment">// auto-generated; see 'build' script</span> <span id="L17" class="LineNr"> 17 </span><span class="Delimiter">};</span> <span id="L18" class="LineNr"> 18 </span> @@ -99,7 +99,7 @@ if ('onhashchange' in window) { <span id="L41" class="LineNr"> 41 </span>Passed = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L42" class="LineNr"> 42 </span> <span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(before "End Commandline Parsing")</span> -<span id="L44" class="LineNr"> 44 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc > <span class="Constant">1</span> && is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">"test"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L44" class="LineNr"> 44 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc > <span class="Constant">1</span> && <a href='001help.cc.html#L70'>is_equal</a><span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">"test"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> <span id="L46" class="LineNr"> 46 </span><span class="Delimiter">}</span> <span id="L47" class="LineNr"> 47 </span> @@ -113,7 +113,7 @@ if ('onhashchange' in window) { <span id="L55" class="LineNr"> 55 </span> cerr << <span class="Constant">"C tests: "</span> << ctime<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> <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 < <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 id="L57" class="LineNr"> 57 </span><span class="CommentedCode">//? cerr << i << '\n';</span> -<span id="L58" class="LineNr"> 58 </span> run_test<span class="Delimiter">(</span>i<span class="Delimiter">);</span> +<span id="L58" class="LineNr"> 58 </span> <a href='002test.cc.html#L72'>run_test</a><span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L59" class="LineNr"> 59 </span> <span class="Delimiter">}</span> <span id="L60" class="LineNr"> 60 </span> cerr << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L61" class="LineNr"> 61 </span> <span class="Comment">// End Tests</span> @@ -127,28 +127,28 @@ if ('onhashchange' in window) { <span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span> <span id="L70" class="LineNr"> 70 </span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L72" class="LineNr"> 72 </span><span class="Normal">void</span> <a href='002test.cc.html#L72'>run_test</a><span class="Delimiter">(</span><span class="Normal">size_t</span> i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L73" class="LineNr"> 73 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i >= <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> <span id="L74" class="LineNr"> 74 </span> cerr << <span class="Constant">"no test "</span> << i << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L75" class="LineNr"> 75 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L76" class="LineNr"> 76 </span> <span class="Delimiter">}</span> -<span id="L77" class="LineNr"> 77 </span> setup<span class="Delimiter">();</span> +<span id="L77" class="LineNr"> 77 </span> <a href='000organization.cc.html#L134'>setup</a><span class="Delimiter">();</span> <span id="L78" class="LineNr"> 78 </span> <span class="Comment">// End Test Setup</span> <span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">(</span>*Tests[i]<span class="Delimiter">)();</span> <span id="L80" class="LineNr"> 80 </span> <span class="Comment">// End Test Teardown</span> -<span id="L81" class="LineNr"> 81 </span> teardown<span class="Delimiter">();</span> +<span id="L81" class="LineNr"> 81 </span> <a href='000organization.cc.html#L138'>teardown</a><span class="Delimiter">();</span> <span id="L82" class="LineNr"> 82 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">'.'</span><span class="Delimiter">;</span> <span id="L83" class="LineNr"> 83 </span> <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span> <span id="L84" class="LineNr"> 84 </span><span class="Delimiter">}</span> <span id="L85" class="LineNr"> 85 </span> -<span id="L86" class="LineNr"> 86 </span><span class="Normal">bool</span> is_integer<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L86" class="LineNr"> 86 </span><span class="Normal">bool</span> <a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"0123456789-"</span><span class="Delimiter">)</span> == string::npos <span class="Comment">// no other characters</span> <span id="L88" class="LineNr"> 88 </span> && s<span class="Delimiter">.</span>find_first_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos <span class="Comment">// at least one digit</span> <span id="L89" class="LineNr"> 89 </span> && 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 id="L90" class="LineNr"> 90 </span><span class="Delimiter">}</span> <span id="L91" class="LineNr"> 91 </span> -<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> -<span id="L93" class="LineNr"> 93 </span> <span class="Normal">char</span>* end = <span class="Constant">NULL</span><span class="Delimiter">;</span> +<span id="L92" class="LineNr"> 92 </span><span class="Normal">int</span> <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>string n<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L93" class="LineNr"> 93 </span> <span class="Normal">char</span>* <a href='003trace.cc.html#L195'>end</a> = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L94" class="LineNr"> 94 </span> <span class="Comment">// safe because string.c_str() is guaranteed to be null-terminated</span> <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> &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 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 << <span class="Constant">"tried to convert "</span> << n << <span class="Constant">" to number</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> @@ -156,14 +156,14 @@ if ('onhashchange' in window) { <span id="L98" class="LineNr"> 98 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L99" class="LineNr"> 99 </span><span class="Delimiter">}</span> <span id="L100" class="LineNr">100 </span> -<span id="L101" class="LineNr">101 </span><span class="Normal">void</span> test_is_integer<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L102" class="LineNr">102 </span> CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">"1234"</span><span class="Delimiter">));</span> -<span id="L103" class="LineNr">103 </span> CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">"-1"</span><span class="Delimiter">));</span> -<span id="L104" class="LineNr">104 </span> CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"234.0"</span><span class="Delimiter">));</span> -<span id="L105" class="LineNr">105 </span> CHECK<span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span><span class="Constant">"-567"</span><span class="Delimiter">));</span> -<span id="L106" class="LineNr">106 </span> CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"89-0"</span><span class="Delimiter">));</span> -<span id="L107" class="LineNr">107 </span> CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"-"</span><span class="Delimiter">));</span> -<span id="L108" class="LineNr">108 </span> CHECK<span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"1e3"</span><span class="Delimiter">));</span> <span class="Comment">// not supported</span> +<span id="L101" class="LineNr">101 </span><span class="Normal">void</span> <a href='002test.cc.html#L101'>test_is_integer</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L102" class="LineNr">102 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span><span class="Constant">"1234"</span><span class="Delimiter">));</span> +<span id="L103" class="LineNr">103 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span><span class="Constant">"-1"</span><span class="Delimiter">));</span> +<span id="L104" class="LineNr">104 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"234.0"</span><span class="Delimiter">));</span> +<span id="L105" class="LineNr">105 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span><span class="Constant">"-567"</span><span class="Delimiter">));</span> +<span id="L106" class="LineNr">106 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"89-0"</span><span class="Delimiter">));</span> +<span id="L107" class="LineNr">107 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"-"</span><span class="Delimiter">));</span> +<span id="L108" class="LineNr">108 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span><span class="Constant">"1e3"</span><span class="Delimiter">));</span> <span class="Comment">// not supported</span> <span id="L109" class="LineNr">109 </span><span class="Delimiter">}</span> <span id="L110" class="LineNr">110 </span> <span id="L111" class="LineNr">111 </span><span class="Delimiter">:(before "End Includes")</span> diff --git a/html/003trace.cc.html b/html/003trace.cc.html index 4de87657..aa24480e 100644 --- a/html/003trace.cc.html +++ b/html/003trace.cc.html @@ -170,7 +170,7 @@ if ('onhashchange' in window) { <span id="L113" class="LineNr">113 </span> <span class="Normal">int</span> collect_depth<span class="Delimiter">;</span> <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> <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> -<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> +<span id="L116" class="LineNr">116 </span> <a href='003trace.cc.html#L116'>~trace_stream</a><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> <span id="L117" class="LineNr">117 </span> <span id="L118" class="LineNr">118 </span> ostream& stream<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> @@ -185,17 +185,17 @@ if ('onhashchange' in window) { <span id="L128" class="LineNr">128 </span> <span class="Delimiter">}</span> <span id="L129" class="LineNr">129 </span> <span id="L130" class="LineNr">130 </span> <span class="Comment">// be sure to call this before messing with curr_stream or curr_label</span> -<span id="L131" class="LineNr">131 </span> <span class="Normal">void</span> newline<span class="Delimiter">();</span> +<span id="L131" class="LineNr">131 </span> <span class="Normal">void</span> <a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> <span id="L132" class="LineNr">132 </span> <span class="Comment">// useful for debugging</span> -<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> +<span id="L133" class="LineNr">133 </span> string <a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span>string label<span class="Delimiter">);</span> <span class="Comment">// empty label = show everything</span> <span id="L134" class="LineNr">134 </span><span class="Delimiter">};</span> <span id="L135" class="LineNr">135 </span> <span id="L136" class="LineNr">136 </span><span class="Delimiter">:(code)</span> -<span id="L137" class="LineNr">137 </span><span class="Normal">void</span> trace_stream::newline<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L137" class="LineNr">137 </span><span class="Normal">void</span> trace_stream::<a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> <span id="L139" class="LineNr">139 </span> string curr_contents = curr_stream<span class="Delimiter">-></span>str<span class="Delimiter">();</span> <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> -<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> +<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> <a href='003trace.cc.html#L365'>trim</a><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 id="L142" class="LineNr">142 </span> <span class="Normal">if</span> <span class="Delimiter">((</span>!Hide_errors && curr_label == <span class="Constant">"error"</span><span class="Delimiter">)</span> <span id="L143" class="LineNr">143 </span> || Dump_trace <span id="L144" class="LineNr">144 </span> || <span class="Delimiter">(</span>!Dump_label<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> && curr_label == Dump_label<span class="Delimiter">))</span> @@ -203,14 +203,14 @@ if ('onhashchange' in window) { <span id="L146" class="LineNr">146 </span> <span class="Delimiter">}</span> <span id="L147" class="LineNr">147 </span> <span class="Normal">delete</span> curr_stream<span class="Delimiter">;</span> <span id="L148" class="LineNr">148 </span> curr_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span> -<span id="L149" class="LineNr">149 </span> curr_label<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L149" class="LineNr">149 </span> curr_label<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L150" class="LineNr">150 </span> curr_depth = Max_depth<span class="Delimiter">;</span> <span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span> <span id="L152" class="LineNr">152 </span> -<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> +<span id="L153" class="LineNr">153 </span>string trace_stream::<a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L154" class="LineNr">154 </span> ostringstream output<span class="Delimiter">;</span> -<span id="L155" class="LineNr">155 </span> label = trim<span class="Delimiter">(</span>label<span class="Delimiter">);</span> -<span id="L156" class="LineNr">156 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::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 id="L155" class="LineNr">155 </span> label = <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>label<span class="Delimiter">);</span> +<span id="L156" class="LineNr">156 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <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">-></span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L158" class="LineNr">158 </span> output << std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> << p<span class="Delimiter">-></span>depth << <span class="Constant">' '</span> << p<span class="Delimiter">-></span>label << <span class="Constant">": "</span> << p<span class="Delimiter">-></span>contents << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L159" class="LineNr">159 </span> <span class="Delimiter">}</span> @@ -240,19 +240,19 @@ if ('onhashchange' in window) { <span id="L183" class="LineNr">183 </span><span class="Comment">// Inside tests, fail any tests that displayed (unexpected) errors.</span> <span id="L184" class="LineNr">184 </span><span class="Comment">// Expected errors in tests should always be hidden and silently checked for.</span> <span id="L185" class="LineNr">185 </span><span class="Delimiter">:(before "End Test Teardown")</span> -<span id="L186" class="LineNr">186 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed && !Hide_errors && trace_contains_errors<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L186" class="LineNr">186 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed && !Hide_errors && <a href='003trace.cc.html#L190'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L187" class="LineNr">187 </span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span> <span id="L189" class="LineNr">189 </span><span class="Delimiter">:(code)</span> -<span id="L190" class="LineNr">190 </span><span class="Normal">bool</span> trace_contains_errors<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L190" class="LineNr">190 </span><span class="Normal">bool</span> <a href='003trace.cc.html#L190'>trace_contains_errors</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L191" class="LineNr">191 </span> <span class="Identifier">return</span> Trace_errors > <span class="Constant">0</span> || trace_count<span class="Delimiter">(</span><span class="Constant">"error"</span><span class="Delimiter">)</span> > <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L192" class="LineNr">192 </span><span class="Delimiter">}</span> <span id="L193" class="LineNr">193 </span> <span id="L194" class="LineNr">194 </span><span class="Delimiter">:(before "End Types")</span> -<span id="L195" class="LineNr">195 </span><span class="Normal">struct</span> end <span class="Delimiter">{};</span> +<span id="L195" class="LineNr">195 </span><span class="Normal">struct</span> <a href='003trace.cc.html#L195'>end</a> <span class="Delimiter">{};</span> <span id="L196" class="LineNr">196 </span><span class="Delimiter">:(code)</span> -<span id="L197" class="LineNr">197 </span>ostream& <span class="Normal">operator</span><<<span class="Delimiter">(</span>ostream& os<span class="Delimiter">,</span> unused end<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">-></span>newline<span class="Delimiter">();</span> +<span id="L197" class="LineNr">197 </span>ostream& <span class="Normal">operator</span><<<span class="Delimiter">(</span>ostream& os<span class="Delimiter">,</span> <a href='001help.cc.html#L255'>unused</a> <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> <span id="L199" class="LineNr">199 </span> <span class="Identifier">return</span> os<span class="Delimiter">;</span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">}</span> <span id="L201" class="LineNr">201 </span> @@ -263,15 +263,15 @@ if ('onhashchange' in window) { <span id="L206" class="LineNr">206 </span><span class="Delimiter">:(before "End Types")</span> <span id="L207" class="LineNr">207 </span><span class="Normal">struct</span> lease_tracer <span class="Delimiter">{</span> <span id="L208" class="LineNr">208 </span> lease_tracer<span class="Delimiter">();</span> -<span id="L209" class="LineNr">209 </span> ~lease_tracer<span class="Delimiter">();</span> +<span id="L209" class="LineNr">209 </span> <a href='003trace.cc.html#L213'>~lease_tracer</a><span class="Delimiter">();</span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">};</span> <span id="L211" class="LineNr">211 </span><span class="Delimiter">:(code)</span> <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> -<span id="L213" class="LineNr">213 </span>lease_tracer::~lease_tracer<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L213" class="LineNr">213 </span>lease_tracer::<a href='003trace.cc.html#L213'>~lease_tracer</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> <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> <span id="L216" class="LineNr">216 </span> ofstream fout<span class="Delimiter">(</span><span class="Constant">"last_trace"</span><span class="Delimiter">);</span> -<span id="L217" class="LineNr">217 </span> fout << Trace_stream<span class="Delimiter">-></span>readable_contents<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L217" class="LineNr">217 </span> fout << Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> <span id="L218" class="LineNr">218 </span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> <span id="L219" class="LineNr">219 </span> <span class="Delimiter">}</span> <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> @@ -279,7 +279,7 @@ if ('onhashchange' in window) { <span id="L222" class="LineNr">222 </span><span class="Delimiter">:(before "End Includes")</span> <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> <span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before "End Test Setup")</span> -<span id="L225" class="LineNr">225 </span>START_TRACING_UNTIL_END_OF_SCOPE +<span id="L225" class="LineNr">225 </span><a href='003trace.cc.html#L223'>START_TRACING_UNTIL_END_OF_SCOPE</a> <span id="L226" class="LineNr">226 </span> <span id="L227" class="LineNr">227 </span><span class="Delimiter">:(before "End Includes")</span> <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> @@ -305,55 +305,55 @@ if ('onhashchange' in window) { <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> <span id="L249" class="LineNr">249 </span> <span id="L250" class="LineNr">250 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L251" class="LineNr">251 </span><span class="Normal">bool</span> <a href='003trace.cc.html#L251'>check_trace_contents</a><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 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> <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> -<span id="L254" class="LineNr">254 </span> vector<string> expected_lines = split<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">"^D"</span><span class="Delimiter">);</span> +<span id="L254" class="LineNr">254 </span> vector<string> expected_lines = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">"^D"</span><span class="Delimiter">);</span> <span id="L255" class="LineNr">255 </span> <span class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L256" class="LineNr">256 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line < SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> && expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span> +<span id="L256" class="LineNr">256 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> && expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span> <span id="L257" class="LineNr">257 </span> ++curr_expected_line<span class="Delimiter">;</span> -<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> +<span id="L258" class="LineNr">258 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L259" class="LineNr">259 </span> string label<span class="Delimiter">,</span> contents<span class="Delimiter">;</span> -<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> &label<span class="Delimiter">,</span> &contents<span class="Delimiter">);</span> -<span id="L261" class="LineNr">261 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L260" class="LineNr">260 </span> <a href='003trace.cc.html#L283'>split_label_contents</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">),</span> &label<span class="Delimiter">,</span> &contents<span class="Delimiter">);</span> +<span id="L261" class="LineNr">261 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L262" class="LineNr">262 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>label != p<span class="Delimiter">-></span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L263" class="LineNr">263 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contents != trim<span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L263" class="LineNr">263 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contents != <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L264" class="LineNr">264 </span> ++curr_expected_line<span class="Delimiter">;</span> -<span id="L265" class="LineNr">265 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line < SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> && expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span> +<span id="L265" class="LineNr">265 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>curr_expected_line < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">)</span> && expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>empty<span class="Delimiter">())</span> <span id="L266" class="LineNr">266 </span> ++curr_expected_line<span class="Delimiter">;</span> -<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> -<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> &label<span class="Delimiter">,</span> &contents<span class="Delimiter">);</span> +<span id="L267" class="LineNr">267 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L268" class="LineNr">268 </span> <a href='003trace.cc.html#L283'>split_label_contents</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">),</span> &label<span class="Delimiter">,</span> &contents<span class="Delimiter">);</span> <span id="L269" class="LineNr">269 </span> <span class="Delimiter">}</span> <span id="L270" class="LineNr">270 </span> -<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> -<span id="L272" class="LineNr">272 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << FUNCTION << <span class="Constant">"("</span> << <span class="Normal">FILE</span> << <span class="Constant">":"</span> << LINE << <span class="Constant">"): line ["</span> << label << <span class="Constant">": "</span> << contents << <span class="Constant">"] out of order in trace:</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L273" class="LineNr">273 </span> DUMP<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L271" class="LineNr">271 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L296'>line_exists_anywhere</a><span class="Delimiter">(</span>label<span class="Delimiter">,</span> contents<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L272" class="LineNr">272 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << FUNCTION << <span class="Constant">"("</span> << <span class="Normal">FILE</span> << <span class="Constant">":"</span> << LINE << <span class="Constant">"): line ["</span> << label << <span class="Constant">": "</span> << contents << <span class="Constant">"] out of order in <a href='003trace.cc.html#L171'>trace</a>:</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> +<span id="L273" class="LineNr">273 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> <span id="L274" class="LineNr">274 </span> <span class="Delimiter">}</span> <span id="L275" class="LineNr">275 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L276" class="LineNr">276 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << FUNCTION << <span class="Constant">"("</span> << <span class="Normal">FILE</span> << <span class="Constant">":"</span> << LINE << <span class="Constant">"): missing ["</span> << contents << <span class="Constant">"] in trace:</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L277" class="LineNr">277 </span> DUMP<span class="Delimiter">(</span>label<span class="Delimiter">);</span> +<span id="L276" class="LineNr">276 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << FUNCTION << <span class="Constant">"("</span> << <span class="Normal">FILE</span> << <span class="Constant">":"</span> << LINE << <span class="Constant">"): missing ["</span> << contents << <span class="Constant">"] in <a href='003trace.cc.html#L171'>trace</a>:</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> +<span id="L277" class="LineNr">277 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>label<span class="Delimiter">);</span> <span id="L278" class="LineNr">278 </span> <span class="Delimiter">}</span> <span id="L279" class="LineNr">279 </span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L280" class="LineNr">280 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L281" class="LineNr">281 </span><span class="Delimiter">}</span> <span id="L282" class="LineNr">282 </span> -<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& s<span class="Delimiter">,</span> string* label<span class="Delimiter">,</span> string* contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L283" class="LineNr">283 </span><span class="Normal">void</span> <a href='003trace.cc.html#L283'>split_label_contents</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">,</span> string* label<span class="Delimiter">,</span> string* contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">": "</span><span class="Delimiter">);</span> <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> <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> <span id="L287" class="LineNr">287 </span> *label = <span class="Constant">""</span><span class="Delimiter">;</span> -<span id="L288" class="LineNr">288 </span> *contents = trim<span class="Delimiter">(</span>s<span class="Delimiter">);</span> +<span id="L288" class="LineNr">288 </span> *contents = <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>s<span class="Delimiter">);</span> <span id="L289" class="LineNr">289 </span> <span class="Delimiter">}</span> <span id="L290" class="LineNr">290 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<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> -<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> +<span id="L291" class="LineNr">291 </span> *label = <a href='003trace.cc.html#L365'>trim</a><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> +<span id="L292" class="LineNr">292 </span> *contents = <a href='003trace.cc.html#L365'>trim</a><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 id="L293" class="LineNr">293 </span> <span class="Delimiter">}</span> <span id="L294" class="LineNr">294 </span><span class="Delimiter">}</span> <span id="L295" class="LineNr">295 </span> -<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& label<span class="Delimiter">,</span> <span class="Normal">const</span> string& contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L297" class="LineNr">297 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L296" class="LineNr">296 </span><span class="Normal">bool</span> <a href='003trace.cc.html#L296'>line_exists_anywhere</a><span class="Delimiter">(</span><span class="Normal">const</span> string& label<span class="Delimiter">,</span> <span class="Normal">const</span> string& contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L297" class="LineNr">297 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>label != p<span class="Delimiter">-></span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L299" class="LineNr">299 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contents == trim<span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L299" class="LineNr">299 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contents == <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L300" class="LineNr">300 </span> <span class="Delimiter">}</span> <span id="L301" class="LineNr">301 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L302" class="LineNr">302 </span><span class="Delimiter">}</span> @@ -365,21 +365,21 @@ if ('onhashchange' in window) { <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> <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> <span id="L310" class="LineNr">310 </span> <span class="Normal">long</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L311" class="LineNr">311 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L311" class="LineNr">311 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L312" class="LineNr">312 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>label == p<span class="Delimiter">-></span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L313" class="LineNr">313 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>line == <span class="Constant">""</span> || trim<span class="Delimiter">(</span>line<span class="Delimiter">)</span> == trim<span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> +<span id="L313" class="LineNr">313 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>line == <span class="Constant">""</span> || <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>line<span class="Delimiter">)</span> == <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span id="L314" class="LineNr">314 </span> ++result<span class="Delimiter">;</span> <span id="L315" class="LineNr">315 </span> <span class="Delimiter">}</span> <span id="L316" class="LineNr">316 </span> <span class="Delimiter">}</span> <span id="L317" class="LineNr">317 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L318" class="LineNr">318 </span><span class="Delimiter">}</span> <span id="L319" class="LineNr">319 </span> -<span id="L320" class="LineNr">320 </span><span class="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 id="L320" class="LineNr">320 </span><span class="Normal">int</span> <a href='003trace.cc.html#L320'>trace_count_prefix</a><span class="Delimiter">(</span>string label<span class="Delimiter">,</span> string prefix<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L322" class="LineNr">322 </span> <span class="Normal">long</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L323" class="LineNr">323 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L323" class="LineNr">323 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L324" class="LineNr">324 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>label == p<span class="Delimiter">-></span>label<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">-></span>contents<span class="Delimiter">),</span> trim<span class="Delimiter">(</span>prefix<span class="Delimiter">)))</span> +<span id="L325" class="LineNr">325 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">),</span> <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>prefix<span class="Delimiter">)))</span> <span id="L326" class="LineNr">326 </span> ++result<span class="Delimiter">;</span> <span id="L327" class="LineNr">327 </span> <span class="Delimiter">}</span> <span id="L328" class="LineNr">328 </span> <span class="Delimiter">}</span> @@ -391,41 +391,41 @@ if ('onhashchange' in window) { <span id="L334" class="LineNr">334 </span><span class="Delimiter">}</span> <span id="L335" class="LineNr">335 </span> <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> -<span id="L337" class="LineNr">337 </span> vector<string> tmp = split_first<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">": "</span><span class="Delimiter">);</span> +<span id="L337" class="LineNr">337 </span> vector<string> tmp = <a href='003trace.cc.html#L356'>split_first</a><span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">": "</span><span class="Delimiter">);</span> <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> <span id="L339" class="LineNr">339 </span><span class="Delimiter">}</span> <span id="L340" class="LineNr">340 </span> -<span id="L341" class="LineNr">341 </span>vector<string> split<span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L341" class="LineNr">341 </span>vector<string> <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L342" class="LineNr">342 </span> vector<string> result<span class="Delimiter">;</span> <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> <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> -<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> +<span id="L345" class="LineNr">345 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L195'>end</a> == string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L347" class="LineNr">347 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L348" class="LineNr">348 </span> <span class="Delimiter">}</span> <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> <span id="L350" class="LineNr">350 </span> begin = end+SIZE<span class="Delimiter">(</span>delim<span class="Delimiter">);</span> -<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> +<span id="L351" class="LineNr">351 </span> <a href='003trace.cc.html#L195'>end</a> = s<span class="Delimiter">.</span>find<span class="Delimiter">(</span>delim<span class="Delimiter">,</span> begin<span class="Delimiter">);</span> <span id="L352" class="LineNr">352 </span> <span class="Delimiter">}</span> <span id="L353" class="LineNr">353 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L354" class="LineNr">354 </span><span class="Delimiter">}</span> <span id="L355" class="LineNr">355 </span> -<span id="L356" class="LineNr">356 </span>vector<string> split_first<span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L356" class="LineNr">356 </span>vector<string> <a href='003trace.cc.html#L356'>split_first</a><span class="Delimiter">(</span>string s<span class="Delimiter">,</span> string delim<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L357" class="LineNr">357 </span> vector<string> result<span class="Delimiter">;</span> <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> -<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> -<span id="L360" class="LineNr">360 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>end != string::npos<span class="Delimiter">)</span> +<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> <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">));</span> +<span id="L360" class="LineNr">360 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L195'>end</a> != string::npos<span class="Delimiter">)</span> <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> <span id="L362" class="LineNr">362 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span> <span id="L364" class="LineNr">364 </span> -<span id="L365" class="LineNr">365 </span>string trim<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L365" class="LineNr">365 </span>string <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L366" class="LineNr">366 </span> string::const_iterator first = s<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> -<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> && isspace<span class="Delimiter">(</span>*first<span class="Delimiter">))</span> +<span id="L367" class="LineNr">367 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>first != s<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()</span> && isspace<span class="Delimiter">(</span>*first<span class="Delimiter">))</span> <span id="L368" class="LineNr">368 </span> ++first<span class="Delimiter">;</span> -<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">""</span><span class="Delimiter">;</span> +<span id="L369" class="LineNr">369 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>first == s<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">""</span><span class="Delimiter">;</span> <span id="L370" class="LineNr">370 </span> -<span id="L371" class="LineNr">371 </span> string::const_iterator last = --s<span class="Delimiter">.</span>end<span class="Delimiter">();</span> +<span id="L371" class="LineNr">371 </span> string::const_iterator last = --s<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> && isspace<span class="Delimiter">(</span>*last<span class="Delimiter">))</span> <span id="L373" class="LineNr">373 </span> --last<span class="Delimiter">;</span> <span id="L374" class="LineNr">374 </span> ++last<span class="Delimiter">;</span> diff --git a/html/003trace.test.cc.html b/html/003trace.test.cc.html index 549f6859..e64cf44e 100644 --- a/html/003trace.test.cc.html +++ b/html/003trace.test.cc.html @@ -53,68 +53,68 @@ if ('onhashchange' in window) { </head> <body onload='JumpToLine();'> <pre id='vimCodeElement'> -<span id="L1" class="LineNr"> 1 </span><span class="Normal">void</span> test_trace_check_compares<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L2" class="LineNr"> 2 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L3" class="LineNr"> 3 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"test layer: foo"</span><span class="Delimiter">);</span> +<span id="L1" class="LineNr"> 1 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L1'>test_trace_check_compares</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L2" class="LineNr"> 2 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L3" class="LineNr"> 3 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"test layer: foo"</span><span class="Delimiter">);</span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">}</span> <span id="L5" class="LineNr"> 5 </span> -<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> -<span id="L7" class="LineNr"> 7 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L8" class="LineNr"> 8 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 2"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << end<span class="Delimiter">();</span> -<span id="L9" class="LineNr"> 9 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> -<span id="L10" class="LineNr"> 10 </span> CHECK_TRACE_DOESNT_CONTAIN<span class="Delimiter">(</span><span class="Constant">"test layer 2: foo"</span><span class="Delimiter">);</span> +<span id="L6" class="LineNr"> 6 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L6'>test_trace_check_ignores_other_layers</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L7" class="LineNr"> 7 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L8" class="LineNr"> 8 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 2"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> +<span id="L10" class="LineNr"> 10 </span> <a href='003trace.cc.html#L248'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">"test layer 2: foo"</span><span class="Delimiter">);</span> <span id="L11" class="LineNr"> 11 </span><span class="Delimiter">}</span> <span id="L12" class="LineNr"> 12 </span> -<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> -<span id="L14" class="LineNr"> 14 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">" foo"</span> << end<span class="Delimiter">();</span> -<span id="L15" class="LineNr"> 15 </span> CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too little whitespace</span><span class="Comment">*/</span><span class="Constant">"foo"</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> -<span id="L16" class="LineNr"> 16 </span> CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too much whitespace</span><span class="Comment">*/</span><span class="Constant">" foo"</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L13" class="LineNr"> 13 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L13'>test_trace_check_ignores_leading_whitespace</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L14" class="LineNr"> 14 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">" foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L15" class="LineNr"> 15 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too little whitespace</span><span class="Comment">*/</span><span class="Constant">"foo"</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L16" class="LineNr"> 16 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">too much whitespace</span><span class="Comment">*/</span><span class="Constant">" foo"</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L17" class="LineNr"> 17 </span><span class="Delimiter">}</span> <span id="L18" class="LineNr"> 18 </span> -<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> -<span id="L20" class="LineNr"> 20 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L21" class="LineNr"> 21 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << end<span class="Delimiter">();</span> -<span id="L22" class="LineNr"> 22 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> +<span id="L19" class="LineNr"> 19 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L19'>test_trace_check_ignores_other_lines</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L20" class="LineNr"> 20 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L21" class="LineNr"> 21 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L22" class="LineNr"> 22 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> <span id="L23" class="LineNr"> 23 </span><span class="Delimiter">}</span> <span id="L24" class="LineNr"> 24 </span> -<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> -<span id="L26" class="LineNr"> 26 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L27" class="LineNr"> 27 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << end<span class="Delimiter">();</span> -<span id="L28" class="LineNr"> 28 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"test layer 1: bar"</span><span class="Delimiter">);</span> +<span id="L25" class="LineNr"> 25 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L25'>test_trace_check_ignores_other_lines2</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L26" class="LineNr"> 26 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L27" class="LineNr"> 27 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"test layer 1: bar"</span><span class="Delimiter">);</span> <span id="L29" class="LineNr"> 29 </span><span class="Delimiter">}</span> <span id="L30" class="LineNr"> 30 </span> -<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> -<span id="L32" class="LineNr"> 32 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L33" class="LineNr"> 33 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> +<span id="L31" class="LineNr"> 31 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L31'>test_trace_ignores_trailing_whitespace</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L33" class="LineNr"> 33 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> <span id="L34" class="LineNr"> 34 </span><span class="Delimiter">}</span> <span id="L35" class="LineNr"> 35 </span> -<span id="L36" class="LineNr"> 36 </span><span class="Normal">void</span> test_trace_ignores_trailing_whitespace2<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L37" class="LineNr"> 37 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo "</span> << end<span class="Delimiter">();</span> -<span id="L38" class="LineNr"> 38 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> +<span id="L36" class="LineNr"> 36 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L36'>test_trace_ignores_trailing_whitespace2</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L37" class="LineNr"> 37 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo "</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L38" class="LineNr"> 38 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"test layer 1: foo"</span><span class="Delimiter">);</span> <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">}</span> <span id="L40" class="LineNr"> 40 </span> -<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> -<span id="L42" class="LineNr"> 42 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L43" class="LineNr"> 43 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 2"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << end<span class="Delimiter">();</span> -<span id="L44" class="LineNr"> 44 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"qux"</span> << end<span class="Delimiter">();</span> -<span id="L45" class="LineNr"> 45 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"test layer 1: foo^Dtest layer 2: bar^Dtest layer 1: qux^D"</span><span class="Delimiter">);</span> +<span id="L41" class="LineNr"> 41 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L41'>test_trace_orders_across_layers</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L43" class="LineNr"> 43 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 2"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L44" class="LineNr"> 44 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"qux"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"test layer 1: foo^Dtest layer 2: bar^Dtest layer 1: qux^D"</span><span class="Delimiter">);</span> <span id="L46" class="LineNr"> 46 </span><span class="Delimiter">}</span> <span id="L47" class="LineNr"> 47 </span> -<span id="L48" class="LineNr"> 48 </span><span class="Normal">void</span> test_trace_supports_count<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L49" class="LineNr"> 49 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L50" class="LineNr"> 50 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L51" class="LineNr"> 51 </span> CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Constant">"foo"</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L48" class="LineNr"> 48 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L48'>test_trace_supports_count</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L49" class="LineNr"> 49 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L50" class="LineNr"> 50 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L51" class="LineNr"> 51 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Constant">"foo"</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L52" class="LineNr"> 52 </span><span class="Delimiter">}</span> <span id="L53" class="LineNr"> 53 </span> -<span id="L54" class="LineNr"> 54 </span><span class="Normal">void</span> test_trace_supports_count2<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L55" class="LineNr"> 55 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << end<span class="Delimiter">();</span> -<span id="L56" class="LineNr"> 56 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << end<span class="Delimiter">();</span> -<span id="L57" class="LineNr"> 57 </span> CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L54" class="LineNr"> 54 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L54'>test_trace_supports_count2</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L56" class="LineNr"> 56 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"bar"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L57" class="LineNr"> 57 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L58" class="LineNr"> 58 </span><span class="Delimiter">}</span> <span id="L59" class="LineNr"> 59 </span> -<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> -<span id="L61" class="LineNr"> 61 </span> trace<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L62" class="LineNr"> 62 </span> CHECK_EQ<span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Constant">"foo"</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L60" class="LineNr"> 60 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L60'>test_trace_count_ignores_trailing_whitespace</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">)</span> << <span class="Constant">"foo</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L62" class="LineNr"> 62 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span><span class="Constant">"test layer 1"</span><span class="Delimiter">,</span> <span class="Constant">"foo"</span><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L63" class="LineNr"> 63 </span><span class="Delimiter">}</span> <span id="L64" class="LineNr"> 64 </span> <span id="L65" class="LineNr"> 65 </span><span class="Comment">// pending: DUMP tests</span> @@ -127,55 +127,55 @@ if ('onhashchange' in window) { <span id="L72" class="LineNr"> 72 </span> <span id="L73" class="LineNr"> 73 </span><span class="Comment">// can't check trace because trace methods call 'split'</span> <span id="L74" class="LineNr"> 74 </span> -<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> -<span id="L76" class="LineNr"> 76 </span> vector<string> result = split<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> -<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> -<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">""</span><span class="Delimiter">);</span> +<span id="L75" class="LineNr"> 75 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L75'>test_split_returns_at_least_one_elem</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L76" class="LineNr"> 76 </span> vector<string> result = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> +<span id="L77" class="LineNr"> 77 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L78" class="LineNr"> 78 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">""</span><span class="Delimiter">);</span> <span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span> <span id="L80" class="LineNr"> 80 </span> -<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> -<span id="L82" class="LineNr"> 82 </span> vector<string> result = split<span class="Delimiter">(</span><span class="Constant">"abc"</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> -<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> -<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">"abc"</span><span class="Delimiter">);</span> +<span id="L81" class="LineNr"> 81 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L81'>test_split_returns_entire_input_when_no_delim</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L82" class="LineNr"> 82 </span> vector<string> result = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span><span class="Constant">"abc"</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> +<span id="L83" class="LineNr"> 83 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L84" class="LineNr"> 84 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"abc"</span><span class="Delimiter">);</span> <span id="L85" class="LineNr"> 85 </span><span class="Delimiter">}</span> <span id="L86" class="LineNr"> 86 </span> -<span id="L87" class="LineNr"> 87 </span><span class="Normal">void</span> test_split_works<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L88" class="LineNr"> 88 </span> vector<string> result = split<span class="Delimiter">(</span><span class="Constant">"abc,def"</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> -<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> -<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">"abc"</span><span class="Delimiter">);</span> -<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">"def"</span><span class="Delimiter">);</span> +<span id="L87" class="LineNr"> 87 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L87'>test_split_works</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L88" class="LineNr"> 88 </span> vector<string> result = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span><span class="Constant">"abc,def"</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> +<span id="L89" class="LineNr"> 89 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L90" class="LineNr"> 90 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"abc"</span><span class="Delimiter">);</span> +<span id="L91" class="LineNr"> 91 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"def"</span><span class="Delimiter">);</span> <span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span> <span id="L93" class="LineNr"> 93 </span> -<span id="L94" class="LineNr"> 94 </span><span class="Normal">void</span> test_split_works2<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L95" class="LineNr"> 95 </span> vector<string> result = split<span class="Delimiter">(</span><span class="Constant">"abc,def,ghi"</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> -<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> -<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">"abc"</span><span class="Delimiter">);</span> -<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">"def"</span><span class="Delimiter">);</span> -<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">"ghi"</span><span class="Delimiter">);</span> +<span id="L94" class="LineNr"> 94 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L94'>test_split_works2</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L95" class="LineNr"> 95 </span> vector<string> result = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span><span class="Constant">"abc,def,ghi"</span><span class="Delimiter">,</span> <span class="Constant">","</span><span class="Delimiter">);</span> +<span id="L96" class="LineNr"> 96 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">3</span><span class="Delimiter">);</span> +<span id="L97" class="LineNr"> 97 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"abc"</span><span class="Delimiter">);</span> +<span id="L98" class="LineNr"> 98 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"def"</span><span class="Delimiter">);</span> +<span id="L99" class="LineNr"> 99 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"ghi"</span><span class="Delimiter">);</span> <span id="L100" class="LineNr">100 </span><span class="Delimiter">}</span> <span id="L101" class="LineNr">101 </span> -<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> -<span id="L103" class="LineNr">103 </span> vector<string> result = split<span class="Delimiter">(</span><span class="Constant">"abc,,def,,ghi"</span><span class="Delimiter">,</span> <span class="Constant">",,"</span><span class="Delimiter">);</span> -<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> -<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">"abc"</span><span class="Delimiter">);</span> -<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">"def"</span><span class="Delimiter">);</span> -<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">"ghi"</span><span class="Delimiter">);</span> +<span id="L102" class="LineNr">102 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L102'>test_split_handles_multichar_delim</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L103" class="LineNr">103 </span> vector<string> result = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span><span class="Constant">"abc,,def,,ghi"</span><span class="Delimiter">,</span> <span class="Constant">",,"</span><span class="Delimiter">);</span> +<span id="L104" class="LineNr">104 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>size<span class="Delimiter">(),</span> <span class="Constant">3</span><span class="Delimiter">);</span> +<span id="L105" class="LineNr">105 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"abc"</span><span class="Delimiter">);</span> +<span id="L106" class="LineNr">106 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"def"</span><span class="Delimiter">);</span> +<span id="L107" class="LineNr">107 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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">"ghi"</span><span class="Delimiter">);</span> <span id="L108" class="LineNr">108 </span><span class="Delimiter">}</span> <span id="L109" class="LineNr">109 </span> -<span id="L110" class="LineNr">110 </span><span class="Normal">void</span> test_trim<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L111" class="LineNr">111 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<span id="L112" class="LineNr">112 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" "</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<span id="L113" class="LineNr">113 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" "</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<span id="L114" class="LineNr">114 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">"a"</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L115" class="LineNr">115 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" a"</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L116" class="LineNr">116 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" a"</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L117" class="LineNr">117 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" ab"</span><span class="Delimiter">),</span> <span class="Constant">"ab"</span><span class="Delimiter">);</span> -<span id="L118" class="LineNr">118 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">"a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L119" class="LineNr">119 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">"a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L120" class="LineNr">120 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">"ab "</span><span class="Delimiter">),</span> <span class="Constant">"ab"</span><span class="Delimiter">);</span> -<span id="L121" class="LineNr">121 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L122" class="LineNr">122 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L123" class="LineNr">123 </span> CHECK_EQ<span class="Delimiter">(</span>trim<span class="Delimiter">(</span><span class="Constant">" ab "</span><span class="Delimiter">),</span> <span class="Constant">"ab"</span><span class="Delimiter">);</span> +<span id="L110" class="LineNr">110 </span><span class="Normal">void</span> <a href='003trace.test.cc.html#L110'>test_trim</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L111" class="LineNr">111 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L112" class="LineNr">112 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" "</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L113" class="LineNr">113 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" "</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L114" class="LineNr">114 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">"a"</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L115" class="LineNr">115 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" a"</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L116" class="LineNr">116 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" a"</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L117" class="LineNr">117 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" ab"</span><span class="Delimiter">),</span> <span class="Constant">"ab"</span><span class="Delimiter">);</span> +<span id="L118" class="LineNr">118 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">"a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L119" class="LineNr">119 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">"a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L120" class="LineNr">120 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">"ab "</span><span class="Delimiter">),</span> <span class="Constant">"ab"</span><span class="Delimiter">);</span> +<span id="L121" class="LineNr">121 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L122" class="LineNr">122 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" a "</span><span class="Delimiter">),</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L123" class="LineNr">123 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><span class="Constant">" ab "</span><span class="Delimiter">),</span> <span class="Constant">"ab"</span><span class="Delimiter">);</span> <span id="L124" class="LineNr">124 </span><span class="Delimiter">}</span> </pre> </body> diff --git a/html/010vm.cc.html b/html/010vm.cc.html index 0d7623b2..6e49a61f 100644 --- a/html/010vm.cc.html +++ b/html/010vm.cc.html @@ -64,23 +64,23 @@ if ('onhashchange' in window) { <span id="L4" class="LineNr"> 4 </span>map<recipe_ordinal<span class="Delimiter">,</span> recipe> Recipe<span class="Delimiter">;</span> <span id="L5" class="LineNr"> 5 </span><span class="Comment">//: You can also refer to each recipe by its name.</span> <span id="L6" class="LineNr"> 6 </span>map<string<span class="Delimiter">,</span> recipe_ordinal> Recipe_ordinal<span class="Delimiter">;</span> -<span id="L7" class="LineNr"> 7 </span>recipe_ordinal Next_recipe_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> +<span id="L7" class="LineNr"> 7 </span><a href='010vm.cc.html#L14'>recipe_ordinal</a> Next_recipe_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L8" class="LineNr"> 8 </span> <span id="L9" class="LineNr"> 9 </span><span class="Comment">//: Ordinals are like numbers, except you can't do arithmetic on them. Ordinal</span> <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> <span id="L11" class="LineNr"> 11 </span><span class="Comment">//: adding two phone numbers is meaningless. Here each recipe does something</span> <span id="L12" class="LineNr"> 12 </span><span class="Comment">//: incommensurable with any other recipe.</span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(after "Types")</span> -<span id="L14" class="LineNr"> 14 </span><span class="Normal">typedef</span> <span class="Normal">int</span> recipe_ordinal<span class="Delimiter">;</span> +<span id="L14" class="LineNr"> 14 </span><span class="Normal">typedef</span> <span class="Normal">int</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a><span class="Delimiter">;</span> <span id="L15" class="LineNr"> 15 </span> <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Types")</span> <span id="L17" class="LineNr"> 17 </span><span class="Comment">// Recipes are lists of instructions. To perform or 'run' a recipe, the</span> <span id="L18" class="LineNr"> 18 </span><span class="Comment">// computer runs its instructions.</span> -<span id="L19" class="LineNr"> 19 </span><span class="Normal">struct</span> recipe <span class="Delimiter">{</span> +<span id="L19" class="LineNr"> 19 </span><span class="Normal">struct</span> <a href='010vm.cc.html#L19'>recipe</a> <span class="Delimiter">{</span> <span id="L20" class="LineNr"> 20 </span> string name<span class="Delimiter">;</span> <span id="L21" class="LineNr"> 21 </span> vector<instruction> steps<span class="Delimiter">;</span> <span id="L22" class="LineNr"> 22 </span> <span class="Comment">// End recipe Fields</span> -<span id="L23" class="LineNr"> 23 </span> recipe<span class="Delimiter">();</span> +<span id="L23" class="LineNr"> 23 </span> <a href='010vm.cc.html#L19'>recipe</a><span class="Delimiter">();</span> <span id="L24" class="LineNr"> 24 </span><span class="Delimiter">};</span> <span id="L25" class="LineNr"> 25 </span> <span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(before "struct recipe")</span> @@ -89,18 +89,18 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr"> 29 </span><span class="Comment">// or just a single 'label' starting with a non-alphanumeric character</span> <span id="L30" class="LineNr"> 30 </span><span class="Comment">// +label</span> <span id="L31" class="LineNr"> 31 </span><span class="Comment">// Labels don't do anything, they're just named locations in a recipe.</span> -<span id="L32" class="LineNr"> 32 </span><span class="Normal">struct</span> instruction <span class="Delimiter">{</span> +<span id="L32" class="LineNr"> 32 </span><span class="Normal">struct</span> <a href='010vm.cc.html#L32'>instruction</a> <span class="Delimiter">{</span> <span id="L33" class="LineNr"> 33 </span> <span class="Normal">bool</span> is_label<span class="Delimiter">;</span> <span id="L34" class="LineNr"> 34 </span> string label<span class="Delimiter">;</span> <span class="Comment">// only if is_label</span> <span id="L35" class="LineNr"> 35 </span> string name<span class="Delimiter">;</span> <span class="Comment">// only if !is_label</span> <span id="L36" class="LineNr"> 36 </span> string old_name<span class="Delimiter">;</span> <span class="Comment">// before our automatic rewrite rules</span> <span id="L37" class="LineNr"> 37 </span> string original_string<span class="Delimiter">;</span> <span class="Comment">// for error messages</span> -<span id="L38" class="LineNr"> 38 </span> recipe_ordinal operation<span class="Delimiter">;</span> <span class="Comment">// get(Recipe_ordinal, name)</span> +<span id="L38" class="LineNr"> 38 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> operation<span class="Delimiter">;</span> <span class="Comment">// get(Recipe_ordinal, name)</span> <span id="L39" class="LineNr"> 39 </span> vector<reagent> ingredients<span class="Delimiter">;</span> <span class="Comment">// only if !is_label</span> <span id="L40" class="LineNr"> 40 </span> vector<reagent> products<span class="Delimiter">;</span> <span class="Comment">// only if !is_label</span> <span id="L41" class="LineNr"> 41 </span> <span class="Comment">// End instruction Fields</span> -<span id="L42" class="LineNr"> 42 </span> instruction<span class="Delimiter">();</span> -<span id="L43" class="LineNr"> 43 </span> <span class="Normal">void</span> clear<span class="Delimiter">();</span> +<span id="L42" class="LineNr"> 42 </span> <a href='010vm.cc.html#L32'>instruction</a><span class="Delimiter">();</span> +<span id="L43" class="LineNr"> 43 </span> <span class="Normal">void</span> <a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L44" class="LineNr"> 44 </span> <span class="Normal">bool</span> is_empty<span class="Delimiter">();</span> <span id="L45" class="LineNr"> 45 </span><span class="Delimiter">};</span> <span id="L46" class="LineNr"> 46 </span> @@ -120,10 +120,10 @@ if ('onhashchange' in window) { <span id="L60" class="LineNr"> 60 </span> reagent<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">);</span> <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> <span id="L62" class="LineNr"> 62 </span> ~reagent<span class="Delimiter">();</span> -<span id="L63" class="LineNr"> 63 </span> <span class="Normal">void</span> clear<span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <span class="Normal">void</span> <a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L64" class="LineNr"> 64 </span> reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent& original<span class="Delimiter">);</span> <span id="L65" class="LineNr"> 65 </span> reagent& <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> reagent& original<span class="Delimiter">);</span> -<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> +<span id="L66" class="LineNr"> 66 </span> <span class="Normal">void</span> <a href='010vm.cc.html#L66'>set_value</a><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 id="L67" class="LineNr"> 67 </span><span class="Delimiter">};</span> <span id="L68" class="LineNr"> 68 </span> <span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(before "struct reagent")</span> @@ -132,14 +132,14 @@ if ('onhashchange' in window) { <span id="L72" class="LineNr"> 72 </span><span class="Normal">struct</span> type_tree <span class="Delimiter">{</span> <span id="L73" class="LineNr"> 73 </span> <span class="Normal">bool</span> atom<span class="Delimiter">;</span> <span id="L74" class="LineNr"> 74 </span> string name<span class="Delimiter">;</span> <span class="Comment">// only if atom</span> -<span id="L75" class="LineNr"> 75 </span> type_ordinal value<span class="Delimiter">;</span> <span class="Comment">// only if atom</span> +<span id="L75" class="LineNr"> 75 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> value<span class="Delimiter">;</span> <span class="Comment">// only if atom</span> <span id="L76" class="LineNr"> 76 </span> type_tree* left<span class="Delimiter">;</span> <span class="Comment">// only if !atom</span> <span id="L77" class="LineNr"> 77 </span> type_tree* right<span class="Delimiter">;</span> <span class="Comment">// only if !atom</span> <span id="L78" class="LineNr"> 78 </span> ~type_tree<span class="Delimiter">();</span> <span id="L79" class="LineNr"> 79 </span> type_tree<span class="Delimiter">(</span><span class="Normal">const</span> type_tree& original<span class="Delimiter">);</span> <span id="L80" class="LineNr"> 80 </span> <span class="Comment">// atomic type ordinal</span> <span id="L81" class="LineNr"> 81 </span> <span class="Normal">explicit</span> type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">);</span> -<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> +<span id="L82" class="LineNr"> 82 </span> type_tree<span class="Delimiter">(</span>string name<span class="Delimiter">,</span> <a href='010vm.cc.html#L124'>type_ordinal</a> 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 id="L83" class="LineNr"> 83 </span> <span class="Comment">// tree of type ordinals</span> <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> <span id="L85" class="LineNr"> 85 </span> type_tree& <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> type_tree& original<span class="Delimiter">);</span> @@ -170,7 +170,7 @@ if ('onhashchange' in window) { <span id="L110" class="LineNr">110 </span><span class="Comment">// Locations refer to a common 'memory'. Each location can store a number.</span> <span id="L111" class="LineNr">111 </span>map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">double</span>> Memory<span class="Delimiter">;</span> <span id="L112" class="LineNr">112 </span><span class="Delimiter">:(before "End Setup")</span> -<span id="L113" class="LineNr">113 </span>Memory<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L113" class="LineNr">113 </span>Memory<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L114" class="LineNr">114 </span> <span id="L115" class="LineNr">115 </span><span class="Delimiter">:(after "Types")</span> <span id="L116" class="LineNr">116 </span><span class="Comment">// Mu types encode how the numbers stored in different parts of memory are</span> @@ -181,42 +181,42 @@ if ('onhashchange' in window) { <span id="L121" class="LineNr">121 </span><span class="Comment">// Unlike most computers today, Mu stores types in a single big table, shared</span> <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> <span id="L123" class="LineNr">123 </span><span class="Comment">// seamless experience to help understand arbitrary Mu programs.</span> -<span id="L124" class="LineNr">124 </span><span class="Normal">typedef</span> <span class="Normal">int</span> type_ordinal<span class="Delimiter">;</span> +<span id="L124" class="LineNr">124 </span><span class="Normal">typedef</span> <span class="Normal">int</span> <a href='010vm.cc.html#L124'>type_ordinal</a><span class="Delimiter">;</span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L126" class="LineNr">126 </span>map<string<span class="Delimiter">,</span> type_ordinal> Type_ordinal<span class="Delimiter">;</span> <span id="L127" class="LineNr">127 </span>map<type_ordinal<span class="Delimiter">,</span> type_info> Type<span class="Delimiter">;</span> -<span id="L128" class="LineNr">128 </span>type_ordinal Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> +<span id="L128" class="LineNr">128 </span><a href='010vm.cc.html#L124'>type_ordinal</a> Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L129" class="LineNr">129 </span><span class="Delimiter">:(code)</span> -<span id="L130" class="LineNr">130 </span><span class="Normal">void</span> setup_types<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> -<span id="L132" class="LineNr">132 </span> put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"literal"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L130" class="LineNr">130 </span><span class="Normal">void</span> <a href='010vm.cc.html#L130'>setup_types</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L131" class="LineNr">131 </span> Type<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> Type_ordinal<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L132" class="LineNr">132 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"literal"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L133" class="LineNr">133 </span> Next_type_ordinal = <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L134" class="LineNr">134 </span> <span class="Comment">// Mu Types Initialization</span> -<span id="L135" class="LineNr">135 </span> type_ordinal number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<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">"number"</span><span class="Delimiter">;</span> -<span id="L137" class="LineNr">137 </span> put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"location"</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> -<span id="L138" class="LineNr">138 </span> type_ordinal address = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<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">"address"</span><span class="Delimiter">;</span> -<span id="L140" class="LineNr">140 </span> type_ordinal boolean = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"boolean"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<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">"boolean"</span><span class="Delimiter">;</span> -<span id="L142" class="LineNr">142 </span> type_ordinal character = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"character"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<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">"character"</span><span class="Delimiter">;</span> +<span id="L135" class="LineNr">135 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> number = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L136" class="LineNr">136 </span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> number<span class="Delimiter">).</span>name = <span class="Constant">"number"</span><span class="Delimiter">;</span> +<span id="L137" class="LineNr">137 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"location"</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> +<span id="L138" class="LineNr">138 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> <a href='043space.cc.html#L76'>address</a> = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L139" class="LineNr">139 </span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">).</span>name = <span class="Constant">"address"</span><span class="Delimiter">;</span> +<span id="L140" class="LineNr">140 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> boolean = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"boolean"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L141" class="LineNr">141 </span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> boolean<span class="Delimiter">).</span>name = <span class="Constant">"boolean"</span><span class="Delimiter">;</span> +<span id="L142" class="LineNr">142 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> character = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"character"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L143" class="LineNr">143 </span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> character<span class="Delimiter">).</span>name = <span class="Constant">"character"</span><span class="Delimiter">;</span> <span id="L144" class="LineNr">144 </span> <span class="Comment">// Array types are a special modifier to any other type. For example,</span> <span id="L145" class="LineNr">145 </span> <span class="Comment">// array:number or array:address:boolean.</span> -<span id="L146" class="LineNr">146 </span> type_ordinal array = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<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">"array"</span><span class="Delimiter">;</span> +<span id="L146" class="LineNr">146 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> array = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L147" class="LineNr">147 </span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> array<span class="Delimiter">).</span>name = <span class="Constant">"array"</span><span class="Delimiter">;</span> <span id="L148" class="LineNr">148 </span> <span class="Comment">// End Mu Types Initialization</span> <span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span> -<span id="L150" class="LineNr">150 </span><span class="Normal">void</span> teardown_types<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L151" class="LineNr">151 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<span id="L153" class="LineNr">153 </span> p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L150" class="LineNr">150 </span><span class="Normal">void</span> <a href='010vm.cc.html#L150'>teardown_types</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L151" class="LineNr">151 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L153" class="LineNr">153 </span> p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L154" class="LineNr">154 </span> <span class="Delimiter">}</span> -<span id="L155" class="LineNr">155 </span> Type_ordinal<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L155" class="LineNr">155 </span> Type_ordinal<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span> <span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before "End One-time Setup")</span> -<span id="L158" class="LineNr">158 </span>setup_types<span class="Delimiter">();</span> -<span id="L159" class="LineNr">159 </span>atexit<span class="Delimiter">(</span>teardown_types<span class="Delimiter">);</span> +<span id="L158" class="LineNr">158 </span><a href='010vm.cc.html#L130'>setup_types</a><span class="Delimiter">();</span> +<span id="L159" class="LineNr">159 </span>atexit<span class="Delimiter">(</span><a href='010vm.cc.html#L150'>teardown_types</a><span class="Delimiter">);</span> <span id="L160" class="LineNr">160 </span> <span id="L161" class="LineNr">161 </span><span class="Delimiter">:(before "End Types")</span> <span id="L162" class="LineNr">162 </span><span class="Comment">// You can construct arbitrary new types. New types are either 'containers'</span> @@ -229,38 +229,38 @@ if ('onhashchange' in window) { <span id="L169" class="LineNr">169 </span><span class="Comment">// container, but if bank accounts may be either for individuals or groups,</span> <span id="L170" class="LineNr">170 </span><span class="Comment">// with different properties for each, that may require an exclusive container</span> <span id="L171" class="LineNr">171 </span><span class="Comment">// whose variants are individual-account and joint-account containers.</span> -<span id="L172" class="LineNr">172 </span><span class="Normal">enum</span> kind_of_type <span class="Delimiter">{</span> -<span id="L173" class="LineNr">173 </span> PRIMITIVE<span class="Delimiter">,</span> -<span id="L174" class="LineNr">174 </span> CONTAINER<span class="Delimiter">,</span> -<span id="L175" class="LineNr">175 </span> EXCLUSIVE_CONTAINER +<span id="L172" class="LineNr">172 </span><span class="Normal">enum</span> <a href='010vm.cc.html#L172'>kind_of_type</a> <span class="Delimiter">{</span> +<span id="L173" class="LineNr">173 </span> <a href='010vm.cc.html#L173'>PRIMITIVE</a><span class="Delimiter">,</span> +<span id="L174" class="LineNr">174 </span> <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">,</span> +<span id="L175" class="LineNr">175 </span> <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a> <span id="L176" class="LineNr">176 </span><span class="Delimiter">};</span> <span id="L177" class="LineNr">177 </span> <span id="L178" class="LineNr">178 </span><span class="Normal">struct</span> type_info <span class="Delimiter">{</span> <span id="L179" class="LineNr">179 </span> string name<span class="Delimiter">;</span> -<span id="L180" class="LineNr">180 </span> kind_of_type kind<span class="Delimiter">;</span> +<span id="L180" class="LineNr">180 </span> <a href='010vm.cc.html#L172'>kind_of_type</a> kind<span class="Delimiter">;</span> <span id="L181" class="LineNr">181 </span> vector<reagent> elements<span class="Delimiter">;</span> <span id="L182" class="LineNr">182 </span> <span class="Comment">// End type_info Fields</span> -<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> +<span id="L183" class="LineNr">183 </span> type_info<span class="Delimiter">()</span> :kind<span class="Delimiter">(</span><a href='010vm.cc.html#L173'>PRIMITIVE</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L184" class="LineNr">184 </span> <span class="Comment">// End type_info Constructor</span> <span id="L185" class="LineNr">185 </span> <span class="Delimiter">}</span> <span id="L186" class="LineNr">186 </span><span class="Delimiter">};</span> <span id="L187" class="LineNr">187 </span> -<span id="L188" class="LineNr">188 </span><span class="Normal">enum</span> primitive_recipes <span class="Delimiter">{</span> -<span id="L189" class="LineNr">189 </span> IDLE = <span class="Constant">0</span><span class="Delimiter">,</span> -<span id="L190" class="LineNr">190 </span> COPY<span class="Delimiter">,</span> +<span id="L188" class="LineNr">188 </span><span class="Normal">enum</span> <a href='010vm.cc.html#L188'>primitive_recipes</a> <span class="Delimiter">{</span> +<span id="L189" class="LineNr">189 </span> <a href='010vm.cc.html#L189'>IDLE</a> = <span class="Constant">0</span><span class="Delimiter">,</span> +<span id="L190" class="LineNr">190 </span> <a href='010vm.cc.html#L190'>COPY</a><span class="Delimiter">,</span> <span id="L191" class="LineNr">191 </span> <span class="Comment">// End Primitive Recipe Declarations</span> -<span id="L192" class="LineNr">192 </span> MAX_PRIMITIVE_RECIPES<span class="Delimiter">,</span> +<span id="L192" class="LineNr">192 </span> <a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a><span class="Delimiter">,</span> <span id="L193" class="LineNr">193 </span><span class="Delimiter">};</span> <span id="L194" class="LineNr">194 </span><span class="Delimiter">:(code)</span> <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> <span id="L196" class="LineNr">196 </span><span class="Comment">//: to know how to do *something* out of the box. For the following</span> <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> <span id="L198" class="LineNr">198 </span><span class="Comment">//: what to do for them.</span> -<span id="L199" class="LineNr">199 </span><span class="Normal">void</span> setup_recipes<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> -<span id="L201" class="LineNr">201 </span> put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"idle"</span><span class="Delimiter">,</span> IDLE<span class="Delimiter">);</span> +<span id="L199" class="LineNr">199 </span><span class="Normal">void</span> <a href='010vm.cc.html#L199'>setup_recipes</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L200" class="LineNr">200 </span> Recipe<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> Recipe_ordinal<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L201" class="LineNr">201 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"idle"</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L189'>IDLE</a><span class="Delimiter">);</span> <span id="L202" class="LineNr">202 </span> <span class="Comment">// Primitive Recipe Numbers</span> -<span id="L203" class="LineNr">203 </span> put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"copy"</span><span class="Delimiter">,</span> COPY<span class="Delimiter">);</span> +<span id="L203" class="LineNr">203 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"copy"</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L190'>COPY</a><span class="Delimiter">);</span> <span id="L204" class="LineNr">204 </span> <span class="Comment">// End Primitive Recipe Numbers</span> <span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span> <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> @@ -268,10 +268,10 @@ if ('onhashchange' in window) { <span id="L208" class="LineNr">208 </span><span class="Comment">//: startup. Later layers will carefully undo each test's additions after</span> <span id="L209" class="LineNr">209 </span><span class="Comment">//: itself.</span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before "End One-time Setup")</span> -<span id="L211" class="LineNr">211 </span>setup_recipes<span class="Delimiter">();</span> -<span id="L212" class="LineNr">212 </span>assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES < <span class="Constant">200</span><span class="Delimiter">);</span> <span class="Comment">// level 0 is primitives; until 199</span> +<span id="L211" class="LineNr">211 </span><a href='010vm.cc.html#L199'>setup_recipes</a><span class="Delimiter">();</span> +<span id="L212" class="LineNr">212 </span>assert<span class="Delimiter">(</span><a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a> < <span class="Constant">200</span><span class="Delimiter">);</span> <span class="Comment">// level 0 is primitives; until 199</span> <span id="L213" class="LineNr">213 </span>Next_recipe_ordinal = <span class="Constant">200</span><span class="Delimiter">;</span> -<span id="L214" class="LineNr">214 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span> +<span id="L214" class="LineNr">214 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span> <span id="L215" class="LineNr">215 </span><span class="Comment">// End Load Recipes</span> <span id="L216" class="LineNr">216 </span><span class="Delimiter">:(before "End Commandline Parsing")</span> <span id="L217" class="LineNr">217 </span>assert<span class="Delimiter">(</span>Next_recipe_ordinal < <span class="Constant">1000</span><span class="Delimiter">);</span> <span class="Comment">// recipes being tested didn't overflow into test space</span> @@ -315,15 +315,15 @@ if ('onhashchange' in window) { <span id="L255" class="LineNr">255 </span><span class="SalientComment">//:: Helpers</span> <span id="L256" class="LineNr">256 </span> <span id="L257" class="LineNr">257 </span><span class="Delimiter">:(code)</span> -<span id="L258" class="LineNr">258 </span><span class="muRecipe">recipe</span>::recipe<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L258" class="LineNr">258 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span>::<a href='010vm.cc.html#L19'>recipe</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L259" class="LineNr">259 </span> <span class="Comment">// End recipe Constructor</span> <span id="L260" class="LineNr">260 </span><span class="Delimiter">}</span> <span id="L261" class="LineNr">261 </span> -<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> +<span id="L262" class="LineNr">262 </span><a href='010vm.cc.html#L32'>instruction</a>::<a href='010vm.cc.html#L32'>instruction</a><span class="Delimiter">()</span> :is_label<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">),</span> operation<span class="Delimiter">(</span><a href='010vm.cc.html#L189'>IDLE</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L263" class="LineNr">263 </span> <span class="Comment">// End instruction Constructor</span> <span id="L264" class="LineNr">264 </span><span class="Delimiter">}</span> -<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> -<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 && name<span class="Delimiter">.</span>empty<span class="Delimiter">();</span> <span class="Delimiter">}</span> +<span id="L265" class="LineNr">265 </span><span class="Normal">void</span> <a href='010vm.cc.html#L32'>instruction</a>::<a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> is_label=<span class="Constant">false</span><span class="Delimiter">;</span> label<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> name<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> old_name<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> operation=IDLE<span class="Delimiter">;</span> ingredients<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> products<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> original_string<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span class="Delimiter">}</span> +<span id="L266" class="LineNr">266 </span><span class="Normal">bool</span> <a href='010vm.cc.html#L32'>instruction</a>::is_empty<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> !is_label && name<span class="Delimiter">.</span>empty<span class="Delimiter">();</span> <span class="Delimiter">}</span> <span id="L267" class="LineNr">267 </span> <span id="L268" class="LineNr">268 </span><span class="Comment">// Reagents have the form <name>:<type>:<type>:.../<property>/<property>/...</span> <span id="L269" class="LineNr">269 </span>reagent::reagent<span class="Delimiter">(</span><span class="Normal">const</span> string& 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> @@ -336,10 +336,10 @@ if ('onhashchange' in window) { <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> <span id="L277" class="LineNr">277 </span> string_tree* type_names = parse_property_list<span class="Delimiter">(</span>first_row<span class="Delimiter">);</span> <span id="L278" class="LineNr">278 </span> <span class="Comment">// End Parsing Reagent Type Property(type_names)</span> -<span id="L279" class="LineNr">279 </span> type = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span> +<span id="L279" class="LineNr">279 </span> type = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>type_names<span class="Delimiter">);</span> <span id="L280" class="LineNr">280 </span> <span class="Normal">delete</span> type_names<span class="Delimiter">;</span> <span id="L281" class="LineNr">281 </span> <span class="Comment">// special cases</span> -<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> && type == <span class="Constant">NULL</span><span class="Delimiter">)</span> +<span id="L282" class="LineNr">282 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>name<span class="Delimiter">)</span> && type == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span id="L283" class="LineNr">283 </span> type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">"literal"</span><span class="Delimiter">);</span> <span id="L284" class="LineNr">284 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>name == <span class="Constant">"_"</span> && type == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span id="L285" class="LineNr">285 </span> type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">"literal"</span><span class="Delimiter">);</span> @@ -349,7 +349,7 @@ if ('onhashchange' in window) { <span id="L289" class="LineNr">289 </span><span class="Delimiter">}</span> <span id="L290" class="LineNr">290 </span> <span id="L291" class="LineNr">291 </span><span class="Normal">void</span> slurp_properties<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> vector<pair<string<span class="Delimiter">,</span> string_tree*> >& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L292" class="LineNr">292 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="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> <span id="L294" class="LineNr">294 </span> row >> std::noskipws<span class="Delimiter">;</span> <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> @@ -372,31 +372,31 @@ if ('onhashchange' in window) { <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> <span id="L313" class="LineNr">313 </span> istringstream in<span class="Delimiter">(</span><span class="Constant">"a"</span><span class="Delimiter">);</span> <span id="L314" class="LineNr">314 </span> string_tree* x = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L315" class="LineNr">315 </span> CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L315" class="LineNr">315 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>x<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <span id="L316" class="LineNr">316 </span> <span class="Normal">delete</span> x<span class="Delimiter">;</span> <span id="L317" class="LineNr">317 </span><span class="Delimiter">}</span> <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> <span id="L319" class="LineNr">319 </span> istringstream in<span class="Delimiter">(</span><span class="Constant">"a:b"</span><span class="Delimiter">);</span> <span id="L320" class="LineNr">320 </span> string_tree* x = parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L321" class="LineNr">321 </span> CHECK<span class="Delimiter">(</span>!x<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L322" class="LineNr">322 </span> CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L323" class="LineNr">323 </span> CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value<span class="Delimiter">,</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> -<span id="L324" class="LineNr">324 </span> CHECK<span class="Delimiter">(</span>!x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L325" class="LineNr">325 </span> CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L326" class="LineNr">326 </span> CHECK_EQ<span class="Delimiter">(</span>x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value<span class="Delimiter">,</span> <span class="Constant">"b"</span><span class="Delimiter">);</span> -<span id="L327" class="LineNr">327 </span> CHECK<span class="Delimiter">(</span>x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right == <span class="Constant">NULL</span><span class="Delimiter">);</span> +<span id="L321" class="LineNr">321 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!x<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L322" class="LineNr">322 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>x<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L323" class="LineNr">323 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>x<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value<span class="Delimiter">,</span> <span class="Constant">"a"</span><span class="Delimiter">);</span> +<span id="L324" class="LineNr">324 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L325" class="LineNr">325 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L326" class="LineNr">326 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value<span class="Delimiter">,</span> <span class="Constant">"b"</span><span class="Delimiter">);</span> +<span id="L327" class="LineNr">327 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>x<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right == <span class="Constant">NULL</span><span class="Delimiter">);</span> <span id="L328" class="LineNr">328 </span> <span class="Normal">delete</span> x<span class="Delimiter">;</span> <span id="L329" class="LineNr">329 </span><span class="Delimiter">}</span> <span id="L330" class="LineNr">330 </span> <span id="L331" class="LineNr">331 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L332" class="LineNr">332 </span>type_tree* <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Normal">const</span> string_tree* properties<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L334" class="LineNr">334 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>properties<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L335" class="LineNr">335 </span> <span class="Normal">const</span> string& type_name = properties<span class="Delimiter">-></span>value<span class="Delimiter">;</span> <span id="L336" class="LineNr">336 </span> <span class="Normal">int</span> value = <span class="Constant">0</span><span class="Delimiter">;</span> <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> <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> -<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> +<span id="L339" class="LineNr">339 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>type_name<span class="Delimiter">))</span> <span class="Comment">// sometimes types will contain non-type tags, like numbers for the size of an array</span> <span id="L340" class="LineNr">340 </span> value = <span class="Constant">0</span><span class="Delimiter">;</span> <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">-></span>value == <span class="Constant">"->"</span><span class="Delimiter">)</span> <span class="Comment">// used in recipe types</span> <span id="L342" class="LineNr">342 </span> value = <span class="Constant">0</span><span class="Delimiter">;</span> @@ -404,8 +404,8 @@ if ('onhashchange' in window) { <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> <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> <span id="L346" class="LineNr">346 </span> <span class="Delimiter">}</span> -<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">-></span>left<span class="Delimiter">),</span> -<span id="L348" class="LineNr">348 </span> new_type_tree<span class="Delimiter">(</span>properties<span class="Delimiter">-></span>right<span class="Delimiter">));</span> +<span id="L347" class="LineNr">347 </span> <span class="Identifier">return</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>properties<span class="Delimiter">-></span>left<span class="Delimiter">),</span> +<span id="L348" class="LineNr">348 </span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>properties<span class="Delimiter">-></span>right<span class="Delimiter">));</span> <span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span> <span id="L350" class="LineNr">350 </span> <span id="L351" class="LineNr">351 </span><span class="Comment">//: avoid memory leaks for the type tree</span> @@ -415,7 +415,7 @@ if ('onhashchange' in window) { <span id="L355" class="LineNr">355 </span> name = other<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L356" class="LineNr">356 </span> value = other<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <span id="L357" class="LineNr">357 </span> initialized = other<span class="Delimiter">.</span>initialized<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L359" class="LineNr">359 </span> properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</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>first<span class="Delimiter">,</span> <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> <span id="L361" class="LineNr">361 </span> <span class="Delimiter">}</span> @@ -478,43 +478,43 @@ if ('onhashchange' in window) { <span id="L418" class="LineNr">418 </span><span class="Comment">// These unit tests don't always use valid types.</span> <span id="L419" class="LineNr">419 </span><span class="Normal">void</span> test_compare_atom_types<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L420" class="LineNr">420 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:boolean"</span><span class="Delimiter">);</span> -<span id="L421" class="LineNr">421 </span> CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L422" class="LineNr">422 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L421" class="LineNr">421 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L422" class="LineNr">422 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L423" class="LineNr">423 </span><span class="Delimiter">}</span> <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> <span id="L425" class="LineNr">425 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:address"</span><span class="Delimiter">);</span> -<span id="L426" class="LineNr">426 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span> -<span id="L427" class="LineNr">427 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L426" class="LineNr">426 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L427" class="LineNr">427 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L428" class="LineNr">428 </span><span class="Delimiter">}</span> <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> -<span id="L430" class="LineNr">430 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address:number"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:boolean"</span><span class="Delimiter">);</span> -<span id="L431" class="LineNr">431 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span> -<span id="L432" class="LineNr">432 </span> CHECK<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L430" class="LineNr">430 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:<a href='043space.cc.html#L76'>address</a>:number"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:boolean"</span><span class="Delimiter">);</span> +<span id="L431" class="LineNr">431 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L432" class="LineNr">432 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <span id="L433" class="LineNr">433 </span><span class="Delimiter">}</span> <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> -<span id="L435" class="LineNr">435 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address:address"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:address:boolean"</span><span class="Delimiter">);</span> -<span id="L436" class="LineNr">436 </span> CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L437" class="LineNr">437 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L435" class="LineNr">435 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:<a href='043space.cc.html#L76'>address</a>:address"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:<a href='043space.cc.html#L76'>address</a>:boolean"</span><span class="Delimiter">);</span> +<span id="L436" class="LineNr">436 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L437" class="LineNr">437 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L438" class="LineNr">438 </span><span class="Delimiter">}</span> <span id="L439" class="LineNr">439 </span><span class="Normal">void</span> test_compare_identical_lists<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L440" class="LineNr">440 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address:boolean"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:address:boolean"</span><span class="Delimiter">);</span> -<span id="L441" class="LineNr">441 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span> -<span id="L442" class="LineNr">442 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L440" class="LineNr">440 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:<a href='043space.cc.html#L76'>address</a>:boolean"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:<a href='043space.cc.html#L76'>address</a>:boolean"</span><span class="Delimiter">);</span> +<span id="L441" class="LineNr">441 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L442" class="LineNr">442 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L443" class="LineNr">443 </span><span class="Delimiter">}</span> <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> -<span id="L445" class="LineNr">445 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address:address"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:address:address:number"</span><span class="Delimiter">);</span> -<span id="L446" class="LineNr">446 </span> CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L447" class="LineNr">447 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L445" class="LineNr">445 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:<a href='043space.cc.html#L76'>address</a>:address"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:<a href='043space.cc.html#L76'>address</a>:<a href='043space.cc.html#L76'>address</a>:number"</span><span class="Delimiter">);</span> +<span id="L446" class="LineNr">446 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L447" class="LineNr">447 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L448" class="LineNr">448 </span><span class="Delimiter">}</span> <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> -<span id="L450" class="LineNr">450 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address:number"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:character:array"</span><span class="Delimiter">);</span> -<span id="L451" class="LineNr">451 </span> CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L452" class="LineNr">452 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L450" class="LineNr">450 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:<a href='043space.cc.html#L76'>address</a>:number"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:character:array"</span><span class="Delimiter">);</span> +<span id="L451" class="LineNr">451 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L452" class="LineNr">452 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L453" class="LineNr">453 </span><span class="Delimiter">}</span> <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> -<span id="L455" class="LineNr">455 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:address:boolean"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:boolean:address"</span><span class="Delimiter">);</span> -<span id="L456" class="LineNr">456 </span> CHECK<span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L457" class="LineNr">457 </span> CHECK<span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L455" class="LineNr">455 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:<a href='043space.cc.html#L76'>address</a>:boolean"</span><span class="Delimiter">),</span> b<span class="Delimiter">(</span><span class="Constant">"b:boolean:address"</span><span class="Delimiter">);</span> +<span id="L456" class="LineNr">456 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>*a<span class="Delimiter">.</span>type < *b<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L457" class="LineNr">457 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!<span class="Delimiter">(</span>*b<span class="Delimiter">.</span>type < *a<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L458" class="LineNr">458 </span><span class="Delimiter">}</span> <span id="L459" class="LineNr">459 </span> <span id="L460" class="LineNr">460 </span><span class="Delimiter">:(code)</span> @@ -527,10 +527,10 @@ if ('onhashchange' in window) { <span id="L467" class="LineNr">467 </span> <span id="L468" class="LineNr">468 </span>reagent& reagent::<span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> reagent& other<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L469" class="LineNr">469 </span> original_string = other<span class="Delimiter">.</span>original_string<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<span id="L472" class="LineNr">472 </span> properties<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L473" class="LineNr">473 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L472" class="LineNr">472 </span> properties<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L473" class="LineNr">473 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>other<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L474" class="LineNr">474 </span> properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</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>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 id="L475" class="LineNr">475 </span> name = other<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L476" class="LineNr">476 </span> value = other<span class="Delimiter">.</span>value<span class="Delimiter">;</span> @@ -542,11 +542,11 @@ if ('onhashchange' in window) { <span id="L482" class="LineNr">482 </span><span class="Delimiter">}</span> <span id="L483" class="LineNr">483 </span> <span id="L484" class="LineNr">484 </span>reagent::~reagent<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L485" class="LineNr">485 </span> clear<span class="Delimiter">();</span> +<span id="L485" class="LineNr">485 </span> <a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L486" class="LineNr">486 </span><span class="Delimiter">}</span> <span id="L487" class="LineNr">487 </span> -<span id="L488" class="LineNr">488 </span><span class="Normal">void</span> reagent::clear<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L488" class="LineNr">488 </span><span class="Normal">void</span> reagent::<a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> @@ -598,14 +598,14 @@ if ('onhashchange' in window) { <span id="L538" class="LineNr">538 </span><span class="Delimiter">}</span> <span id="L539" class="LineNr">539 </span> <span id="L540" class="LineNr">540 </span><span class="Normal">bool</span> has_property<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L543" class="LineNr">543 </span> <span class="Delimiter">}</span> <span id="L544" class="LineNr">544 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L545" class="LineNr">545 </span><span class="Delimiter">}</span> <span id="L546" class="LineNr">546 </span> <span id="L547" class="LineNr">547 </span>string_tree* property<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<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 != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <span id="L551" class="LineNr">551 </span> <span class="Delimiter">}</span> @@ -626,7 +626,7 @@ if ('onhashchange' in window) { <span id="L566" class="LineNr">566 </span><span class="Delimiter">}</span> <span id="L567" class="LineNr">567 </span> <span id="L568" class="LineNr">568 </span><span class="Normal">void</span> dump_memory<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L569" class="LineNr">569 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">double</span>>::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> +<span id="L569" class="LineNr">569 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">double</span>>::iterator p = Memory<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Memory<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L570" class="LineNr">570 </span> cout << p<span class="Delimiter">-></span>first << <span class="Constant">": "</span> << no_scientific<span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L571" class="LineNr">571 </span> <span class="Delimiter">}</span> <span id="L572" class="LineNr">572 </span><span class="Delimiter">}</span> @@ -637,27 +637,27 @@ if ('onhashchange' in window) { <span id="L577" class="LineNr">577 </span><span class="Comment">//: Use inspect() only for emitting a canonical format that can be parsed back</span> <span id="L578" class="LineNr">578 </span><span class="Comment">//: into the value.</span> <span id="L579" class="LineNr">579 </span> -<span id="L580" class="LineNr">580 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> recipe& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L580" class="LineNr">580 </span>string <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L581" class="LineNr">581 </span> ostringstream out<span class="Delimiter">;</span> <span id="L582" class="LineNr">582 </span> out << <span class="Constant">"recipe "</span> << r<span class="Delimiter">.</span>name << <span class="Constant">" [</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<span id="L584" class="LineNr">584 </span> out << <span class="Constant">" "</span> << 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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L584" class="LineNr">584 </span> out << <span class="Constant">" "</span> << <a href='028call_return.cc.html#L158'>to_string</a><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="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L585" class="LineNr">585 </span> out << <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> <span id="L586" class="LineNr">586 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L587" class="LineNr">587 </span><span class="Delimiter">}</span> <span id="L588" class="LineNr">588 </span> <span id="L589" class="LineNr">589 </span>string debug_string<span class="Delimiter">(</span><span class="Normal">const</span> recipe& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L590" class="LineNr">590 </span> ostringstream out<span class="Delimiter">;</span> -<span id="L591" class="LineNr">591 </span> out << <span class="Constant">"- recipe "</span> << x<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L591" class="LineNr">591 </span> out << <span class="Constant">"- <a href='010vm.cc.html#L19'>recipe</a> "</span> << x<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L592" class="LineNr">592 </span> <span class="Comment">// Begin debug_string(recipe x)</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L594" class="LineNr">594 </span> <span class="Normal">const</span> instruction& inst = x<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> -<span id="L595" class="LineNr">595 </span> out << <span class="Constant">"inst: "</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L595" class="LineNr">595 </span> out << <span class="Constant">"inst: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L596" class="LineNr">596 </span> out << <span class="Constant">" ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L598" class="LineNr">598 </span> out << <span class="Constant">" "</span> << 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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L599" class="LineNr">599 </span> out << <span class="Constant">" products</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L601" class="LineNr">601 </span> out << <span class="Constant">" "</span> << 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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L602" class="LineNr">602 </span> <span class="Delimiter">}</span> <span id="L603" class="LineNr">603 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> @@ -666,43 +666,43 @@ if ('onhashchange' in window) { <span id="L606" class="LineNr">606 </span>string to_original_string<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L608" class="LineNr">608 </span> ostringstream out<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L610" class="LineNr">610 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i > <span class="Constant">0</span><span class="Delimiter">)</span> out << <span class="Constant">", "</span><span class="Delimiter">;</span> <span id="L611" class="LineNr">611 </span> out << 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 id="L612" class="LineNr">612 </span> <span class="Delimiter">}</span> <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 << <span class="Constant">" <- "</span><span class="Delimiter">;</span> <span id="L614" class="LineNr">614 </span> out << inst<span class="Delimiter">.</span>name << <span class="Constant">' '</span><span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L616" class="LineNr">616 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i > <span class="Constant">0</span><span class="Delimiter">)</span> out << <span class="Constant">", "</span><span class="Delimiter">;</span> <span id="L617" class="LineNr">617 </span> out << 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 id="L618" class="LineNr">618 </span> <span class="Delimiter">}</span> <span id="L619" class="LineNr">619 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L620" class="LineNr">620 </span><span class="Delimiter">}</span> <span id="L621" class="LineNr">621 </span> -<span id="L622" class="LineNr">622 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L622" class="LineNr">622 </span>string <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L624" class="LineNr">624 </span> ostringstream out<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L626" class="LineNr">626 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i > <span class="Constant">0</span><span class="Delimiter">)</span> out << <span class="Constant">", "</span><span class="Delimiter">;</span> -<span id="L627" class="LineNr">627 </span> out << 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 id="L627" class="LineNr">627 </span> out << <a href='028call_return.cc.html#L158'>to_string</a><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 id="L628" class="LineNr">628 </span> <span class="Delimiter">}</span> <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 << <span class="Constant">" <- "</span><span class="Delimiter">;</span> <span id="L630" class="LineNr">630 </span> out << inst<span class="Delimiter">.</span>name << <span class="Constant">' '</span><span class="Delimiter">;</span> -<span id="L631" class="LineNr">631 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < 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 id="L631" class="LineNr">631 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L632" class="LineNr">632 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i > <span class="Constant">0</span><span class="Delimiter">)</span> out << <span class="Constant">", "</span><span class="Delimiter">;</span> -<span id="L633" class="LineNr">633 </span> out << 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 id="L633" class="LineNr">633 </span> out << <a href='028call_return.cc.html#L158'>to_string</a><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 id="L634" class="LineNr">634 </span> <span class="Delimiter">}</span> <span id="L635" class="LineNr">635 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L636" class="LineNr">636 </span><span class="Delimiter">}</span> <span id="L637" class="LineNr">637 </span> -<span id="L638" class="LineNr">638 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L638" class="LineNr">638 </span>string <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"_"</span><span class="Delimiter">;</span> <span id="L640" class="LineNr">640 </span> ostringstream out<span class="Delimiter">;</span> <span id="L641" class="LineNr">641 </span> out << <span class="Constant">"{"</span><span class="Delimiter">;</span> <span id="L642" class="LineNr">642 </span> out << r<span class="Delimiter">.</span>name << <span class="Constant">": "</span> << names_to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <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> -<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 < SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<span id="L645" class="LineNr">645 </span> out << <span class="Constant">", </span><span class="cSpecial">\"</span><span class="Constant">"</span> << r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first << <span class="Constant">"</span><span class="cSpecial">\"</span><span class="Constant">: "</span> << 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L645" class="LineNr">645 </span> out << <span class="Constant">", </span><span class="cSpecial">\"</span><span class="Constant">"</span> << r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first << <span class="Constant">"</span><span class="cSpecial">\"</span><span class="Constant">: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><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 id="L646" class="LineNr">646 </span> <span class="Delimiter">}</span> <span id="L647" class="LineNr">647 </span> out << <span class="Constant">"}"</span><span class="Delimiter">;</span> <span id="L648" class="LineNr">648 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> @@ -715,11 +715,11 @@ if ('onhashchange' in window) { <span id="L655" class="LineNr">655 </span> <span id="L656" class="LineNr">656 </span>string debug_string<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L657" class="LineNr">657 </span> ostringstream out<span class="Delimiter">;</span> -<span id="L658" class="LineNr">658 </span> out << x<span class="Delimiter">.</span>name << <span class="Constant">": "</span> << x<span class="Delimiter">.</span>value << <span class="Constant">' '</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" -- "</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">);</span> +<span id="L658" class="LineNr">658 </span> out << x<span class="Delimiter">.</span>name << <span class="Constant">": "</span> << x<span class="Delimiter">.</span>value << <span class="Constant">' '</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" -- "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L659" class="LineNr">659 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L660" class="LineNr">660 </span><span class="Delimiter">}</span> <span id="L661" class="LineNr">661 </span> -<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> +<span id="L662" class="LineNr">662 </span>string <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span><span class="Normal">const</span> string_tree* property<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"()"</span><span class="Delimiter">;</span> <span id="L664" class="LineNr">664 </span> ostringstream out<span class="Delimiter">;</span> <span id="L665" class="LineNr">665 </span> dump<span class="Delimiter">(</span>property<span class="Delimiter">,</span> out<span class="Delimiter">);</span> @@ -747,7 +747,7 @@ if ('onhashchange' in window) { <span id="L687" class="LineNr">687 </span> out << <span class="Constant">')'</span><span class="Delimiter">;</span> <span id="L688" class="LineNr">688 </span><span class="Delimiter">}</span> <span id="L689" class="LineNr">689 </span> -<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> +<span id="L690" class="LineNr">690 </span>string <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L691" class="LineNr">691 </span> <span class="Comment">// abbreviate a single-node tree to just its contents</span> <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">"NULLNULLNULL"</span><span class="Delimiter">;</span> <span class="Comment">// should never happen</span> <span id="L693" class="LineNr">693 </span> ostringstream out<span class="Delimiter">;</span> @@ -776,7 +776,7 @@ if ('onhashchange' in window) { <span id="L716" class="LineNr">716 </span> out << <span class="Constant">')'</span><span class="Delimiter">;</span> <span id="L717" class="LineNr">717 </span><span class="Delimiter">}</span> <span id="L718" class="LineNr">718 </span> -<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& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L719" class="LineNr">719 </span><span class="Normal">void</span> dump<span class="Delimiter">(</span><a href='010vm.cc.html#L124'>type_ordinal</a> type<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L721" class="LineNr">721 </span> out << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">).</span>name<span class="Delimiter">;</span> <span id="L722" class="LineNr">722 </span> <span class="Normal">else</span> @@ -867,7 +867,7 @@ if ('onhashchange' in window) { <span id="L807" class="LineNr">807 </span>string trim_floating_point<span class="Delimiter">(</span><span class="Normal">const</span> string& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">""</span><span class="Delimiter">;</span> <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> -<span id="L810" class="LineNr">810 </span> <span class="Normal">int</span> length = SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L810" class="LineNr">810 </span> <span class="Normal">int</span> length = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L811" class="LineNr">811 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>length > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L813" class="LineNr">813 </span> --length<span class="Delimiter">;</span> @@ -878,19 +878,19 @@ if ('onhashchange' in window) { <span id="L818" class="LineNr">818 </span><span class="Delimiter">}</span> <span id="L819" class="LineNr">819 </span> <span id="L820" class="LineNr">820 </span><span class="Normal">void</span> test_trim_floating_point<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L821" class="LineNr">821 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<span id="L822" class="LineNr">822 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">".0"</span><span class="Delimiter">),</span> <span class="Constant">"0"</span><span class="Delimiter">);</span> -<span id="L823" class="LineNr">823 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"1.5000"</span><span class="Delimiter">),</span> <span class="Constant">"1.5"</span><span class="Delimiter">);</span> -<span id="L824" class="LineNr">824 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"1.000001"</span><span class="Delimiter">),</span> <span class="Constant">"1.000001"</span><span class="Delimiter">);</span> -<span id="L825" class="LineNr">825 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23.000000"</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> -<span id="L826" class="LineNr">826 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23.0"</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> -<span id="L827" class="LineNr">827 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23."</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> -<span id="L828" class="LineNr">828 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23"</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> -<span id="L829" class="LineNr">829 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"230"</span><span class="Delimiter">),</span> <span class="Constant">"230"</span><span class="Delimiter">);</span> -<span id="L830" class="LineNr">830 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3.000000"</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> -<span id="L831" class="LineNr">831 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3.0"</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> -<span id="L832" class="LineNr">832 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3."</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> -<span id="L833" class="LineNr">833 </span> CHECK_EQ<span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3"</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> +<span id="L821" class="LineNr">821 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">),</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L822" class="LineNr">822 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">".0"</span><span class="Delimiter">),</span> <span class="Constant">"0"</span><span class="Delimiter">);</span> +<span id="L823" class="LineNr">823 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"1.5000"</span><span class="Delimiter">),</span> <span class="Constant">"1.5"</span><span class="Delimiter">);</span> +<span id="L824" class="LineNr">824 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"1.000001"</span><span class="Delimiter">),</span> <span class="Constant">"1.000001"</span><span class="Delimiter">);</span> +<span id="L825" class="LineNr">825 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23.000000"</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> +<span id="L826" class="LineNr">826 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23.0"</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> +<span id="L827" class="LineNr">827 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23."</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> +<span id="L828" class="LineNr">828 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"23"</span><span class="Delimiter">),</span> <span class="Constant">"23"</span><span class="Delimiter">);</span> +<span id="L829" class="LineNr">829 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"230"</span><span class="Delimiter">),</span> <span class="Constant">"230"</span><span class="Delimiter">);</span> +<span id="L830" class="LineNr">830 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3.000000"</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> +<span id="L831" class="LineNr">831 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3.0"</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> +<span id="L832" class="LineNr">832 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3."</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> +<span id="L833" class="LineNr">833 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>trim_floating_point<span class="Delimiter">(</span><span class="Constant">"3"</span><span class="Delimiter">),</span> <span class="Constant">"3"</span><span class="Delimiter">);</span> <span id="L834" class="LineNr">834 </span><span class="Delimiter">}</span> <span id="L835" class="LineNr">835 </span> <span id="L836" class="LineNr">836 </span><span class="Delimiter">:(before "End Includes")</span> diff --git a/html/011load.cc.html b/html/011load.cc.html index e1f6bc62..5a715d13 100644 --- a/html/011load.cc.html +++ b/html/011load.cc.html @@ -65,10 +65,10 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span> <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> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario first_recipe)</span> -<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> main [ +<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L9" class="LineNr"> 9 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L10" class="LineNr"> 10 </span>] -<span id="L11" class="LineNr"> 11 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L11" class="LineNr"> 11 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L12" class="LineNr"> 12 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L13" class="LineNr"> 13 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L14" class="LineNr"> 14 </span> @@ -82,165 +82,165 @@ if ('onhashchange' in window) { <span id="L22" class="LineNr"> 22 </span>vector<recipe_ordinal> load<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L23" class="LineNr"> 23 </span> in >> std::noskipws<span class="Delimiter">;</span> <span id="L24" class="LineNr"> 24 </span> vector<recipe_ordinal> result<span class="Delimiter">;</span> -<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> -<span id="L26" class="LineNr"> 26 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L25" class="LineNr"> 25 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L26" class="LineNr"> 26 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> -<span id="L28" class="LineNr"> 28 </span> string command = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L28" class="LineNr"> 28 </span> string command = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L30" class="LineNr"> 30 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> <span id="L31" class="LineNr"> 31 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L32" class="LineNr"> 32 </span> <span class="Delimiter">}</span> <span id="L33" class="LineNr"> 33 </span> <span class="Comment">// Command Handlers</span> <span id="L34" class="LineNr"> 34 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"recipe"</span> || command == <span class="Constant">"def"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L35" class="LineNr"> 35 </span> recipe_ordinal r = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L35" class="LineNr"> 35 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r = <a href='011load.cc.html#L53'>slurp_recipe</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L36" class="LineNr"> 36 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r > <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 id="L37" class="LineNr"> 37 </span> <span class="Delimiter">}</span> <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">"recipe!"</span> || command == <span class="Constant">"def!"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L39" class="LineNr"> 39 </span> Disable_redefine_checks = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L40" class="LineNr"> 40 </span> recipe_ordinal r = slurp_recipe<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L40" class="LineNr"> 40 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r = <a href='011load.cc.html#L53'>slurp_recipe</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L41" class="LineNr"> 41 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r > <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 id="L42" class="LineNr"> 42 </span> Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L43" class="LineNr"> 43 </span> <span class="Delimiter">}</span> <span id="L44" class="LineNr"> 44 </span> <span class="Comment">// End Command Handlers</span> <span id="L45" class="LineNr"> 45 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L46" class="LineNr"> 46 </span> raise << <span class="Constant">"unknown top-level command: "</span> << command << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unknown top-level command: "</span> << command << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L47" class="LineNr"> 47 </span> <span class="Delimiter">}</span> <span id="L48" class="LineNr"> 48 </span> <span class="Delimiter">}</span> <span id="L49" class="LineNr"> 49 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L50" class="LineNr"> 50 </span><span class="Delimiter">}</span> <span id="L51" class="LineNr"> 51 </span> <span id="L52" class="LineNr"> 52 </span><span class="Comment">// return the recipe ordinal slurped, or -1 if it failed</span> -<span id="L53" class="LineNr"> 53 </span><span class="Normal">int</span> slurp_recipe<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L54" class="LineNr"> 54 </span> recipe result<span class="Delimiter">;</span> -<span id="L55" class="LineNr"> 55 </span> result<span class="Delimiter">.</span>name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L53" class="LineNr"> 53 </span><span class="Normal">int</span> <a href='011load.cc.html#L53'>slurp_recipe</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L54" class="LineNr"> 54 </span> <a href='010vm.cc.html#L19'>recipe</a> result<span class="Delimiter">;</span> +<span id="L55" class="LineNr"> 55 </span> result<span class="Delimiter">.</span>name = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="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> <span id="L57" class="LineNr"> 57 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L58" class="LineNr"> 58 </span> raise << <span class="Constant">"file ended with 'recipe'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"file ended with 'recipe'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L59" class="LineNr"> 59 </span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L60" class="LineNr"> 60 </span> <span class="Delimiter">}</span> <span id="L61" class="LineNr"> 61 </span> <span class="Comment">// End Load Recipe Name</span> <span id="L62" class="LineNr"> 62 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L63" class="LineNr"> 63 </span> <span class="Comment">// End Recipe Refinements</span> <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> -<span id="L65" class="LineNr"> 65 </span> raise << <span class="Constant">"empty result.name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L66" class="LineNr"> 66 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"--- defining "</span> << result<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L65" class="LineNr"> 65 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"empty result.name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L66" class="LineNr"> 66 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"--- defining "</span> << result<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<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> -<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> -<span id="L70" class="LineNr"> 70 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"already exists"</span> << end<span class="Delimiter">();</span> -<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> -<span id="L72" class="LineNr"> 72 </span> raise << <span class="Constant">"redefining recipe "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L68" class="LineNr"> 68 </span> <a href='001help.cc.html#L218'>put</a><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 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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L70" class="LineNr"> 70 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"already exists"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L71" class="LineNr"> 71 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='011load.cc.html#L377'>should_check_for_redefine</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">))</span> +<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"redefining <a href='010vm.cc.html#L19'>recipe</a> "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="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> <span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">}</span> -<span id="L75" class="LineNr"> 75 </span> slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span> +<span id="L75" class="LineNr"> 75 </span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span> <span id="L76" class="LineNr"> 76 </span> <span class="Comment">// End Recipe Body(result)</span> -<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> +<span id="L77" class="LineNr"> 77 </span> <a href='001help.cc.html#L218'>put</a><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 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> <span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span> <span id="L80" class="LineNr"> 80 </span> -<span id="L81" class="LineNr"> 81 </span><span class="Normal">void</span> slurp_body<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> recipe& result<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L81" class="LineNr"> 81 </span><span class="Normal">void</span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> recipe& result<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L82" class="LineNr"> 82 </span> in >> std::noskipws<span class="Delimiter">;</span> <span id="L83" class="LineNr"> 83 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> -<span id="L85" class="LineNr"> 85 </span> raise << result<span class="Delimiter">.</span>name << <span class="Constant">": recipe body must begin with '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> -<span id="L87" class="LineNr"> 87 </span> instruction curr<span class="Delimiter">;</span> -<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> &curr<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L85" class="LineNr"> 85 </span> <a href='003trace.cc.html#L178'>raise</a> << result<span class="Delimiter">.</span>name << <span class="Constant">": <a href='010vm.cc.html#L19'>recipe</a> body must begin with '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L86" class="LineNr"> 86 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span class="Comment">// permit trailing comment after '['</span> +<span id="L87" class="LineNr"> 87 </span> <a href='010vm.cc.html#L32'>instruction</a> curr<span class="Delimiter">;</span> +<span id="L88" class="LineNr"> 88 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='011load.cc.html#L96'>next_instruction</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> &curr<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> <span id="L90" class="LineNr"> 90 </span> <span class="Comment">// End Rewrite Instruction(curr, recipe result)</span> -<span id="L91" class="LineNr"> 91 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"after rewriting: "</span> << to_string<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L91" class="LineNr"> 91 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"after rewriting: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>curr<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">}</span> <span id="L94" class="LineNr"> 94 </span><span class="Delimiter">}</span> <span id="L95" class="LineNr"> 95 </span> -<span id="L96" class="LineNr"> 96 </span><span class="Normal">bool</span> next_instruction<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> instruction* curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L97" class="LineNr"> 97 </span> curr<span class="Delimiter">-></span>clear<span class="Delimiter">();</span> -<span id="L98" class="LineNr"> 98 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L96" class="LineNr"> 96 </span><span class="Normal">bool</span> <a href='011load.cc.html#L96'>next_instruction</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> instruction* curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L97" class="LineNr"> 97 </span> curr<span class="Delimiter">-></span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L98" class="LineNr"> 98 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> -<span id="L100" class="LineNr">100 </span> raise << <span class="Constant">"incomplete recipe at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L100" class="LineNr">100 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='010vm.cc.html#L19'>recipe</a> at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L101" class="LineNr">101 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L102" class="LineNr">102 </span> <span class="Delimiter">}</span> <span id="L103" class="LineNr">103 </span> <span id="L104" class="LineNr">104 </span> vector<string> words<span class="Delimiter">;</span> -<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> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L105" class="LineNr">105 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L106" class="LineNr">106 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> -<span id="L108" class="LineNr">108 </span> raise << <span class="Constant">"incomplete recipe at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L108" class="LineNr">108 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='010vm.cc.html#L19'>recipe</a> at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L109" class="LineNr">109 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L110" class="LineNr">110 </span> <span class="Delimiter">}</span> -<span id="L111" class="LineNr">111 </span> string word = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L111" class="LineNr">111 </span> string word = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L113" class="LineNr">113 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L114" class="LineNr">114 </span> raise << <span class="Constant">"incomplete recipe at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='010vm.cc.html#L19'>recipe</a> at <a href='003trace.cc.html#L195'>end</a> of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L115" class="LineNr">115 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L116" class="LineNr">116 </span> <span class="Delimiter">}</span> <span id="L117" class="LineNr">117 </span> words<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>word<span class="Delimiter">);</span> <span id="L118" class="LineNr">118 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L119" class="LineNr">119 </span> <span class="Delimiter">}</span> -<span id="L120" class="LineNr">120 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<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> && words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">"]"</span><span class="Delimiter">)</span> +<span id="L120" class="LineNr">120 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L121" class="LineNr">121 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>words<span class="Delimiter">)</span> == <span class="Constant">1</span> && words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> == <span class="Constant">"]"</span><span class="Delimiter">)</span> <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> <span id="L123" class="LineNr">123 </span> -<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> && 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> +<span id="L124" class="LineNr">124 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>words<span class="Delimiter">)</span> == <span class="Constant">1</span> && <a href='011load.cc.html#L178'>is_label_word</a><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> <span id="L125" class="LineNr">125 </span> curr<span class="Delimiter">-></span>is_label = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L126" class="LineNr">126 </span> curr<span class="Delimiter">-></span>label = words<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L127" class="LineNr">127 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"label: "</span> << curr<span class="Delimiter">-></span>label << end<span class="Delimiter">();</span> +<span id="L127" class="LineNr">127 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"label: "</span> << curr<span class="Delimiter">-></span>label << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<span id="L129" class="LineNr">129 </span> raise << <span class="Constant">"incomplete recipe at end of file (3)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L129" class="LineNr">129 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='010vm.cc.html#L19'>recipe</a> at <a href='003trace.cc.html#L195'>end</a> of file (3)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L130" class="LineNr">130 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L131" class="LineNr">131 </span> <span class="Delimiter">}</span> <span id="L132" class="LineNr">132 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L133" class="LineNr">133 </span> <span class="Delimiter">}</span> <span id="L134" class="LineNr">134 </span> <span id="L135" class="LineNr">135 </span> vector<string>::iterator p = words<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> -<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">"<-"</span><span class="Delimiter">)</span> != words<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">(),</span> <span class="Constant">"<-"</span><span class="Delimiter">)</span> != words<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L137" class="LineNr">137 </span> <span class="Normal">for</span> <span class="Delimiter">(;</span> *p != <span class="Constant">"<-"</span><span class="Delimiter">;</span> ++p<span class="Delimiter">)</span> <span id="L138" class="LineNr">138 </span> curr<span class="Delimiter">-></span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>*p<span class="Delimiter">));</span> <span id="L139" class="LineNr">139 </span> ++p<span class="Delimiter">;</span> <span class="Comment">// skip <-</span> <span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span> <span id="L141" class="LineNr">141 </span> -<span id="L142" class="LineNr">142 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p == words<span class="Delimiter">.</span>end<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span id="L143" class="LineNr">143 </span> raise << <span class="Constant">"instruction prematurely ended with '<-'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L142" class="LineNr">142 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p == words<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"instruction prematurely ended with '<-'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L144" class="LineNr">144 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span> <span id="L146" class="LineNr">146 </span> curr<span class="Delimiter">-></span>old_name = curr<span class="Delimiter">-></span>name = *p<span class="Delimiter">;</span> ++p<span class="Delimiter">;</span> <span id="L147" class="LineNr">147 </span> <span class="Comment">// curr->operation will be set at transform time</span> <span id="L148" class="LineNr">148 </span> -<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> +<span id="L149" class="LineNr">149 </span> <span class="Normal">for</span> <span class="Delimiter">(;</span> p != words<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span id="L150" class="LineNr">150 </span> curr<span class="Delimiter">-></span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>*p<span class="Delimiter">));</span> <span id="L151" class="LineNr">151 </span> -<span id="L152" class="LineNr">152 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction: "</span> << curr<span class="Delimiter">-></span>name << end<span class="Delimiter">();</span> -<span id="L153" class="LineNr">153 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" number of ingredients: "</span> << SIZE<span class="Delimiter">(</span>curr<span class="Delimiter">-></span>ingredients<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<span id="L154" class="LineNr">154 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<reagent>::iterator p = curr<span class="Delimiter">-></span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != curr<span class="Delimiter">-></span>ingredients<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> -<span id="L155" class="LineNr">155 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" ingredient: "</span> << to_string<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<span id="L156" class="LineNr">156 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<reagent>::iterator p = curr<span class="Delimiter">-></span>products<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != curr<span class="Delimiter">-></span>products<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> -<span id="L157" class="LineNr">157 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" product: "</span> << to_string<span class="Delimiter">(</span>*p<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L152" class="LineNr">152 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction: "</span> << curr<span class="Delimiter">-></span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L153" class="LineNr">153 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" number of ingredients: "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>curr<span class="Delimiter">-></span>ingredients<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L154" class="LineNr">154 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<reagent>::iterator p = curr<span class="Delimiter">-></span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != curr<span class="Delimiter">-></span>ingredients<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> +<span id="L155" class="LineNr">155 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" ingredient: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>*p<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L156" class="LineNr">156 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<reagent>::iterator p = curr<span class="Delimiter">-></span>products<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != curr<span class="Delimiter">-></span>products<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> +<span id="L157" class="LineNr">157 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" product: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>*p<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<span id="L159" class="LineNr">159 </span> raise << <span class="Constant">"9: unbalanced '[' for recipe</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L159" class="LineNr">159 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"9: unbalanced '[' for <a href='010vm.cc.html#L19'>recipe</a></span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L160" class="LineNr">160 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L161" class="LineNr">161 </span> <span class="Delimiter">}</span> <span id="L162" class="LineNr">162 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L163" class="LineNr">163 </span><span class="Delimiter">}</span> <span id="L164" class="LineNr">164 </span> <span id="L165" class="LineNr">165 </span><span class="Comment">// can return empty string -- only if `in` has no more data</span> -<span id="L166" class="LineNr">166 </span>string next_word<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L166" class="LineNr">166 </span>string <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L167" class="LineNr">167 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L168" class="LineNr">168 </span> <span class="Comment">// End next_word Special-cases</span> <span id="L169" class="LineNr">169 </span> ostringstream out<span class="Delimiter">;</span> -<span id="L170" class="LineNr">170 </span> slurp_word<span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span> -<span id="L171" class="LineNr">171 </span> skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L170" class="LineNr">170 </span> <a href='011load.cc.html#L192'>slurp_word</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span> +<span id="L171" class="LineNr">171 </span> <a href='011load.cc.html#L219'>skip_whitespace_and_comments_but_not_newline</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L172" class="LineNr">172 </span> string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> -<span id="L173" class="LineNr">173 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result != <span class="Constant">"["</span> && ends_with<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">'['</span><span class="Delimiter">))</span> -<span id="L174" class="LineNr">174 </span> raise << <span class="Constant">"insert a space before '[' in '"</span> << result << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L173" class="LineNr">173 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result != <span class="Constant">"["</span> && <a href='011load.cc.html#L183'>ends_with</a><span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">'['</span><span class="Delimiter">))</span> +<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"insert a space before '[' in '"</span> << result << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L175" class="LineNr">175 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L176" class="LineNr">176 </span><span class="Delimiter">}</span> <span id="L177" class="LineNr">177 </span> -<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& word<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L178" class="LineNr">178 </span><span class="Normal">bool</span> <a href='011load.cc.html#L178'>is_label_word</a><span class="Delimiter">(</span><span class="Normal">const</span> string& word<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> && string<span class="Delimiter">(</span><span class="Constant">"$_*@&,=-[]()"</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 id="L181" class="LineNr">181 </span><span class="Delimiter">}</span> <span id="L182" class="LineNr">182 </span> -<span id="L183" class="LineNr">183 </span><span class="Normal">bool</span> ends_with<span class="Delimiter">(</span><span class="Normal">const</span> string& 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 id="L183" class="LineNr">183 </span><span class="Normal">bool</span> <a href='011load.cc.html#L183'>ends_with</a><span class="Delimiter">(</span><span class="Normal">const</span> string& 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 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> <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> <span id="L186" class="LineNr">186 </span><span class="Delimiter">}</span> @@ -249,9 +249,9 @@ if ('onhashchange' in window) { <span id="L189" class="LineNr">189 </span><span class="Comment">// word boundaries</span> <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">"(){}"</span><span class="Delimiter">);</span> <span id="L191" class="LineNr">191 </span><span class="Delimiter">:(code)</span> -<span id="L192" class="LineNr">192 </span><span class="Normal">void</span> slurp_word<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L192" class="LineNr">192 </span><span class="Normal">void</span> <a href='011load.cc.html#L192'>slurp_word</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L193" class="LineNr">193 </span> <span class="Normal">char</span> c<span class="Delimiter">;</span> -<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> && 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> +<span id="L194" class="LineNr">194 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && 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> <span id="L195" class="LineNr">195 </span> in >> c<span class="Delimiter">;</span> <span id="L196" class="LineNr">196 </span> out << c<span class="Delimiter">;</span> <span id="L197" class="LineNr">197 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> @@ -265,40 +265,40 @@ if ('onhashchange' in window) { <span id="L205" class="LineNr">205 </span> <span class="Delimiter">}</span> <span id="L206" class="LineNr">206 </span><span class="Delimiter">}</span> <span id="L207" class="LineNr">207 </span> -<span id="L208" class="LineNr">208 </span><span class="Normal">void</span> skip_whitespace_and_comments<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L208" class="LineNr">208 </span><span class="Normal">void</span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> <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> -<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> +<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> <a href='011load.cc.html#L230'>skip_comment</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L214" class="LineNr">214 </span> <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L215" class="LineNr">215 </span> <span class="Delimiter">}</span> <span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span> <span id="L217" class="LineNr">217 </span> <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> -<span id="L219" class="LineNr">219 </span><span class="Normal">void</span> skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L219" class="LineNr">219 </span><span class="Normal">void</span> <a href='011load.cc.html#L219'>skip_whitespace_and_comments_but_not_newline</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> <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> <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> -<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> +<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> <a href='011load.cc.html#L230'>skip_comment</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L226" class="LineNr">226 </span> <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L227" class="LineNr">227 </span> <span class="Delimiter">}</span> <span id="L228" class="LineNr">228 </span><span class="Delimiter">}</span> <span id="L229" class="LineNr">229 </span> -<span id="L230" class="LineNr">230 </span><span class="Normal">void</span> skip_comment<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L230" class="LineNr">230 </span><span class="Normal">void</span> <a href='011load.cc.html#L230'>skip_comment</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L231" class="LineNr">231 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L232" class="LineNr">232 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> -<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> && 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 id="L233" class="LineNr">233 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && 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 id="L234" class="LineNr">234 </span> <span class="Delimiter">}</span> <span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span> <span id="L236" class="LineNr">236 </span> <span id="L237" class="LineNr">237 </span><span class="Delimiter">:(scenario recipe_instead_of_def)</span> -<span id="L238" class="LineNr">238 </span><span class="muRecipe">recipe</span> main [ +<span id="L238" class="LineNr">238 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L239" class="LineNr">239 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L240" class="LineNr">240 </span>] -<span id="L241" class="LineNr">241 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L241" class="LineNr">241 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L242" class="LineNr">242 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L243" class="LineNr">243 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L244" class="LineNr">244 </span> @@ -307,112 +307,112 @@ if ('onhashchange' in window) { <span id="L247" class="LineNr">247 </span><span class="muRecipe">def</span> f1 [ <span id="L248" class="LineNr">248 </span>] <span id="L249" class="LineNr">249 </span><span class="Comment"># this comment will go through to 'load'</span> -<span id="L250" class="LineNr">250 </span><span class="muRecipe">def</span> main [ +<span id="L250" class="LineNr">250 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L251" class="LineNr">251 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L252" class="LineNr">252 </span>] -<span id="L253" class="LineNr">253 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L253" class="LineNr">253 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L254" class="LineNr">254 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L255" class="LineNr">255 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L256" class="LineNr">256 </span> <span id="L257" class="LineNr">257 </span><span class="Delimiter">:(scenario parse_comment_amongst_instruction)</span> -<span id="L258" class="LineNr">258 </span><span class="muRecipe">def</span> main [ +<span id="L258" class="LineNr">258 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L259" class="LineNr">259 </span> <span class="Comment"># comment</span> <span id="L260" class="LineNr">260 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L261" class="LineNr">261 </span>] -<span id="L262" class="LineNr">262 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L262" class="LineNr">262 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L263" class="LineNr">263 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L264" class="LineNr">264 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L265" class="LineNr">265 </span> <span id="L266" class="LineNr">266 </span><span class="Delimiter">:(scenario parse_comment_amongst_instruction_2)</span> -<span id="L267" class="LineNr">267 </span><span class="muRecipe">def</span> main [ +<span id="L267" class="LineNr">267 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L268" class="LineNr">268 </span> <span class="Comment"># comment</span> <span id="L269" class="LineNr">269 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L270" class="LineNr">270 </span> <span class="Comment"># comment</span> <span id="L271" class="LineNr">271 </span>] -<span id="L272" class="LineNr">272 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L272" class="LineNr">272 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L273" class="LineNr">273 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L274" class="LineNr">274 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L275" class="LineNr">275 </span> <span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario parse_comment_amongst_instruction_3)</span> -<span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> main [ +<span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L278" class="LineNr">278 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L279" class="LineNr">279 </span> <span class="Comment"># comment</span> <span id="L280" class="LineNr">280 </span> <span class="Constant">2</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L281" class="LineNr">281 </span>] -<span id="L282" class="LineNr">282 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L282" class="LineNr">282 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L283" class="LineNr">283 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L284" class="LineNr">284 </span><span class="traceContains">+parse: product: {1: "number"}</span> -<span id="L285" class="LineNr">285 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L285" class="LineNr">285 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L286" class="LineNr">286 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L287" class="LineNr">287 </span><span class="traceContains">+parse: product: {2: "number"}</span> <span id="L288" class="LineNr">288 </span> <span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario parse_comment_after_instruction)</span> -<span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> main [ +<span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L291" class="LineNr">291 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span class="Comment"># comment</span> <span id="L292" class="LineNr">292 </span>] -<span id="L293" class="LineNr">293 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L293" class="LineNr">293 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L294" class="LineNr">294 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L295" class="LineNr">295 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L296" class="LineNr">296 </span> <span id="L297" class="LineNr">297 </span><span class="Delimiter">:(scenario parse_label)</span> -<span id="L298" class="LineNr">298 </span><span class="muRecipe">def</span> main [ +<span id="L298" class="LineNr">298 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L299" class="LineNr">299 </span> +foo <span id="L300" class="LineNr">300 </span>] <span id="L301" class="LineNr">301 </span><span class="traceContains">+parse: label: +foo</span> <span id="L302" class="LineNr">302 </span> <span id="L303" class="LineNr">303 </span><span class="Delimiter">:(scenario parse_dollar_as_recipe_name)</span> -<span id="L304" class="LineNr">304 </span><span class="muRecipe">def</span> main [ +<span id="L304" class="LineNr">304 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L305" class="LineNr">305 </span> $foo <span id="L306" class="LineNr">306 </span>] -<span id="L307" class="LineNr">307 </span><span class="traceContains">+parse: instruction: $foo</span> +<span id="L307" class="LineNr">307 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: $foo</span> <span id="L308" class="LineNr">308 </span> <span id="L309" class="LineNr">309 </span><span class="Delimiter">:(scenario parse_multiple_properties)</span> -<span id="L310" class="LineNr">310 </span><span class="muRecipe">def</span> main [ +<span id="L310" class="LineNr">310 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L311" class="LineNr">311 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span>/foo:bar:baz <span id="L312" class="LineNr">312 </span>] -<span id="L313" class="LineNr">313 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L313" class="LineNr">313 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L314" class="LineNr">314 </span><span class="traceContains">+parse: ingredient: {23: "literal", "foo": ("bar" "baz")}</span> <span id="L315" class="LineNr">315 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L316" class="LineNr">316 </span> <span id="L317" class="LineNr">317 </span><span class="Delimiter">:(scenario parse_multiple_products)</span> -<span id="L318" class="LineNr">318 </span><span class="muRecipe">def</span> main [ +<span id="L318" class="LineNr">318 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">23</span> <span id="L320" class="LineNr">320 </span>] -<span id="L321" class="LineNr">321 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L321" class="LineNr">321 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L322" class="LineNr">322 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L323" class="LineNr">323 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L324" class="LineNr">324 </span><span class="traceContains">+parse: product: {2: "number"}</span> <span id="L325" class="LineNr">325 </span> <span id="L326" class="LineNr">326 </span><span class="Delimiter">:(scenario parse_multiple_ingredients)</span> -<span id="L327" class="LineNr">327 </span><span class="muRecipe">def</span> main [ +<span id="L327" class="LineNr">327 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">4</span>:number <span id="L329" class="LineNr">329 </span>] -<span id="L330" class="LineNr">330 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L330" class="LineNr">330 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L331" class="LineNr">331 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L332" class="LineNr">332 </span><span class="traceContains">+parse: ingredient: {4: "number"}</span> <span id="L333" class="LineNr">333 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L334" class="LineNr">334 </span><span class="traceContains">+parse: product: {2: "number"}</span> <span id="L335" class="LineNr">335 </span> <span id="L336" class="LineNr">336 </span><span class="Delimiter">:(scenario parse_multiple_types)</span> -<span id="L337" class="LineNr">337 </span><span class="muRecipe">def</span> main [ -<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"> <- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">4</span>:number +<span id="L337" class="LineNr">337 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L338" class="LineNr">338 </span> <span class="Constant">1</span>:number<span class="Delimiter">,</span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:number<span class="Special"> <- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">4</span>:number <span id="L339" class="LineNr">339 </span>] -<span id="L340" class="LineNr">340 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L340" class="LineNr">340 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L341" class="LineNr">341 </span><span class="traceContains">+parse: ingredient: {23: "literal"}</span> <span id="L342" class="LineNr">342 </span><span class="traceContains">+parse: ingredient: {4: "number"}</span> <span id="L343" class="LineNr">343 </span><span class="traceContains">+parse: product: {1: "number"}</span> <span id="L344" class="LineNr">344 </span><span class="traceContains">+parse: product: {2: ("address" "number")}</span> <span id="L345" class="LineNr">345 </span> <span id="L346" class="LineNr">346 </span><span class="Delimiter">:(scenario parse_properties)</span> -<span id="L347" class="LineNr">347 </span><span class="muRecipe">def</span> main [ -<span id="L348" class="LineNr">348 </span> <span class="Constant">1</span>:address:number/lookup<span class="Special"> <- </span>copy <span class="Constant">23</span> +<span id="L347" class="LineNr">347 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L348" class="LineNr">348 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number/lookup<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L349" class="LineNr">349 </span>] <span id="L350" class="LineNr">350 </span><span class="traceContains">+parse: product: {1: ("address" "number"), "lookup": ()}</span> <span id="L351" class="LineNr">351 </span> <span id="L352" class="LineNr">352 </span><span class="Comment">//: this test we can't represent with a scenario</span> <span id="L353" class="LineNr">353 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L355" class="LineNr">355 </span> load<span class="Delimiter">(</span><span class="Constant">"recipe main [</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L354" class="LineNr">354 </span><span class="Normal">void</span> <a href='011load.cc.html#L354'>test_parse_comment_terminated_by_eof</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L355" class="LineNr">355 </span> load<span class="Delimiter">(</span><span class="Constant">"recipe <a href='000organization.cc.html#L113'>main</a> [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L356" class="LineNr">356 </span> <span class="Constant">" a:number <- copy 34</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L357" class="LineNr">357 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L358" class="LineNr">358 </span> <span class="Constant">"# abc"</span><span class="Delimiter">);</span> <span class="Comment">// no newline after comment</span> @@ -434,34 +434,34 @@ if ('onhashchange' in window) { <span id="L374" class="LineNr">374 </span><span class="Delimiter">:(before "End Setup")</span> <span id="L375" class="LineNr">375 </span>Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L376" class="LineNr">376 </span><span class="Delimiter">:(code)</span> -<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& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L377" class="LineNr">377 </span><span class="Normal">bool</span> <a href='011load.cc.html#L377'>should_check_for_redefine</a><span class="Delimiter">(</span><span class="Normal">const</span> string& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L379" class="LineNr">379 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L380" class="LineNr">380 </span><span class="Delimiter">}</span> <span id="L381" class="LineNr">381 </span> <span id="L382" class="LineNr">382 </span><span class="Delimiter">:(scenario forbid_redefining_recipes)</span> <span id="L383" class="LineNr">383 </span><span class="Special">% Hide_errors = true;</span> -<span id="L384" class="LineNr">384 </span><span class="muRecipe">def</span> main [ +<span id="L384" class="LineNr">384 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L385" class="LineNr">385 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L386" class="LineNr">386 </span>] -<span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> main [ +<span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L388" class="LineNr">388 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">24</span> <span id="L389" class="LineNr">389 </span>] -<span id="L390" class="LineNr">390 </span><span class="traceContains">+error: redefining recipe main</span> +<span id="L390" class="LineNr">390 </span><span class="traceContains">+error: redefining <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L391" class="LineNr">391 </span> <span id="L392" class="LineNr">392 </span><span class="Delimiter">:(scenario permit_forcibly_redefining_recipes)</span> -<span id="L393" class="LineNr">393 </span><span class="muRecipe">def</span> main [ +<span id="L393" class="LineNr">393 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L394" class="LineNr">394 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L395" class="LineNr">395 </span>] -<span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span>! main [ +<span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span>! <a href='000organization.cc.html#L113'>main</a> [ <span id="L397" class="LineNr">397 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">24</span> <span id="L398" class="LineNr">398 </span>] -<span id="L399" class="LineNr">399 </span><span class="traceAbsent">-error: redefining recipe main</span> +<span id="L399" class="LineNr">399 </span><span class="traceAbsent">-error: redefining <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L400" class="LineNr">400 </span>$error: <span class="Constant">0</span> <span id="L401" class="LineNr">401 </span> <span id="L402" class="LineNr">402 </span><span class="Delimiter">:(code)</span> <span id="L403" class="LineNr">403 </span><span class="Comment">// for debugging</span> -<span id="L404" class="LineNr">404 </span><span class="Normal">void</span> show_rest_of_stream<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L404" class="LineNr">404 </span><span class="Normal">void</span> <a href='011load.cc.html#L404'>show_rest_of_stream</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L405" class="LineNr">405 </span> cerr << <span class="Constant">'^'</span><span class="Delimiter">;</span> <span id="L406" class="LineNr">406 </span> <span class="Normal">char</span> c<span class="Delimiter">;</span> <span id="L407" class="LineNr">407 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>in >> c<span class="Delimiter">)</span> diff --git a/html/012transform.cc.html b/html/012transform.cc.html index fd22fe9e..f888d173 100644 --- a/html/012transform.cc.html +++ b/html/012transform.cc.html @@ -71,21 +71,21 @@ if ('onhashchange' in window) { <span id="L16" class="LineNr"> 16 </span><span class="Comment">//: c) Even so you'll periodically need to try adjusting each transform</span> <span id="L17" class="LineNr"> 17 </span><span class="Comment">//: relative to those in previous layers to find a better arrangement.</span> <span id="L18" class="LineNr"> 18 </span> -<span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(before "End recipe Fields")</span> +<span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Fields")</span> <span id="L20" class="LineNr"> 20 </span><span class="Normal">int</span> transformed_until<span class="Delimiter">;</span> -<span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(before "End recipe Constructor")</span> +<span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Constructor")</span> <span id="L22" class="LineNr"> 22 </span>transformed_until = -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L23" class="LineNr"> 23 </span> <span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before "End Types")</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a><span class="Delimiter">);</span> <span id="L26" class="LineNr"> 26 </span> <span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L28" class="LineNr"> 28 </span>vector<transform_fn> Transform<span class="Delimiter">;</span> <span id="L29" class="LineNr"> 29 </span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before "End One-time Setup")</span> -<span id="L31" class="LineNr"> 31 </span>initialize_transforms<span class="Delimiter">();</span> +<span id="L31" class="LineNr"> 31 </span><a href='012transform.cc.html#L33'>initialize_transforms</a><span class="Delimiter">();</span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(code)</span> -<span id="L33" class="LineNr"> 33 </span><span class="Normal">void</span> initialize_transforms<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L33" class="LineNr"> 33 </span><span class="Normal">void</span> <a href='012transform.cc.html#L33'>initialize_transforms</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L34" class="LineNr"> 34 </span> <span class="Comment">// Begin Transforms</span> <span id="L35" class="LineNr"> 35 </span> <span class="Comment">// Begin Instruction Inserting/Deleting Transforms</span> <span id="L36" class="LineNr"> 36 </span> <span class="Comment">// End Instruction Inserting/Deleting Transforms</span> @@ -98,18 +98,18 @@ if ('onhashchange' in window) { <span id="L43" class="LineNr"> 43 </span> <span class="Comment">// End Checks</span> <span id="L44" class="LineNr"> 44 </span><span class="Delimiter">}</span> <span id="L45" class="LineNr"> 45 </span> -<span id="L46" class="LineNr"> 46 </span><span class="Normal">void</span> transform_all<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L47" class="LineNr"> 47 </span> trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"=== transform_all()"</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span> ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L49" class="LineNr"> 49 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L46" class="LineNr"> 46 </span><span class="Normal">void</span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"=== transform_all()"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Transform<span class="Delimiter">);</span> ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L49" class="LineNr"> 49 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L50" class="LineNr"> 50 </span> recipe& r = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <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> <span id="L52" class="LineNr"> 52 </span> <span class="Comment">// End Transform Checks</span> -<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">-></span>first<span class="Delimiter">);</span> +<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"><a href='010vm.cc.html#L14'>recipe_ordinal</a></span><span class="Comment">*/</span>p<span class="Delimiter">-></span>first<span class="Delimiter">);</span> <span id="L54" class="LineNr"> 54 </span> r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span> <span id="L55" class="LineNr"> 55 </span> <span class="Delimiter">}</span> <span id="L56" class="LineNr"> 56 </span> <span class="Delimiter">}</span> -<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> +<span id="L57" class="LineNr"> 57 </span> <a href='012transform.cc.html#L73'>parse_int_reagents</a><span class="Delimiter">();</span> <span class="Comment">// do this after all other transforms have run</span> <span id="L58" class="LineNr"> 58 </span> <span class="Comment">// End transform_all</span> <span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span> <span id="L60" class="LineNr"> 60 </span> @@ -125,34 +125,34 @@ if ('onhashchange' in window) { <span id="L70" class="LineNr"> 70 </span> ++Num_calls_to_transform_all<span class="Delimiter">;</span> <span id="L71" class="LineNr"> 71 </span> <span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(code)</span> -<span id="L73" class="LineNr"> 73 </span><span class="Normal">void</span> parse_int_reagents<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L74" class="LineNr"> 74 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- parsing any uninitialized reagents as integers"</span> << end<span class="Delimiter">();</span> -<span id="L75" class="LineNr"> 75 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L73" class="LineNr"> 73 </span><span class="Normal">void</span> <a href='012transform.cc.html#L73'>parse_int_reagents</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L74" class="LineNr"> 74 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- parsing any uninitialized reagents as integers"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L75" class="LineNr"> 75 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L76" class="LineNr"> 76 </span> recipe& r = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <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> -<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 < SIZE<span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L79" class="LineNr"> 79 </span> instruction& inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> -<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 < 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 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L81" class="LineNr"> 81 </span> <a href='012transform.cc.html#L90'>populate_value</a><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 id="L82" class="LineNr"> 82 </span> <span class="Delimiter">}</span> -<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 < 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 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L84" class="LineNr"> 84 </span> <a href='012transform.cc.html#L90'>populate_value</a><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 id="L85" class="LineNr"> 85 </span> <span class="Delimiter">}</span> <span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">}</span> <span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span> <span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span> <span id="L89" class="LineNr"> 89 </span> -<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> populate_value<span class="Delimiter">(</span>reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L90" class="LineNr"> 90 </span><span class="Normal">void</span> <a href='012transform.cc.html#L90'>populate_value</a><span class="Delimiter">(</span>reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L92" class="LineNr"> 92 </span> <span class="Comment">// End Reagent-parsing Exceptions</span> <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> -<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> +<span id="L94" class="LineNr"> 94 </span> r<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">));</span> <span id="L95" class="LineNr"> 95 </span><span class="Delimiter">}</span> <span id="L96" class="LineNr"> 96 </span> <span id="L97" class="LineNr"> 97 </span><span class="Comment">// helper for tests -- temporarily suppress run</span> -<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> +<span id="L98" class="LineNr"> 98 </span><span class="Normal">void</span> <a href='012transform.cc.html#L98'>transform</a><span class="Delimiter">(</span>string form<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L99" class="LineNr"> 99 </span> load<span class="Delimiter">(</span>form<span class="Delimiter">);</span> -<span id="L100" class="LineNr">100 </span> transform_all<span class="Delimiter">();</span> +<span id="L100" class="LineNr">100 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> <span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span> </pre> </body> diff --git a/html/013update_operation.cc.html b/html/013update_operation.cc.html index fb6a12b7..0ef4d597 100644 --- a/html/013update_operation.cc.html +++ b/html/013update_operation.cc.html @@ -62,18 +62,18 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span><span class="Comment">//: nothing's undefined.</span> <span id="L3" class="LineNr"> 3 </span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(before "End Instruction Modifying Transforms")</span> -<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> +<span id="L5" class="LineNr"> 5 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='013update_operation.cc.html#L8'>update_instruction_operations</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L6" class="LineNr"> 6 </span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L9" class="LineNr"> 9 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- compute instruction operations for recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> +<span id="L8" class="LineNr"> 8 </span><span class="Normal">void</span> <a href='013update_operation.cc.html#L8'>update_instruction_operations</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- compute <a href='010vm.cc.html#L32'>instruction</a> operations for <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L10" class="LineNr">10 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L11" class="LineNr">11 </span><span class="CommentedCode">//? cerr << "--- compute instruction operations for recipe " << caller.name << '\n';</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L13" class="LineNr">13 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="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> <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> -<span id="L16" class="LineNr">16 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"instruction '"</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">"' has no recipe</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L16" class="LineNr">16 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"instruction '"</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">"' has no <a href='010vm.cc.html#L19'>recipe</a></span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L17" class="LineNr">17 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L18" class="LineNr">18 </span> <span class="Delimiter">}</span> <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> @@ -82,17 +82,17 @@ if ('onhashchange' in window) { <span id="L22" class="LineNr">22 </span><span class="Delimiter">}</span> <span id="L23" class="LineNr">23 </span> <span id="L24" class="LineNr">24 </span><span class="Comment">// hook to suppress inserting recipe name into errors</span> -<span id="L25" class="LineNr">25 </span>string maybe<span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L25" class="LineNr">25 </span>string <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>string s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L26" class="LineNr">26 </span> <span class="Identifier">return</span> s + <span class="Constant">": "</span><span class="Delimiter">;</span> <span id="L27" class="LineNr">27 </span><span class="Delimiter">}</span> <span id="L28" class="LineNr">28 </span> <span id="L29" class="LineNr">29 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L30" class="LineNr">30 </span><span class="Delimiter">:(scenario missing_arrow)</span> <span id="L31" class="LineNr">31 </span><span class="Special">% Hide_errors = true;</span> -<span id="L32" class="LineNr">32 </span><span class="muRecipe">def</span> main [ +<span id="L32" class="LineNr">32 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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 '<-'</span> <span id="L34" class="LineNr">34 </span>] -<span id="L35" class="LineNr">35 </span><span class="traceContains">+error: main: instruction '1:number' has no recipe</span> +<span id="L35" class="LineNr">35 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L32'>instruction</a> '1:number' has no <a href='010vm.cc.html#L19'>recipe</a></span> </pre> </body> </html> diff --git a/html/014literal_string.cc.html b/html/014literal_string.cc.html index 9bea5520..aee55650 100644 --- a/html/014literal_string.cc.html +++ b/html/014literal_string.cc.html @@ -67,42 +67,42 @@ if ('onhashchange' in window) { <span id="L8" class="LineNr"> 8 </span> <span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(scenarios load)</span> <span id="L10" class="LineNr"> 10 </span><span class="Delimiter">:(scenario string_literal)</span> -<span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> main [ -<span id="L12" class="LineNr"> 12 </span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>copy [abc def] +<span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L12" class="LineNr"> 12 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:character<span class="Special"> <- </span>copy [abc def] <span id="L13" class="LineNr"> 13 </span>] <span id="L14" class="LineNr"> 14 </span><span class="traceContains">+parse: ingredient: {"abc def": "literal-string"}</span> <span id="L15" class="LineNr"> 15 </span> <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(scenario string_literal_with_colons)</span> -<span id="L17" class="LineNr"> 17 </span><span class="muRecipe">def</span> main [ -<span id="L18" class="LineNr"> 18 </span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>copy [abc:def/ghi] +<span id="L17" class="LineNr"> 17 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L18" class="LineNr"> 18 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:character<span class="Special"> <- </span>copy [abc:def/ghi] <span id="L19" class="LineNr"> 19 </span>] <span id="L20" class="LineNr"> 20 </span><span class="traceContains">+parse: ingredient: {"abc:def/ghi": "literal-string"}</span> <span id="L21" class="LineNr"> 21 </span> <span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L23" class="LineNr"> 23 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"literal-string"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L23" class="LineNr"> 23 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"literal-string"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L24" class="LineNr"> 24 </span> -<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "End next_word Special-cases")</span> +<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "End <a href='011load.cc.html#L166'>next_word</a> Special-cases")</span> <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> -<span id="L27" class="LineNr"> 27 </span> string result = slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L28" class="LineNr"> 28 </span> skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L27" class="LineNr"> 27 </span> string result = <a href='014literal_string.cc.html#L33'>slurp_quoted</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L28" class="LineNr"> 28 </span> <a href='011load.cc.html#L219'>skip_whitespace_and_comments_but_not_newline</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L29" class="LineNr"> 29 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">}</span> <span id="L31" class="LineNr"> 31 </span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(code)</span> -<span id="L33" class="LineNr"> 33 </span>string slurp_quoted<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L33" class="LineNr"> 33 </span>string <a href='014literal_string.cc.html#L33'>slurp_quoted</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L34" class="LineNr"> 34 </span> ostringstream out<span class="Delimiter">;</span> -<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 << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span> <span class="Comment">// slurp the '['</span> -<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> -<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> +<span id="L35" class="LineNr"> 35 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><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 << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span> <span class="Comment">// slurp the '['</span> +<span id="L36" class="LineNr"> 36 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L45'>is_code_string</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">))</span> +<span id="L37" class="LineNr"> 37 </span> <a href='014literal_string.cc.html#L82'>slurp_quoted_comment_aware</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L38" class="LineNr"> 38 </span> <span class="Normal">else</span> -<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> +<span id="L39" class="LineNr"> 39 </span> <a href='014literal_string.cc.html#L62'>slurp_quoted_comment_oblivious</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L40" class="LineNr"> 40 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">}</span> <span id="L42" class="LineNr"> 42 </span> <span id="L43" class="LineNr"> 43 </span><span class="Comment">// A string is a code string (ignores comments when scanning for matching</span> <span id="L44" class="LineNr"> 44 </span><span class="Comment">// brackets) if it contains a newline at the start before any non-whitespace.</span> -<span id="L45" class="LineNr"> 45 </span><span class="Normal">bool</span> is_code_string<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L45" class="LineNr"> 45 </span><span class="Normal">bool</span> <a href='014literal_string.cc.html#L45'>is_code_string</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L46" class="LineNr"> 46 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L47" class="LineNr"> 47 </span> <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <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> <span id="L49" class="LineNr"> 49 </span> in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span> @@ -118,12 +118,12 @@ if ('onhashchange' in window) { <span id="L59" class="LineNr"> 59 </span> <span id="L60" class="LineNr"> 60 </span><span class="Comment">// Read a regular string. Regular strings can only contain other regular</span> <span id="L61" class="LineNr"> 61 </span><span class="Comment">// strings.</span> -<span id="L62" class="LineNr"> 62 </span><span class="Normal">void</span> slurp_quoted_comment_oblivious<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L62" class="LineNr"> 62 </span><span class="Normal">void</span> <a href='014literal_string.cc.html#L62'>slurp_quoted_comment_oblivious</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L63" class="LineNr"> 63 </span> <span class="Normal">int</span> brace_depth = <span class="Constant">1</span><span class="Delimiter">;</span> -<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> +<span id="L64" class="LineNr"> 64 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L65" class="LineNr"> 65 </span> <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <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> -<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> +<span id="L67" class="LineNr"> 67 </span> <a href='014literal_string.cc.html#L148'>slurp_one_past_backslashes</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L68" class="LineNr"> 68 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L69" class="LineNr"> 69 </span> <span class="Delimiter">}</span> <span id="L70" class="LineNr"> 70 </span> out << c<span class="Delimiter">;</span> @@ -132,44 +132,44 @@ if ('onhashchange' in window) { <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> <span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">}</span> <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> && brace_depth > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L76" class="LineNr"> 76 </span> raise << <span class="Constant">"unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L77" class="LineNr"> 77 </span> out<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L76" class="LineNr"> 76 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L77" class="LineNr"> 77 </span> out<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L78" class="LineNr"> 78 </span> <span class="Delimiter">}</span> <span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span> <span id="L80" class="LineNr"> 80 </span> <span id="L81" class="LineNr"> 81 </span><span class="Comment">// Read a code string. Code strings can contain either code or regular strings.</span> -<span id="L82" class="LineNr"> 82 </span><span class="Normal">void</span> slurp_quoted_comment_aware<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L82" class="LineNr"> 82 </span><span class="Normal">void</span> <a href='014literal_string.cc.html#L82'>slurp_quoted_comment_aware</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L83" class="LineNr"> 83 </span> <span class="Normal">char</span> c<span class="Delimiter">;</span> <span id="L84" class="LineNr"> 84 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>in >> c<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<span id="L86" class="LineNr"> 86 </span> <a href='014literal_string.cc.html#L148'>slurp_one_past_backslashes</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L87" class="LineNr"> 87 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span> <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> <span id="L90" class="LineNr"> 90 </span> out << c<span class="Delimiter">;</span> -<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> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span> +<span id="L91" class="LineNr"> 91 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">());</span> <span id="L92" class="LineNr"> 92 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">}</span> <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> <span id="L95" class="LineNr"> 95 </span> in<span class="Delimiter">.</span>putback<span class="Delimiter">(</span>c<span class="Delimiter">);</span> <span id="L96" class="LineNr"> 96 </span> <span class="Comment">// recurse</span> -<span id="L97" class="LineNr"> 97 </span> out << slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L97" class="LineNr"> 97 </span> out << <a href='014literal_string.cc.html#L33'>slurp_quoted</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L98" class="LineNr"> 98 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">}</span> <span id="L100" class="LineNr">100 </span> out << c<span class="Delimiter">;</span> <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> <span id="L102" class="LineNr">102 </span> <span class="Delimiter">}</span> -<span id="L103" class="LineNr">103 </span> raise << <span class="Constant">"unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L104" class="LineNr">104 </span> out<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L103" class="LineNr">103 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L104" class="LineNr">104 </span> out<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L105" class="LineNr">105 </span><span class="Delimiter">}</span> <span id="L106" class="LineNr">106 </span> <span id="L107" class="LineNr">107 </span><span class="Delimiter">:(after "Parsing reagent(string s)")</span> -<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">"["</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L108" class="LineNr">108 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">"["</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> <span id="L110" class="LineNr">110 </span> name = s<span class="Delimiter">;</span> <span id="L111" class="LineNr">111 </span> <span class="Comment">// delete [] delimiters</span> <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> -<span id="L113" class="LineNr">113 </span> strip_last<span class="Delimiter">(</span>name<span class="Delimiter">);</span> +<span id="L113" class="LineNr">113 </span> <a href='014literal_string.cc.html#L144'>strip_last</a><span class="Delimiter">(</span>name<span class="Delimiter">);</span> <span id="L114" class="LineNr">114 </span> type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">"literal-string"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L115" class="LineNr">115 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span> @@ -178,33 +178,33 @@ if ('onhashchange' in window) { <span id="L119" class="LineNr">119 </span><span class="Comment">//: more friendly to trace().</span> <span id="L120" class="LineNr">120 </span> <span id="L121" class="LineNr">121 </span><span class="Delimiter">:(after "string to_string(const reagent& r)")</span> -<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> -<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> +<span id="L122" class="LineNr">122 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span>r<span class="Delimiter">))</span> +<span id="L123" class="LineNr">123 </span> <span class="Identifier">return</span> <a href='014literal_string.cc.html#L130'>emit_literal_string</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">);</span> <span id="L124" class="LineNr">124 </span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">:(code)</span> -<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& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L126" class="LineNr">126 </span><span class="Normal">bool</span> <a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L127" class="LineNr">127 </span> <span class="Identifier">return</span> x<span class="Delimiter">.</span>type && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name == <span class="Constant">"literal-string"</span><span class="Delimiter">;</span> <span id="L128" class="LineNr">128 </span><span class="Delimiter">}</span> <span id="L129" class="LineNr">129 </span> -<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> +<span id="L130" class="LineNr">130 </span>string <a href='014literal_string.cc.html#L130'>emit_literal_string</a><span class="Delimiter">(</span>string name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L131" class="LineNr">131 </span> <span class="Normal">size_t</span> pos = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L132" class="LineNr">132 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>pos != string::npos<span class="Delimiter">)</span> -<span id="L133" class="LineNr">133 </span> pos = replace<span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\\</span><span class="Constant">n"</span><span class="Delimiter">,</span> pos<span class="Delimiter">);</span> +<span id="L133" class="LineNr">133 </span> pos = <a href='014literal_string.cc.html#L137'>replace</a><span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\\</span><span class="Constant">n"</span><span class="Delimiter">,</span> pos<span class="Delimiter">);</span> <span id="L134" class="LineNr">134 </span> <span class="Identifier">return</span> <span class="Constant">"{</span><span class="cSpecial">\"</span><span class="Constant">"</span>+name+<span class="Constant">"</span><span class="cSpecial">\"</span><span class="Constant">: </span><span class="cSpecial">\"</span><span class="Constant">literal-string</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">;</span> <span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span> <span id="L136" class="LineNr">136 </span> -<span id="L137" class="LineNr">137 </span><span class="Normal">size_t</span> replace<span class="Delimiter">(</span>string& str<span class="Delimiter">,</span> <span class="Normal">const</span> string& from<span class="Delimiter">,</span> <span class="Normal">const</span> string& to<span class="Delimiter">,</span> <span class="Normal">size_t</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L137" class="LineNr">137 </span><span class="Normal">size_t</span> <a href='014literal_string.cc.html#L137'>replace</a><span class="Delimiter">(</span>string& str<span class="Delimiter">,</span> <span class="Normal">const</span> string& from<span class="Delimiter">,</span> <span class="Normal">const</span> string& to<span class="Delimiter">,</span> <span class="Normal">size_t</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L139" class="LineNr">139 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result != string::npos<span class="Delimiter">)</span> -<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> +<span id="L140" class="LineNr">140 </span> str<span class="Delimiter">.</span><a href='014literal_string.cc.html#L137'>replace</a><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 id="L141" class="LineNr">141 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L142" class="LineNr">142 </span><span class="Delimiter">}</span> <span id="L143" class="LineNr">143 </span> -<span id="L144" class="LineNr">144 </span><span class="Normal">void</span> strip_last<span class="Delimiter">(</span>string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L144" class="LineNr">144 </span><span class="Normal">void</span> <a href='014literal_string.cc.html#L144'>strip_last</a><span class="Delimiter">(</span>string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span> <span id="L146" class="LineNr">146 </span><span class="Delimiter">}</span> <span id="L147" class="LineNr">147 </span> -<span id="L148" class="LineNr">148 </span><span class="Normal">void</span> slurp_one_past_backslashes<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L148" class="LineNr">148 </span><span class="Normal">void</span> <a href='014literal_string.cc.html#L148'>slurp_one_past_backslashes</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L149" class="LineNr">149 </span> <span class="Comment">// When you encounter a backslash, strip it out and pass through any</span> <span id="L150" class="LineNr">150 </span> <span class="Comment">// following run of backslashes. If we 'escaped' a single following</span> <span id="L151" class="LineNr">151 </span> <span class="Comment">// character, then the character '\' would be:</span> @@ -219,7 +219,7 @@ if ('onhashchange' in window) { <span id="L160" class="LineNr">160 </span> <span class="Comment">// special characters. So Mu doesn't follow C's approach of overloading</span> <span id="L161" class="LineNr">161 </span> <span class="Comment">// backslashes both to escape quote characters and also as a notation for</span> <span id="L162" class="LineNr">162 </span> <span class="Comment">// unprintable characters like '\n'.</span> -<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> +<span id="L163" class="LineNr">163 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L164" class="LineNr">164 </span> <span class="Normal">char</span> c = in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <span id="L165" class="LineNr">165 </span> out << c<span class="Delimiter">;</span> <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> @@ -227,43 +227,43 @@ if ('onhashchange' in window) { <span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span> <span id="L169" class="LineNr">169 </span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">:(scenario string_literal_nested)</span> -<span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> main [ -<span id="L172" class="LineNr">172 </span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>copy [abc [def]] +<span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L172" class="LineNr">172 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:character<span class="Special"> <- </span>copy [abc [def]] <span id="L173" class="LineNr">173 </span>] <span id="L174" class="LineNr">174 </span><span class="traceContains">+parse: ingredient: {"abc [def]": "literal-string"}</span> <span id="L175" class="LineNr">175 </span> <span id="L176" class="LineNr">176 </span><span class="Delimiter">:(scenario string_literal_escaped)</span> -<span id="L177" class="LineNr">177 </span><span class="muRecipe">def</span> main [ -<span id="L178" class="LineNr">178 </span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>copy [abc \[def] +<span id="L177" class="LineNr">177 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L178" class="LineNr">178 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:character<span class="Special"> <- </span>copy [abc \[def] <span id="L179" class="LineNr">179 </span>] <span id="L180" class="LineNr">180 </span><span class="traceContains">+parse: ingredient: {"abc [def": "literal-string"}</span> <span id="L181" class="LineNr">181 </span> <span id="L182" class="LineNr">182 </span><span class="Delimiter">:(scenario string_literal_escaped_twice)</span> -<span id="L183" class="LineNr">183 </span><span class="muRecipe">def</span> main [ -<span id="L184" class="LineNr">184 </span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>copy [ +<span id="L183" class="LineNr">183 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L184" class="LineNr">184 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:character<span class="Special"> <- </span>copy [ <span id="L185" class="LineNr">185 </span>abc \\[def] <span id="L186" class="LineNr">186 </span>] <span id="L187" class="LineNr">187 </span><span class="traceContains">+parse: ingredient: {"\nabc \[def": "literal-string"}</span> <span id="L188" class="LineNr">188 </span> <span id="L189" class="LineNr">189 </span><span class="Delimiter">:(scenario string_literal_and_comment)</span> -<span id="L190" class="LineNr">190 </span><span class="muRecipe">def</span> main [ -<span id="L191" class="LineNr">191 </span> <span class="Constant">1</span>:address:array:character<span class="Special"> <- </span>copy [abc] <span class="Comment"># comment</span> +<span id="L190" class="LineNr">190 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L191" class="LineNr">191 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:character<span class="Special"> <- </span>copy [abc] <span class="Comment"># comment</span> <span id="L192" class="LineNr">192 </span>] -<span id="L193" class="LineNr">193 </span><span class="traceContains">+parse: --- defining main</span> -<span id="L194" class="LineNr">194 </span><span class="traceContains">+parse: instruction: copy</span> +<span id="L193" class="LineNr">193 </span><span class="traceContains">+parse: --- defining <a href='000organization.cc.html#L113'>main</a></span> +<span id="L194" class="LineNr">194 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L32'>instruction</a>: copy</span> <span id="L195" class="LineNr">195 </span><span class="traceContains">+parse: number of ingredients: 1</span> <span id="L196" class="LineNr">196 </span><span class="traceContains">+parse: ingredient: {"abc": "literal-string"}</span> <span id="L197" class="LineNr">197 </span><span class="traceContains">+parse: product: {1: ("address" "array" "character")}</span> <span id="L198" class="LineNr">198 </span> <span id="L199" class="LineNr">199 </span><span class="Delimiter">:(scenario string_literal_escapes_newlines_in_trace)</span> -<span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> main [ +<span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L201" class="LineNr">201 </span> copy [abc <span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span>] <span id="L203" class="LineNr">203 </span>] <span id="L204" class="LineNr">204 </span><span class="traceContains">+parse: ingredient: {"abc\ndef": "literal-string"}</span> <span id="L205" class="LineNr">205 </span> <span id="L206" class="LineNr">206 </span><span class="Delimiter">:(scenario string_literal_can_skip_past_comments)</span> -<span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> main [ +<span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L208" class="LineNr">208 </span> copy [ <span id="L209" class="LineNr">209 </span> <span class="Comment"># ']' inside comment</span> <span id="L210" class="LineNr">210 </span> bar @@ -272,7 +272,7 @@ if ('onhashchange' in window) { <span id="L213" class="LineNr">213 </span><span class="traceContains">+parse: ingredient: {"\n # ']' inside comment\n bar\n ": "literal-string"}</span> <span id="L214" class="LineNr">214 </span> <span id="L215" class="LineNr">215 </span><span class="Delimiter">:(scenario string_literal_empty)</span> -<span id="L216" class="LineNr">216 </span><span class="muRecipe">def</span> main [ +<span id="L216" class="LineNr">216 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L217" class="LineNr">217 </span> copy [] <span id="L218" class="LineNr">218 </span>] <span id="L219" class="LineNr">219 </span><span class="traceContains">+parse: ingredient: {"": "literal-string"}</span> diff --git a/html/015literal_noninteger.cc.html b/html/015literal_noninteger.cc.html index 4dde2095..56426f3d 100644 --- a/html/015literal_noninteger.cc.html +++ b/html/015literal_noninteger.cc.html @@ -61,48 +61,48 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenarios load)</span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario noninteger_literal)</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Constant">3.14159</span> <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span><span class="traceContains">+parse: ingredient: {3.14159: "literal-fractional-number"}</span> <span id="L9" class="LineNr"> 9 </span> <span id="L10" class="LineNr">10 </span><span class="Delimiter">:(after "Parsing reagent(string s)")</span> -<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> +<span id="L11" class="LineNr">11 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='015literal_noninteger.cc.html#L19'>is_noninteger</a><span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L12" class="LineNr">12 </span> name = s<span class="Delimiter">;</span> <span id="L13" class="LineNr">13 </span> type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">"literal-fractional-number"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L14" class="LineNr">14 </span> set_value<span class="Delimiter">(</span>to_double<span class="Delimiter">(</span>s<span class="Delimiter">));</span> +<span id="L14" class="LineNr">14 </span> <a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='015literal_noninteger.cc.html#L26'>to_double</a><span class="Delimiter">(</span>s<span class="Delimiter">));</span> <span id="L15" class="LineNr">15 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L16" class="LineNr">16 </span><span class="Delimiter">}</span> <span id="L17" class="LineNr">17 </span> <span id="L18" class="LineNr">18 </span><span class="Delimiter">:(code)</span> -<span id="L19" class="LineNr">19 </span><span class="Normal">bool</span> is_noninteger<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L19" class="LineNr">19 </span><span class="Normal">bool</span> <a href='015literal_noninteger.cc.html#L19'>is_noninteger</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"0123456789-."</span><span class="Delimiter">)</span> == string::npos <span class="Comment">// no other characters</span> <span id="L21" class="LineNr">21 </span> && s<span class="Delimiter">.</span>find_first_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos <span class="Comment">// at least one digit</span> <span id="L22" class="LineNr">22 </span> && 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> -<span id="L23" class="LineNr">23 </span> && 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 id="L23" class="LineNr">23 </span> && std::count<span class="Delimiter">(</span>s<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> s<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><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 id="L24" class="LineNr">24 </span><span class="Delimiter">}</span> <span id="L25" class="LineNr">25 </span> -<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> -<span id="L27" class="LineNr">27 </span> <span class="Normal">char</span>* end = <span class="Constant">NULL</span><span class="Delimiter">;</span> +<span id="L26" class="LineNr">26 </span><span class="Normal">double</span> <a href='015literal_noninteger.cc.html#L26'>to_double</a><span class="Delimiter">(</span>string n<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L27" class="LineNr">27 </span> <span class="Normal">char</span>* <a href='003trace.cc.html#L195'>end</a> = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L28" class="LineNr">28 </span> <span class="Comment">// safe because string.c_str() is guaranteed to be null-terminated</span> <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> &end<span class="Delimiter">);</span> <span id="L30" class="LineNr">30 </span> assert<span class="Delimiter">(</span>*end == <span class="cSpecial">'\0'</span><span class="Delimiter">);</span> <span id="L31" class="LineNr">31 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L32" class="LineNr">32 </span><span class="Delimiter">}</span> <span id="L33" class="LineNr">33 </span> -<span id="L34" class="LineNr">34 </span><span class="Normal">void</span> test_is_noninteger<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L35" class="LineNr">35 </span> CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"1234"</span><span class="Delimiter">));</span> -<span id="L36" class="LineNr">36 </span> CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"1a2"</span><span class="Delimiter">));</span> -<span id="L37" class="LineNr">37 </span> CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">"234.0"</span><span class="Delimiter">));</span> -<span id="L38" class="LineNr">38 </span> CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"..."</span><span class="Delimiter">));</span> -<span id="L39" class="LineNr">39 </span> CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"."</span><span class="Delimiter">));</span> -<span id="L40" class="LineNr">40 </span> CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">"2."</span><span class="Delimiter">));</span> -<span id="L41" class="LineNr">41 </span> CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">".2"</span><span class="Delimiter">));</span> -<span id="L42" class="LineNr">42 </span> CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">"-.2"</span><span class="Delimiter">));</span> -<span id="L43" class="LineNr">43 </span> CHECK<span class="Delimiter">(</span>is_noninteger<span class="Delimiter">(</span><span class="Constant">"-2."</span><span class="Delimiter">));</span> -<span id="L44" class="LineNr">44 </span> CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"--.2"</span><span class="Delimiter">));</span> -<span id="L45" class="LineNr">45 </span> CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">".-2"</span><span class="Delimiter">));</span> -<span id="L46" class="LineNr">46 </span> CHECK<span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"..2"</span><span class="Delimiter">));</span> +<span id="L34" class="LineNr">34 </span><span class="Normal">void</span> <a href='015literal_noninteger.cc.html#L34'>test_is_noninteger</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L35" class="LineNr">35 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"1234"</span><span class="Delimiter">));</span> +<span id="L36" class="LineNr">36 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"1a2"</span><span class="Delimiter">));</span> +<span id="L37" class="LineNr">37 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='015literal_noninteger.cc.html#L19'>is_noninteger</a><span class="Delimiter">(</span><span class="Constant">"234.0"</span><span class="Delimiter">));</span> +<span id="L38" class="LineNr">38 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"..."</span><span class="Delimiter">));</span> +<span id="L39" class="LineNr">39 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"."</span><span class="Delimiter">));</span> +<span id="L40" class="LineNr">40 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='015literal_noninteger.cc.html#L19'>is_noninteger</a><span class="Delimiter">(</span><span class="Constant">"2."</span><span class="Delimiter">));</span> +<span id="L41" class="LineNr">41 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='015literal_noninteger.cc.html#L19'>is_noninteger</a><span class="Delimiter">(</span><span class="Constant">".2"</span><span class="Delimiter">));</span> +<span id="L42" class="LineNr">42 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='015literal_noninteger.cc.html#L19'>is_noninteger</a><span class="Delimiter">(</span><span class="Constant">"-.2"</span><span class="Delimiter">));</span> +<span id="L43" class="LineNr">43 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span><a href='015literal_noninteger.cc.html#L19'>is_noninteger</a><span class="Delimiter">(</span><span class="Constant">"-2."</span><span class="Delimiter">));</span> +<span id="L44" class="LineNr">44 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"--.2"</span><span class="Delimiter">));</span> +<span id="L45" class="LineNr">45 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">".-2"</span><span class="Delimiter">));</span> +<span id="L46" class="LineNr">46 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!is_noninteger<span class="Delimiter">(</span><span class="Constant">"..2"</span><span class="Delimiter">));</span> <span id="L47" class="LineNr">47 </span><span class="Delimiter">}</span> </pre> </body> diff --git a/html/016dilated_reagent.cc.html b/html/016dilated_reagent.cc.html index 6729408b..1cafe6cf 100644 --- a/html/016dilated_reagent.cc.html +++ b/html/016dilated_reagent.cc.html @@ -65,44 +65,44 @@ if ('onhashchange' in window) { <span id="L4" class="LineNr"> 4 </span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(scenarios load)</span> <span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(scenario dilated_reagent)</span> -<span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> main [ +<span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">34</span> <span id="L9" class="LineNr"> 9 </span>] <span id="L10" class="LineNr"> 10 </span><span class="traceContains">+parse: product: {1: "number", "foo": "bar"}</span> <span id="L11" class="LineNr"> 11 </span> <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenario load_trailing_space_after_curly_bracket)</span> -<span id="L13" class="LineNr"> 13 </span><span class="muRecipe">def</span> main [ +<span id="L13" class="LineNr"> 13 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L14" class="LineNr"> 14 </span><span class="PreProc"> </span><span class="Comment"># line below has a space at the end</span> <span id="L15" class="LineNr"> 15 </span> <span class="Delimiter">{</span><span class="Error"> </span> <span id="L16" class="LineNr"> 16 </span>] <span id="L17" class="LineNr"> 17 </span><span class="Comment"># successfully parsed</span> <span id="L18" class="LineNr"> 18 </span> <span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(scenario dilated_reagent_with_comment)</span> -<span id="L20" class="LineNr"> 20 </span><span class="muRecipe">def</span> main [ +<span id="L20" class="LineNr"> 20 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">34</span> <span class="Comment"># test comment</span> <span id="L22" class="LineNr"> 22 </span>] <span id="L23" class="LineNr"> 23 </span><span class="traceContains">+parse: product: {1: "number", "foo": "bar"}</span> <span id="L24" class="LineNr"> 24 </span>$error: <span class="Constant">0</span> <span id="L25" class="LineNr"> 25 </span> <span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(scenario dilated_reagent_with_comment_immediately_following)</span> -<span id="L27" class="LineNr"> 27 </span><span class="muRecipe">def</span> main [ +<span id="L27" class="LineNr"> 27 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L28" class="LineNr"> 28 </span> <span class="Constant">1</span>:number<span class="Special"> <- </span>copy <span class="Delimiter">{</span><span class="Constant">34</span>: literal<span class="Delimiter">}</span> <span class="Comment"># test comment</span> <span id="L29" class="LineNr"> 29 </span>] <span id="L30" class="LineNr"> 30 </span>$error: <span class="Constant">0</span> <span id="L31" class="LineNr"> 31 </span> <span id="L32" class="LineNr"> 32 </span><span class="Comment">//: First augment next_word to group balanced brackets together.</span> <span id="L33" class="LineNr"> 33 </span> -<span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before "End next_word Special-cases")</span> +<span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before "End <a href='011load.cc.html#L166'>next_word</a> Special-cases")</span> <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> -<span id="L36" class="LineNr"> 36 </span> <span class="Identifier">return</span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L36" class="LineNr"> 36 </span> <span class="Identifier">return</span> <a href='016dilated_reagent.cc.html#L57'>slurp_balanced_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L37" class="LineNr"> 37 </span><span class="Comment">// treat curlies mostly like parens, but don't mess up labels</span> -<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> -<span id="L39" class="LineNr"> 39 </span> <span class="Identifier">return</span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L38" class="LineNr"> 38 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='016dilated_reagent.cc.html#L44'>start_of_dilated_reagent</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> +<span id="L39" class="LineNr"> 39 </span> <span class="Identifier">return</span> <a href='016dilated_reagent.cc.html#L57'>slurp_balanced_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L40" class="LineNr"> 40 </span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(code)</span> <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> <span id="L43" class="LineNr"> 43 </span><span class="Comment">// reagents should remain all on one line.</span> -<span id="L44" class="LineNr"> 44 </span><span class="Normal">bool</span> start_of_dilated_reagent<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L44" class="LineNr"> 44 </span><span class="Normal">bool</span> <a href='016dilated_reagent.cc.html#L44'>start_of_dilated_reagent</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L46" class="LineNr"> 46 </span> <span class="Normal">int</span> pos = in<span class="Delimiter">.</span>tellg<span class="Delimiter">();</span> <span id="L47" class="LineNr"> 47 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <span class="Comment">// slurp '{'</span> @@ -115,7 +115,7 @@ if ('onhashchange' in window) { <span id="L54" class="LineNr"> 54 </span><span class="Comment">// Assume the first letter is an open bracket, and read everything until the</span> <span id="L55" class="LineNr"> 55 </span><span class="Comment">// matching close bracket.</span> <span id="L56" class="LineNr"> 56 </span><span class="Comment">// We balance {} () and [].</span> -<span id="L57" class="LineNr"> 57 </span>string slurp_balanced_bracket<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L57" class="LineNr"> 57 </span>string <a href='016dilated_reagent.cc.html#L57'>slurp_balanced_bracket</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L58" class="LineNr"> 58 </span> ostringstream result<span class="Delimiter">;</span> <span id="L59" class="LineNr"> 59 </span> <span class="Normal">char</span> c<span class="Delimiter">;</span> <span id="L60" class="LineNr"> 60 </span> list<<span class="Normal">char</span>> open_brackets<span class="Delimiter">;</span> @@ -123,7 +123,7 @@ if ('onhashchange' in window) { <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> <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> <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> -<span id="L65" class="LineNr"> 65 </span> raise << <span class="Constant">"unbalanced ')'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L65" class="LineNr"> 65 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unbalanced ')'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L66" class="LineNr"> 66 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span> <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> @@ -132,7 +132,7 @@ if ('onhashchange' in window) { <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> <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> <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> -<span id="L74" class="LineNr"> 74 </span> raise << <span class="Constant">"unbalanced ']'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L74" class="LineNr"> 74 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unbalanced ']'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L75" class="LineNr"> 75 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L76" class="LineNr"> 76 </span> <span class="Delimiter">}</span> <span id="L77" class="LineNr"> 77 </span> open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span> @@ -140,7 +140,7 @@ if ('onhashchange' in window) { <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> <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> <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> -<span id="L82" class="LineNr"> 82 </span> raise << <span class="Constant">"unbalanced '}'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L82" class="LineNr"> 82 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unbalanced '}'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L83" class="LineNr"> 83 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L84" class="LineNr"> 84 </span> <span class="Delimiter">}</span> <span id="L85" class="LineNr"> 85 </span> open_brackets<span class="Delimiter">.</span>pop_back<span class="Delimiter">();</span> @@ -148,45 +148,45 @@ if ('onhashchange' in window) { <span id="L87" class="LineNr"> 87 </span> result << c<span class="Delimiter">;</span> <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> <span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">}</span> -<span id="L90" class="LineNr"> 90 </span> skip_whitespace_and_comments_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L90" class="LineNr"> 90 </span> <a href='011load.cc.html#L219'>skip_whitespace_and_comments_but_not_newline</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L91" class="LineNr"> 91 </span> <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span> <span id="L93" class="LineNr"> 93 </span> <span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(after "Parsing reagent(string s)")</span> -<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">"{"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L95" class="LineNr"> 95 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>s<span class="Delimiter">,</span> <span class="Constant">"{"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L96" class="LineNr"> 96 </span> assert<span class="Delimiter">(</span>properties<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L97" class="LineNr"> 97 </span> istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span> <span id="L98" class="LineNr"> 98 </span> in >> std::noskipws<span class="Delimiter">;</span> <span id="L99" class="LineNr"> 99 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <span class="Comment">// skip '{'</span> -<span id="L100" class="LineNr">100 </span> name = slurp_key<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L100" class="LineNr">100 </span> name = <a href='016dilated_reagent.cc.html#L139'>slurp_key</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> -<span id="L102" class="LineNr">102 </span> raise << <span class="Constant">"invalid reagent '"</span> << s << <span class="Constant">"' without a name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid reagent '"</span> << s << <span class="Constant">"' without a name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L103" class="LineNr">103 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L104" class="LineNr">104 </span> <span class="Delimiter">}</span> <span id="L105" class="LineNr">105 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>name == <span class="Constant">"}"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L106" class="LineNr">106 </span> raise << <span class="Constant">"invalid empty reagent '"</span> << s << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L106" class="LineNr">106 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid empty reagent '"</span> << s << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L107" class="LineNr">107 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L108" class="LineNr">108 </span> <span class="Delimiter">}</span> <span id="L109" class="LineNr">109 </span> <span class="Delimiter">{</span> -<span id="L110" class="LineNr">110 </span> string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L110" class="LineNr">110 </span> string s = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L112" class="LineNr">112 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L113" class="LineNr">113 </span> raise << <span class="Constant">"incomplete dilated reagent at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete dilated reagent at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L114" class="LineNr">114 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L115" class="LineNr">115 </span> <span class="Delimiter">}</span> <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> <span id="L117" class="LineNr">117 </span> <span class="Comment">// End Parsing Dilated Reagent Type Property(type_names)</span> -<span id="L118" class="LineNr">118 </span> type = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span> +<span id="L118" class="LineNr">118 </span> type = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>type_names<span class="Delimiter">);</span> <span id="L119" class="LineNr">119 </span> <span class="Normal">delete</span> type_names<span class="Delimiter">;</span> <span id="L120" class="LineNr">120 </span> <span class="Delimiter">}</span> -<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> -<span id="L122" class="LineNr">122 </span> string key = slurp_key<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L121" class="LineNr">121 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L122" class="LineNr">122 </span> string key = <a href='016dilated_reagent.cc.html#L139'>slurp_key</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L124" class="LineNr">124 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>key == <span class="Constant">"}"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L125" class="LineNr">125 </span> string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L125" class="LineNr">125 </span> string s = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L127" class="LineNr">127 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L128" class="LineNr">128 </span> raise << <span class="Constant">"incomplete dilated reagent at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L128" class="LineNr">128 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete dilated reagent at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L129" class="LineNr">129 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span> <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> @@ -197,15 +197,15 @@ if ('onhashchange' in window) { <span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span> <span id="L137" class="LineNr">137 </span> <span id="L138" class="LineNr">138 </span><span class="Delimiter">:(code)</span> -<span id="L139" class="LineNr">139 </span>string slurp_key<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L140" class="LineNr">140 </span> string result = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L139" class="LineNr">139 </span>string <a href='016dilated_reagent.cc.html#L139'>slurp_key</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L140" class="LineNr">140 </span> string result = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L142" class="LineNr">142 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L143" class="LineNr">143 </span> raise << <span class="Constant">"incomplete dilated reagent at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete dilated reagent at <a href='003trace.cc.html#L195'>end</a> of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L144" class="LineNr">144 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span> <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> && *result<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == <span class="Constant">':'</span><span class="Delimiter">)</span> -<span id="L147" class="LineNr">147 </span> strip_last<span class="Delimiter">(</span>result<span class="Delimiter">);</span> +<span id="L147" class="LineNr">147 </span> <a href='014literal_string.cc.html#L144'>strip_last</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span> <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> <span id="L149" class="LineNr">149 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <span id="L150" class="LineNr">150 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> diff --git a/html/017parse_tree.cc.html b/html/017parse_tree.cc.html index c829c8ef..af1ce670 100644 --- a/html/017parse_tree.cc.html +++ b/html/017parse_tree.cc.html @@ -72,7 +72,7 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenarios load)</span> <span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(scenario dilated_reagent_with_nested_brackets)</span> -<span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> main [ +<span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">34</span> <span id="L17" class="LineNr"> 17 </span>] <span id="L18" class="LineNr"> 18 </span><span class="traceContains">+parse: product: {1: "number", "foo": ("bar" ("baz" "quux"))}</span> @@ -105,10 +105,10 @@ if ('onhashchange' in window) { <span id="L45" class="LineNr"> 45 </span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span> <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> -<span id="L48" class="LineNr"> 48 </span> string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L48" class="LineNr"> 48 </span> string s = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L50" class="LineNr"> 50 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L51" class="LineNr"> 51 </span> raise << <span class="Constant">"incomplete string tree at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L51" class="LineNr"> 51 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete string tree at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L52" class="LineNr"> 52 </span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L53" class="LineNr"> 53 </span> <span class="Delimiter">}</span> <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> @@ -119,17 +119,17 @@ if ('onhashchange' in window) { <span id="L59" class="LineNr"> 59 </span> string_tree** curr = &result<span class="Delimiter">;</span> <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> <span id="L61" class="LineNr"> 61 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L62" class="LineNr"> 62 </span> assert<span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L62" class="LineNr"> 62 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">));</span> <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> <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> <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> <span id="L66" class="LineNr"> 66 </span> <span class="Delimiter">(</span>*curr<span class="Delimiter">)-></span>left = parse_string_tree<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span> <span id="L68" class="LineNr"> 68 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L69" class="LineNr"> 69 </span> string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L69" class="LineNr"> 69 </span> string s = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L71" class="LineNr"> 71 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L72" class="LineNr"> 72 </span> raise << <span class="Constant">"incomplete string tree at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete string tree at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L73" class="LineNr"> 73 </span> <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">}</span> <span id="L75" class="LineNr"> 75 </span> <span class="Delimiter">(</span>*curr<span class="Delimiter">)-></span>left = <span class="Normal">new</span> string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span> @@ -143,8 +143,8 @@ if ('onhashchange' in window) { <span id="L83" class="LineNr"> 83 </span> <span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(scenario dilated_reagent_with_type_tree)</span> <span id="L85" class="LineNr"> 85 </span><span class="Special">% Hide_errors = true; // 'map' isn't defined yet</span> -<span id="L86" class="LineNr"> 86 </span><span class="muRecipe">def</span> main [ -<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"> <- </span>copy <span class="Constant">34</span> +<span id="L86" class="LineNr"> 86 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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><a href='043space.cc.html#L76'>address</a> array character<span class="Delimiter">)</span> <span class="Delimiter">(</span>bar number<span class="Delimiter">))}</span><span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L88" class="LineNr"> 88 </span>] <span id="L89" class="LineNr"> 89 </span><span class="Comment"># just to avoid errors</span> <span id="L90" class="LineNr"> 90 </span><span class="muData">container</span> foo [ @@ -154,13 +154,13 @@ if ('onhashchange' in window) { <span id="L94" class="LineNr"> 94 </span><span class="traceContains">+parse: product: {1: ("foo" ("address" "array" "character") ("bar" "number"))}</span> <span id="L95" class="LineNr"> 95 </span> <span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(scenario dilated_empty_tree)</span> -<span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> main [ +<span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">34</span> <span id="L99" class="LineNr"> 99 </span>] <span id="L100" class="LineNr">100 </span><span class="traceContains">+parse: product: {1: "number", "foo": ()}</span> <span id="L101" class="LineNr">101 </span> <span id="L102" class="LineNr">102 </span><span class="Delimiter">:(scenario dilated_singleton_tree)</span> -<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> main [ +<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">34</span> <span id="L105" class="LineNr">105 </span>] <span id="L106" class="LineNr">106 </span><span class="traceContains">+parse: product: {1: "number", "foo": ("bar")}</span> diff --git a/html/018type_abbreviations.cc.html b/html/018type_abbreviations.cc.html index d221a561..526f81b6 100644 --- a/html/018type_abbreviations.cc.html +++ b/html/018type_abbreviations.cc.html @@ -64,7 +64,7 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario type_abbreviations)</span> <span id="L5" class="LineNr"> 5 </span><span class="muData">type</span> foo = number -<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [ +<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L7" class="LineNr"> 7 </span> <span class="Normal">a</span>:foo<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L8" class="LineNr"> 8 </span>] <span id="L9" class="LineNr"> 9 </span><span class="traceContains">+transform: product type after expanding abbreviations: "number"</span> @@ -76,55 +76,55 @@ if ('onhashchange' in window) { <span id="L15" class="LineNr"> 15 </span> <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Command Handlers")</span> <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">"type"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L18" class="LineNr"> 18 </span> load_type_abbreviations<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L18" class="LineNr"> 18 </span> <a href='018type_abbreviations.cc.html#L22'>load_type_abbreviations</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L19" class="LineNr"> 19 </span><span class="Delimiter">}</span> <span id="L20" class="LineNr"> 20 </span> <span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(code)</span> -<span id="L22" class="LineNr"> 22 </span><span class="Normal">void</span> load_type_abbreviations<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L23" class="LineNr"> 23 </span> string new_type_name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<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> +<span id="L22" class="LineNr"> 22 </span><span class="Normal">void</span> <a href='018type_abbreviations.cc.html#L22'>load_type_abbreviations</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L23" class="LineNr"> 23 </span> string new_type_name = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L24" class="LineNr"> 24 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> || !new_type_name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <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> -<span id="L26" class="LineNr"> 26 </span> raise << <span class="Constant">"incomplete 'type' statement; must be of the form 'type <new type name> = <type expression>'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L26" class="LineNr"> 26 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'type' statement; must be of the form 'type <new type name> = <type expression>'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L27" class="LineNr"> 27 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L28" class="LineNr"> 28 </span> <span class="Delimiter">}</span> -<span id="L29" class="LineNr"> 29 </span> string arrow = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<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> +<span id="L29" class="LineNr"> 29 </span> string arrow = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L30" class="LineNr"> 30 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> || !arrow<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <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> -<span id="L32" class="LineNr"> 32 </span> raise << <span class="Constant">"incomplete 'type' statement 'type "</span> << new_type_name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'type' statement 'type "</span> << new_type_name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L33" class="LineNr"> 33 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L34" class="LineNr"> 34 </span> <span class="Delimiter">}</span> <span id="L35" class="LineNr"> 35 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>arrow != <span class="Constant">"="</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L36" class="LineNr"> 36 </span> raise << <span class="Constant">"'type' statements must be of the form 'type <new type name> = <type expression>' but got 'type "</span> << new_type_name << <span class="Constant">' '</span> << arrow << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L36" class="LineNr"> 36 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"'type' statements must be of the form 'type <new type name> = <type expression>' but got 'type "</span> << new_type_name << <span class="Constant">' '</span> << arrow << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L37" class="LineNr"> 37 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L38" class="LineNr"> 38 </span> <span class="Delimiter">}</span> <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> -<span id="L40" class="LineNr"> 40 </span> raise << <span class="Constant">"incomplete 'type' statement 'type "</span> << new_type_name << <span class="Constant">" ='</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'type' statement 'type "</span> << new_type_name << <span class="Constant">" ='</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L41" class="LineNr"> 41 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L42" class="LineNr"> 42 </span> <span class="Delimiter">}</span> -<span id="L43" class="LineNr"> 43 </span> string old = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L43" class="LineNr"> 43 </span> string old = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> -<span id="L45" class="LineNr"> 45 </span> raise << <span class="Constant">"incomplete 'type' statement 'type "</span> << new_type_name << <span class="Constant">" ='</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L46" class="LineNr"> 46 </span> raise << <span class="Constant">"'type' statements must be of the form 'type <new type name> = <type expression>' but got 'type "</span> << new_type_name << <span class="Constant">' '</span> << arrow << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'type' statement 'type "</span> << new_type_name << <span class="Constant">" ='</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"'type' statements must be of the form 'type <new type name> = <type expression>' but got 'type "</span> << new_type_name << <span class="Constant">' '</span> << arrow << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L47" class="LineNr"> 47 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L48" class="LineNr"> 48 </span> <span class="Delimiter">}</span> <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> -<span id="L50" class="LineNr"> 50 </span> raise << <span class="Constant">"'type' conflict: '"</span> << new_type_name << <span class="Constant">"' defined as both '"</span> << 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> << <span class="Constant">"' and '"</span> << old << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L50" class="LineNr"> 50 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"'type' conflict: '"</span> << new_type_name << <span class="Constant">"' defined as both '"</span> << 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> << <span class="Constant">"' and '"</span> << old << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L51" class="LineNr"> 51 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L52" class="LineNr"> 52 </span> <span class="Delimiter">}</span> -<span id="L53" class="LineNr"> 53 </span> trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"type"</span><span class="Delimiter">)</span> << <span class="Constant">"alias "</span> << new_type_name << <span class="Constant">" = "</span> << old << end<span class="Delimiter">();</span> -<span id="L54" class="LineNr"> 54 </span> type_tree* old_type = new_type_tree<span class="Delimiter">(</span>old<span class="Delimiter">);</span> -<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> +<span id="L53" class="LineNr"> 53 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"type"</span><span class="Delimiter">)</span> << <span class="Constant">"alias "</span> << new_type_name << <span class="Constant">" = "</span> << old << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L54" class="LineNr"> 54 </span> type_tree* old_type = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>old<span class="Delimiter">);</span> +<span id="L55" class="LineNr"> 55 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> new_type_name<span class="Delimiter">,</span> old_type<span class="Delimiter">);</span> <span id="L56" class="LineNr"> 56 </span><span class="Delimiter">}</span> <span id="L57" class="LineNr"> 57 </span> -<span id="L58" class="LineNr"> 58 </span>type_tree* new_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">"("</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> -<span id="L60" class="LineNr"> 60 </span> type_tree* result = new_type_tree<span class="Delimiter">(</span>type_names<span class="Delimiter">);</span> +<span id="L58" class="LineNr"> 58 </span>type_tree* <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Normal">const</span> string& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L59" class="LineNr"> 59 </span> string_tree* type_names = <a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"("</span><span class="Delimiter">)</span> ? parse_string_tree<span class="Delimiter">(</span>x<span class="Delimiter">)</span> : <a href='018type_abbreviations.cc.html#L66'>parse_string_list</a><span class="Delimiter">(</span>x<span class="Delimiter">);</span> +<span id="L60" class="LineNr"> 60 </span> type_tree* result = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>type_names<span class="Delimiter">);</span> <span id="L61" class="LineNr"> 61 </span> <span class="Normal">delete</span> type_names<span class="Delimiter">;</span> <span id="L62" class="LineNr"> 62 </span> expand_type_abbreviations<span class="Delimiter">(</span>result<span class="Delimiter">);</span> <span id="L63" class="LineNr"> 63 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L64" class="LineNr"> 64 </span><span class="Delimiter">}</span> <span id="L65" class="LineNr"> 65 </span> -<span id="L66" class="LineNr"> 66 </span>string_tree* parse_string_list<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L66" class="LineNr"> 66 </span>string_tree* <a href='018type_abbreviations.cc.html#L66'>parse_string_list</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L67" class="LineNr"> 67 </span> istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span> <span id="L68" class="LineNr"> 68 </span> in >> std::noskipws<span class="Delimiter">;</span> <span id="L69" class="LineNr"> 69 </span> <span class="Identifier">return</span> parse_property_list<span class="Delimiter">(</span>in<span class="Delimiter">);</span> @@ -152,8 +152,8 @@ if ('onhashchange' in window) { <span id="L91" class="LineNr"> 91 </span><span class="traceContains">+error: 'type' conflict: 'foo' defined as both 'bar' and 'baz'</span> <span id="L92" class="LineNr"> 92 </span> <span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(scenario type_abbreviation_for_compound)</span> -<span id="L94" class="LineNr"> 94 </span><span class="muData">type</span> foo = address:number -<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [ +<span id="L94" class="LineNr"> 94 </span><span class="muData">type</span> foo = <a href='043space.cc.html#L76'>address</a>:number +<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L96" class="LineNr"> 96 </span> <span class="Normal">a</span>:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L97" class="LineNr"> 97 </span>] <span id="L98" class="LineNr"> 98 </span><span class="traceContains">+transform: product type after expanding abbreviations: ("address" "number")</span> @@ -163,36 +163,36 @@ if ('onhashchange' in window) { <span id="L102" class="LineNr">102 </span><span class="Delimiter">:(before "End save_snapshots")</span> <span id="L103" class="LineNr">103 </span>Type_abbreviations_snapshot = Type_abbreviations<span class="Delimiter">;</span> <span id="L104" class="LineNr">104 </span><span class="Delimiter">:(before "End restore_snapshots")</span> -<span id="L105" class="LineNr">105 </span>restore_type_abbreviations<span class="Delimiter">();</span> +<span id="L105" class="LineNr">105 </span><a href='018type_abbreviations.cc.html#L109'>restore_type_abbreviations</a><span class="Delimiter">();</span> <span id="L106" class="LineNr">106 </span><span class="Delimiter">:(before "End One-time Setup")</span> -<span id="L107" class="LineNr">107 </span>atexit<span class="Delimiter">(</span>clear_type_abbreviations<span class="Delimiter">);</span> +<span id="L107" class="LineNr">107 </span>atexit<span class="Delimiter">(</span><a href='018type_abbreviations.cc.html#L117'>clear_type_abbreviations</a><span class="Delimiter">);</span> <span id="L108" class="LineNr">108 </span><span class="Delimiter">:(code)</span> -<span id="L109" class="LineNr">109 </span><span class="Normal">void</span> restore_type_abbreviations<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L110" class="LineNr">110 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> type_tree*>::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 id="L109" class="LineNr">109 </span><span class="Normal">void</span> <a href='018type_abbreviations.cc.html#L109'>restore_type_abbreviations</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L110" class="LineNr">110 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> type_tree*>::iterator p = Type_abbreviations<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type_abbreviations<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>first<span class="Delimiter">))</span> <span id="L112" class="LineNr">112 </span> <span class="Normal">delete</span> p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span> -<span id="L114" class="LineNr">114 </span> Type_abbreviations<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> Type_abbreviations<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L115" class="LineNr">115 </span> Type_abbreviations = Type_abbreviations_snapshot<span class="Delimiter">;</span> <span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span> -<span id="L117" class="LineNr">117 </span><span class="Normal">void</span> clear_type_abbreviations<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L118" class="LineNr">118 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> type_tree*>::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 id="L117" class="LineNr">117 </span><span class="Normal">void</span> <a href='018type_abbreviations.cc.html#L117'>clear_type_abbreviations</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L118" class="LineNr">118 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> type_tree*>::iterator p = Type_abbreviations<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type_abbreviations<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span id="L119" class="LineNr">119 </span> <span class="Normal">delete</span> p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> -<span id="L120" class="LineNr">120 </span> Type_abbreviations<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L120" class="LineNr">120 </span> Type_abbreviations<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L121" class="LineNr">121 </span><span class="Delimiter">}</span> <span id="L122" class="LineNr">122 </span> <span id="L123" class="LineNr">123 </span><span class="SalientComment">//:: A few default abbreviations.</span> <span id="L124" class="LineNr">124 </span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L126" class="LineNr">126 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"&"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"address"</span><span class="Delimiter">));</span> -<span id="L127" class="LineNr">127 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"@"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"array"</span><span class="Delimiter">));</span> -<span id="L128" class="LineNr">128 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"num"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"number"</span><span class="Delimiter">));</span> -<span id="L129" class="LineNr">129 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"bool"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"boolean"</span><span class="Delimiter">));</span> -<span id="L130" class="LineNr">130 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"char"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"character"</span><span class="Delimiter">));</span> +<span id="L126" class="LineNr">126 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"&"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"address"</span><span class="Delimiter">));</span> +<span id="L127" class="LineNr">127 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"@"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"array"</span><span class="Delimiter">));</span> +<span id="L128" class="LineNr">128 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"num"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"number"</span><span class="Delimiter">));</span> +<span id="L129" class="LineNr">129 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"bool"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"boolean"</span><span class="Delimiter">));</span> +<span id="L130" class="LineNr">130 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"char"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"character"</span><span class="Delimiter">));</span> <span id="L131" class="LineNr">131 </span> <span id="L132" class="LineNr">132 </span><span class="Delimiter">:(scenario use_type_abbreviations_when_declaring_type_abbreviations)</span> <span id="L133" class="LineNr">133 </span><span class="muData">type</span> foo = &:num -<span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> main [ +<span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L135" class="LineNr">135 </span> <span class="Normal">a</span>:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L136" class="LineNr">136 </span>] <span id="L137" class="LineNr">137 </span><span class="traceContains">+transform: product type after expanding abbreviations: ("address" "number")</span> @@ -202,7 +202,7 @@ if ('onhashchange' in window) { <span id="L141" class="LineNr">141 </span><span class="Comment">//: before we use them.</span> <span id="L142" class="LineNr">142 </span> <span id="L143" class="LineNr">143 </span><span class="Delimiter">:(scenario abbreviations_for_address_and_array)</span> -<span id="L144" class="LineNr">144 </span><span class="muRecipe">def</span> main [ +<span id="L144" class="LineNr">144 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L145" class="LineNr">145 </span> f <span class="Constant">1</span>:&:num <span class="Comment"># abbreviation for 'address:number'</span> <span id="L146" class="LineNr">146 </span> f <span class="Constant">2</span>:@:num <span class="Comment"># abbreviation for 'array:number'</span> <span id="L147" class="LineNr">147 </span> f <span class="Constant">3</span>:&:@:num <span class="Comment"># combining '&' and '@'</span> @@ -211,7 +211,7 @@ if ('onhashchange' in window) { <span id="L150" class="LineNr">150 </span>] <span id="L151" class="LineNr">151 </span><span class="muRecipe">def</span> f [ <span id="L152" class="LineNr">152 </span>] -<span id="L153" class="LineNr">153 </span><span class="traceContains">+transform: --- expand type abbreviations in recipe 'main'</span> +<span id="L153" class="LineNr">153 </span><span class="traceContains">+transform: --- expand type abbreviations in <a href='010vm.cc.html#L19'>recipe</a> 'main'</span> <span id="L154" class="LineNr">154 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: ("address" "number")</span> <span id="L155" class="LineNr">155 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: ("array" "number")</span> <span id="L156" class="LineNr">156 </span><span class="traceContains">+transform: ingredient type after expanding abbreviations: ("address" "array" "number")</span> @@ -224,22 +224,22 @@ if ('onhashchange' in window) { <span id="L163" class="LineNr">163 </span><span class="Comment">// End Type Modifying Transforms</span> <span id="L164" class="LineNr">164 </span> <span id="L165" class="LineNr">165 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L166" class="LineNr">166 </span><span class="Normal">void</span> expand_type_abbreviations<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span> <span id="L169" class="LineNr">169 </span> <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& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L171" class="LineNr">171 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- expand type abbreviations in recipe '"</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">"'"</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L171" class="LineNr">171 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- expand type abbreviations in <a href='010vm.cc.html#L19'>recipe</a> '"</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">"'"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L173" class="LineNr">173 </span> <span class="Normal">const</span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L174" class="LineNr">174 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction '"</span> << inst<span class="Delimiter">.</span>original_string << end<span class="Delimiter">();</span> -<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 < 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 id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction '"</span> << inst<span class="Delimiter">.</span>original_string << end<span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L177" class="LineNr">177 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"ingredient type after expanding abbreviations: "</span> << 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> << end<span class="Delimiter">();</span> +<span id="L177" class="LineNr">177 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"ingredient type after expanding abbreviations: "</span> << 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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L178" class="LineNr">178 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L181" class="LineNr">181 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"product type after expanding abbreviations: "</span> << 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> << end<span class="Delimiter">();</span> +<span id="L181" class="LineNr">181 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"product type after expanding abbreviations: "</span> << 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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L182" class="LineNr">182 </span> <span class="Delimiter">}</span> <span id="L183" class="LineNr">183 </span> <span class="Delimiter">}</span> <span id="L184" class="LineNr">184 </span> <span class="Comment">// End Expand Type Abbreviations(caller)</span> diff --git a/html/020run.cc.html b/html/020run.cc.html index 4956eb0b..9c977ae8 100644 --- a/html/020run.cc.html +++ b/html/020run.cc.html @@ -76,14 +76,14 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr"> 13 </span><span class="Comment">//: another. Later layers will add more primitives.</span> <span id="L14" class="LineNr"> 14 </span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(scenario copy_literal)</span> -<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> main [ +<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L17" class="LineNr"> 17 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L18" class="LineNr"> 18 </span>] <span id="L19" class="LineNr"> 19 </span><span class="traceContains">+run: {1: "number"} <- copy {23: "literal"}</span> <span id="L20" class="LineNr"> 20 </span><span class="traceContains">+mem: storing 23 in location 1</span> <span id="L21" class="LineNr"> 21 </span> <span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(scenario copy)</span> -<span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> main [ +<span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L24" class="LineNr"> 24 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L25" class="LineNr"> 25 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:num <span id="L26" class="LineNr"> 26 </span>] @@ -92,7 +92,7 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr"> 29 </span><span class="traceContains">+mem: storing 23 in location 2</span> <span id="L30" class="LineNr"> 30 </span> <span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(scenario copy_multiple)</span> -<span id="L32" class="LineNr"> 32 </span><span class="muRecipe">def</span> main [ +<span id="L32" class="LineNr"> 32 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">24</span> <span id="L34" class="LineNr"> 34 </span>] <span id="L35" class="LineNr"> 35 </span><span class="traceContains">+mem: storing 23 in location 1</span> @@ -102,9 +102,9 @@ if ('onhashchange' in window) { <span id="L39" class="LineNr"> 39 </span><span class="Comment">// Book-keeping while running a recipe.</span> <span id="L40" class="LineNr"> 40 </span><span class="Comment">//: Later layers will replace this to support running multiple routines at once.</span> <span id="L41" class="LineNr"> 41 </span><span class="Normal">struct</span> routine <span class="Delimiter">{</span> -<span id="L42" class="LineNr"> 42 </span> recipe_ordinal running_recipe<span class="Delimiter">;</span> +<span id="L42" class="LineNr"> 42 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> running_recipe<span class="Delimiter">;</span> <span id="L43" class="LineNr"> 43 </span> <span class="Normal">int</span> running_step_index<span class="Delimiter">;</span> -<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> +<span id="L44" class="LineNr"> 44 </span> routine<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> 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 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> <span id="L46" class="LineNr"> 46 </span> <span class="Normal">const</span> vector<instruction>& steps<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span> <span id="L47" class="LineNr"> 47 </span><span class="Delimiter">};</span> @@ -118,7 +118,7 @@ if ('onhashchange' in window) { <span id="L55" class="LineNr"> 55 </span>Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L56" class="LineNr"> 56 </span> <span id="L57" class="LineNr"> 57 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L58" class="LineNr"> 58 </span><span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L59" class="LineNr"> 59 </span> routine rr<span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span id="L60" class="LineNr"> 60 </span> Current_routine = &rr<span class="Delimiter">;</span> <span id="L61" class="LineNr"> 61 </span> run_current_routine<span class="Delimiter">();</span> @@ -126,26 +126,26 @@ if ('onhashchange' in window) { <span id="L63" class="LineNr"> 63 </span><span class="Delimiter">}</span> <span id="L64" class="LineNr"> 64 </span> <span id="L65" class="LineNr"> 65 </span><span class="Normal">void</span> run_current_routine<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> +<span id="L66" class="LineNr"> 66 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='072scheduler.cc.html#L28'>should_continue_running</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// beware: may modify Current_routine</span> <span id="L67" class="LineNr"> 67 </span> <span class="Comment">// Running One Instruction</span> <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> -<span id="L69" class="LineNr"> 69 </span> trace<span class="Delimiter">(</span>Initial_callstack_depth + Trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << end<span class="Delimiter">();</span> -<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> -<span id="L71" class="LineNr"> 71 </span> raise << <span class="Constant">"something wrote to location 0; this should never happen</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span>Initial_callstack_depth + Trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L70" class="LineNr"> 70 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L71" class="LineNr"> 71 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"something wrote to location 0; this should never happen</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L72" class="LineNr"> 72 </span> <a href='001help.cc.html#L218'>put</a><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 id="L73" class="LineNr"> 73 </span> <span class="Delimiter">}</span> <span id="L74" class="LineNr"> 74 </span> <span class="Comment">// read all ingredients from memory, each potentially spanning multiple locations</span> <span id="L75" class="LineNr"> 75 </span> vector<vector<<span class="Normal">double</span>> > ingredients<span class="Delimiter">;</span> <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> -<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 < SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">}</span> <span id="L80" class="LineNr"> 80 </span> <span class="Comment">// instructions below will write to 'products'</span> <span id="L81" class="LineNr"> 81 </span> vector<vector<<span class="Normal">double</span>> > products<span class="Delimiter">;</span> <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> <span id="L83" class="LineNr"> 83 </span> <span class="Comment">// Primitive Recipe Implementations</span> -<span id="L84" class="LineNr"> 84 </span> <span class="Normal">case</span> COPY: <span class="Delimiter">{</span> -<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> +<span id="L84" class="LineNr"> 84 </span> <span class="Normal">case</span> <a href='010vm.cc.html#L190'>COPY</a>: <span class="Delimiter">{</span> +<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><a href='003trace.cc.html#L195'>end</a><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 id="L86" class="LineNr"> 86 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span> <span id="L88" class="LineNr"> 88 </span> <span class="Comment">// End Primitive Recipe Implementations</span> @@ -154,11 +154,11 @@ if ('onhashchange' in window) { <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> <span id="L92" class="LineNr"> 92 </span> <span class="Delimiter">}</span> <span id="L93" class="LineNr"> 93 </span> <span class="Comment">// Write Products of Instruction</span> -<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> < SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L95" class="LineNr"> 95 </span> raise << SIZE<span class="Delimiter">(</span>products<span class="Delimiter">)</span> << <span class="Constant">" vs "</span> << SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> << <span class="Constant">": failed to write to all products! "</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L94" class="LineNr"> 94 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>products<span class="Delimiter">)</span> < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L95" class="LineNr"> 95 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>products<span class="Delimiter">)</span> << <span class="Constant">" vs "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> << <span class="Constant">": failed to write to all products! "</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> <span id="L97" class="LineNr"> 97 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <span id="L100" class="LineNr">100 </span> <span class="Delimiter">}</span> <span id="L101" class="LineNr">101 </span> <span class="Comment">// End Write Products of Instruction</span> @@ -170,7 +170,7 @@ if ('onhashchange' in window) { <span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span> <span id="L108" class="LineNr">108 </span> <span id="L109" class="LineNr">109 </span><span class="Comment">//: hook replaced in a later layer</span> -<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> +<span id="L110" class="LineNr">110 </span><span class="Normal">bool</span> <a href='072scheduler.cc.html#L28'>should_continue_running</a><span class="Delimiter">(</span><span class="Normal">const</span> routine* current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L112" class="LineNr">112 </span> <span class="Identifier">return</span> !Current_routine<span class="Delimiter">-></span>completed<span class="Delimiter">();</span> <span id="L113" class="LineNr">113 </span><span class="Delimiter">}</span> @@ -205,7 +205,7 @@ if ('onhashchange' in window) { <span id="L142" class="LineNr">142 </span> <span id="L143" class="LineNr">143 </span><span class="Comment">//: hook replaced in a later layer</span> <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> -<span id="L145" class="LineNr">145 </span> <span class="Identifier">return</span> running_step_index >= 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 id="L145" class="LineNr">145 </span> <span class="Identifier">return</span> running_step_index >= <a href='001help.cc.html#L138'>SIZE</a><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 id="L146" class="LineNr">146 </span><span class="Delimiter">}</span> <span id="L147" class="LineNr">147 </span> <span id="L148" class="LineNr">148 </span><span class="Comment">//: hook replaced in a later layer</span> @@ -236,7 +236,7 @@ if ('onhashchange' in window) { <span id="L173" class="LineNr">173 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>argc > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L174" class="LineNr">174 </span> <span class="Comment">// ignore argv past '--'; that's commandline args for 'main'</span> <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">"--"</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<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">"--"</span><span class="Delimiter">))</span> +<span id="L176" class="LineNr">176 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>*argv<span class="Delimiter">,</span> <span class="Constant">"--"</span><span class="Delimiter">))</span> <span id="L177" class="LineNr">177 </span> cerr << <span class="Constant">"treating "</span> << *argv << <span class="Constant">" as a file rather than an option</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> <span id="L178" class="LineNr">178 </span> load_file_or_directory<span class="Delimiter">(</span>*argv<span class="Delimiter">);</span> <span id="L179" class="LineNr">179 </span> --argc<span class="Delimiter">;</span> @@ -244,10 +244,10 @@ if ('onhashchange' in window) { <span id="L181" class="LineNr">181 </span> <span class="Delimiter">}</span> <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">"main"</span><span class="Delimiter">));</span> <span id="L183" class="LineNr">183 </span><span class="Delimiter">}</span> -<span id="L184" class="LineNr">184 </span>transform_all<span class="Delimiter">();</span> +<span id="L184" class="LineNr">184 </span><a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> <span id="L185" class="LineNr">185 </span><span class="CommentedCode">//? DUMP("");</span> <span id="L186" class="LineNr">186 </span><span class="CommentedCode">//? exit(0);</span> -<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> +<span id="L187" class="LineNr">187 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L190'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L188" class="LineNr">188 </span>save_snapshots<span class="Delimiter">();</span> <span id="L189" class="LineNr">189 </span> <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> @@ -255,19 +255,19 @@ if ('onhashchange' in window) { <span id="L192" class="LineNr">192 </span><span class="Delimiter">:(before "End Main")</span> <span id="L193" class="LineNr">193 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!Run_tests && contains_key<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"main"</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">"main"</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> <span id="L194" class="LineNr">194 </span> <span class="Comment">// Running Main</span> -<span id="L195" class="LineNr">195 </span> setup<span class="Delimiter">();</span> +<span id="L195" class="LineNr">195 </span> <a href='000organization.cc.html#L134'>setup</a><span class="Delimiter">();</span> <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> <span id="L197" class="LineNr">197 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> <span id="L198" class="LineNr">198 </span> Save_trace = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L199" class="LineNr">199 </span> <span class="Delimiter">}</span> -<span id="L200" class="LineNr">200 </span> trace<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"=== Starting to run"</span> << end<span class="Delimiter">();</span> +<span id="L200" class="LineNr">200 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"=== Starting to run"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<span id="L202" class="LineNr">202 </span> run_main<span class="Delimiter">(</span>argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span> -<span id="L203" class="LineNr">203 </span> teardown<span class="Delimiter">();</span> +<span id="L202" class="LineNr">202 </span> <a href='072scheduler.cc.html#L125'>run_main</a><span class="Delimiter">(</span>argc<span class="Delimiter">,</span> argv<span class="Delimiter">);</span> +<span id="L203" class="LineNr">203 </span> <a href='000organization.cc.html#L138'>teardown</a><span class="Delimiter">();</span> <span id="L204" class="LineNr">204 </span><span class="Delimiter">}</span> <span id="L205" class="LineNr">205 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L207" class="LineNr">207 </span> recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">);</span> +<span id="L206" class="LineNr">206 </span><span class="Normal">void</span> <a href='072scheduler.cc.html#L125'>run_main</a><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> +<span id="L207" class="LineNr">207 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">);</span> <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> <span id="L209" class="LineNr">209 </span><span class="Delimiter">}</span> <span id="L210" class="LineNr">210 </span> @@ -276,21 +276,21 @@ if ('onhashchange' in window) { <span id="L213" class="LineNr">213 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L214" class="LineNr">214 </span><span class="Normal">bool</span> Start_tracing = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L215" class="LineNr">215 </span><span class="Delimiter">:(before "End Commandline Options(*arg)")</span> -<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">"--trace"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L216" class="LineNr">216 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L70'>is_equal</a><span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">"--trace"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L217" class="LineNr">217 </span> Start_tracing = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L218" class="LineNr">218 </span><span class="Delimiter">}</span> <span id="L219" class="LineNr">219 </span> <span id="L220" class="LineNr">220 </span><span class="Delimiter">:(code)</span> <span id="L221" class="LineNr">221 </span><span class="Normal">void</span> dump_profile<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L222" class="LineNr">222 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::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> +<span id="L222" class="LineNr">222 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::iterator p = Instructions_running<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Instructions_running<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L223" class="LineNr">223 </span> cerr << p<span class="Delimiter">-></span>first << <span class="Constant">": "</span> << p<span class="Delimiter">-></span>second << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L224" class="LineNr">224 </span> <span class="Delimiter">}</span> <span id="L225" class="LineNr">225 </span> cerr << <span class="Constant">"== locations read</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L226" class="LineNr">226 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::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> +<span id="L226" class="LineNr">226 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::iterator p = Locations_read<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Locations_read<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L227" class="LineNr">227 </span> cerr << p<span class="Delimiter">-></span>first << <span class="Constant">": "</span> << p<span class="Delimiter">-></span>second << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L228" class="LineNr">228 </span> <span class="Delimiter">}</span> -<span id="L229" class="LineNr">229 </span> cerr << <span class="Constant">"== locations read by instruction</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L230" class="LineNr">230 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::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> +<span id="L229" class="LineNr">229 </span> cerr << <span class="Constant">"== locations read by <a href='010vm.cc.html#L32'>instruction</a></span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> +<span id="L230" class="LineNr">230 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::iterator p = Locations_read_by_instruction<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Locations_read_by_instruction<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L231" class="LineNr">231 </span> cerr << p<span class="Delimiter">-></span>first << <span class="Constant">": "</span> << p<span class="Delimiter">-></span>second << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L232" class="LineNr">232 </span> <span class="Delimiter">}</span> <span id="L233" class="LineNr">233 </span><span class="Delimiter">}</span> @@ -301,7 +301,7 @@ if ('onhashchange' in window) { <span id="L238" class="LineNr">238 </span><span class="Normal">void</span> cleanup_main<span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L239" class="LineNr">239 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace && Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L240" class="LineNr">240 </span> ofstream fout<span class="Delimiter">(</span><span class="Constant">"interactive"</span><span class="Delimiter">);</span> -<span id="L241" class="LineNr">241 </span> fout << Trace_stream<span class="Delimiter">-></span>readable_contents<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L241" class="LineNr">241 </span> fout << Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> <span id="L242" class="LineNr">242 </span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> <span id="L243" class="LineNr">243 </span> <span class="Delimiter">}</span> <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> @@ -317,10 +317,10 @@ if ('onhashchange' in window) { <span id="L254" class="LineNr">254 </span> <span class="Delimiter">}</span> <span id="L255" class="LineNr">255 </span> ifstream fin<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">());</span> <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> -<span id="L257" class="LineNr">257 </span> cerr << <span class="Constant">"no such file '"</span> << filename << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << 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 id="L257" class="LineNr">257 </span> cerr << <span class="Constant">"no such file '"</span> << filename << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span class="Comment">// don't raise, just warn. just in case it's just a name for a scenario to run.</span> <span id="L258" class="LineNr">258 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L259" class="LineNr">259 </span> <span class="Delimiter">}</span> -<span id="L260" class="LineNr">260 </span> trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"=== "</span> << filename << end<span class="Delimiter">();</span> +<span id="L260" class="LineNr">260 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"=== "</span> << filename << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L261" class="LineNr">261 </span> load<span class="Delimiter">(</span>fin<span class="Delimiter">);</span> <span id="L262" class="LineNr">262 </span> fin<span class="Delimiter">.</span>close<span class="Delimiter">();</span> <span id="L263" class="LineNr">263 </span><span class="Delimiter">}</span> @@ -360,8 +360,8 @@ if ('onhashchange' in window) { <span id="L297" class="LineNr">297 </span> <span class="Comment">// End Preprocess read_memory(x)</span> <span id="L298" class="LineNr">298 </span> <span class="Normal">int</span> size = size_of<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <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 < size<span class="Delimiter">;</span> ++offset<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<span id="L301" class="LineNr">301 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << x<span class="Delimiter">.</span>value+offset << <span class="Constant">" is "</span> << no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L300" class="LineNr">300 </span> <span class="Normal">double</span> val = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value+offset<span class="Delimiter">);</span> +<span id="L301" class="LineNr">301 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << x<span class="Delimiter">.</span>value+offset << <span class="Constant">" is "</span> << no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L302" class="LineNr">302 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>val<span class="Delimiter">);</span> <span id="L303" class="LineNr">303 </span> <span class="Delimiter">}</span> <span id="L304" class="LineNr">304 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> @@ -371,25 +371,25 @@ if ('onhashchange' in window) { <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> <span id="L309" class="LineNr">309 </span> <span class="Comment">// Begin Preprocess write_memory(x, data)</span> <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> -<span id="L311" class="LineNr">311 </span> raise << <span class="Constant">"can't write to '"</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">"'; no type</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L311" class="LineNr">311 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't write to '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">"'; no type</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L312" class="LineNr">312 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L313" class="LineNr">313 </span> <span class="Delimiter">}</span> <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> <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> <span id="L316" class="LineNr">316 </span> <span class="Comment">// End Preprocess write_memory(x, data)</span> <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> -<span id="L318" class="LineNr">318 </span> raise << <span class="Constant">"can't write to location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L318" class="LineNr">318 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't write to location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L319" class="LineNr">319 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L320" class="LineNr">320 </span> <span class="Delimiter">}</span> <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> -<span id="L322" class="LineNr">322 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"size mismatch in storing to '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"' ("</span> << size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">" vs "</span> << SIZE<span class="Delimiter">(</span>data<span class="Delimiter">)</span> << <span class="Constant">") at '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L322" class="LineNr">322 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"size mismatch in storing to '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"' ("</span> << size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">" vs "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>data<span class="Delimiter">)</span> << <span class="Constant">") at '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L323" class="LineNr">323 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L324" class="LineNr">324 </span> <span class="Delimiter">}</span> <span id="L325" class="LineNr">325 </span> <span class="Comment">// End write_memory(x) Special-cases</span> -<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 < SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span> ++offset<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>data<span class="Delimiter">);</span> ++offset<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L327" class="LineNr">327 </span> assert<span class="Delimiter">(</span>x<span class="Delimiter">.</span>value+offset > <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L328" class="LineNr">328 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> << <span class="Constant">" in location "</span> << x<span class="Delimiter">.</span>value+offset << end<span class="Delimiter">();</span> -<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> +<span id="L328" class="LineNr">328 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> << <span class="Constant">" in location "</span> << x<span class="Delimiter">.</span>value+offset << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L329" class="LineNr">329 </span> <a href='001help.cc.html#L218'>put</a><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 id="L330" class="LineNr">330 </span> <span class="Delimiter">}</span> <span id="L331" class="LineNr">331 </span><span class="Delimiter">}</span> <span id="L332" class="LineNr">332 </span> @@ -408,7 +408,7 @@ if ('onhashchange' in window) { <span id="L345" class="LineNr">345 </span> <span class="Delimiter">}</span> <span id="L346" class="LineNr">346 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L347" class="LineNr">347 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L348" class="LineNr">348 </span> raise << <span class="Constant">"invalid type "</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L348" class="LineNr">348 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid type "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L349" class="LineNr">349 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L350" class="LineNr">350 </span> <span class="Delimiter">}</span> <span id="L351" class="LineNr">351 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span> @@ -422,7 +422,7 @@ if ('onhashchange' in window) { <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> <span id="L360" class="LineNr">360 </span> <span class="Comment">// End size_mismatch(x) Special-cases</span> <span id="L361" class="LineNr">361 </span><span class="CommentedCode">//? if (size_of(x) != SIZE(data)) cerr << size_of(x) << " vs " << SIZE(data) << '\n';</span> -<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> +<span id="L362" class="LineNr">362 </span> <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>data<span class="Delimiter">);</span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span> <span id="L364" class="LineNr">364 </span> <span id="L365" class="LineNr">365 </span><span class="Normal">bool</span> is_literal<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -435,18 +435,18 @@ if ('onhashchange' in window) { <span id="L372" class="LineNr">372 </span><span class="Delimiter">}</span> <span id="L373" class="LineNr">373 </span> <span id="L374" class="LineNr">374 </span><span class="Normal">bool</span> scalar<span class="Delimiter">(</span><span class="Normal">const</span> vector<<span class="Normal">int</span>>& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L375" class="LineNr">375 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L376" class="LineNr">376 </span><span class="Delimiter">}</span> <span id="L377" class="LineNr">377 </span><span class="Normal">bool</span> scalar<span class="Delimiter">(</span><span class="Normal">const</span> vector<<span class="Normal">double</span>>& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L378" class="LineNr">378 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span> <span id="L380" class="LineNr">380 </span> <span id="L381" class="LineNr">381 </span><span class="Comment">// helper for tests</span> <span id="L382" class="LineNr">382 </span><span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> string& form<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L383" class="LineNr">383 </span> vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span>form<span class="Delimiter">);</span> -<span id="L384" class="LineNr">384 </span> transform_all<span class="Delimiter">();</span> +<span id="L384" class="LineNr">384 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> <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> -<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> +<span id="L386" class="LineNr">386 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L190'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L387" class="LineNr">387 </span> <span class="Comment">// if a test defines main, it probably wants to start there regardless of</span> <span id="L388" class="LineNr">388 </span> <span class="Comment">// definition order</span> <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">"main"</span><span class="Delimiter">)))</span> @@ -456,7 +456,7 @@ if ('onhashchange' in window) { <span id="L393" class="LineNr">393 </span><span class="Delimiter">}</span> <span id="L394" class="LineNr">394 </span> <span id="L395" class="LineNr">395 </span><span class="Delimiter">:(scenario run_label)</span> -<span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span> main [ +<span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L397" class="LineNr">397 </span> +foo <span id="L398" class="LineNr">398 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L399" class="LineNr">399 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:num @@ -466,14 +466,14 @@ if ('onhashchange' in window) { <span id="L403" class="LineNr">403 </span><span class="traceAbsent">-run: +foo</span> <span id="L404" class="LineNr">404 </span> <span id="L405" class="LineNr">405 </span><span class="Delimiter">:(scenario run_dummy)</span> -<span id="L406" class="LineNr">406 </span><span class="muRecipe">def</span> main [ +<span id="L406" class="LineNr">406 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L407" class="LineNr">407 </span> _<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L408" class="LineNr">408 </span>] <span id="L409" class="LineNr">409 </span><span class="traceContains">+run: _ <- copy {0: "literal"}</span> <span id="L410" class="LineNr">410 </span> <span id="L411" class="LineNr">411 </span><span class="Delimiter">:(scenario write_to_0_disallowed)</span> <span id="L412" class="LineNr">412 </span><span class="Special">% Hide_errors = true;</span> -<span id="L413" class="LineNr">413 </span><span class="muRecipe">def</span> main [ +<span id="L413" class="LineNr">413 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L414" class="LineNr">414 </span> <span class="Constant">0</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L415" class="LineNr">415 </span>] <span id="L416" class="LineNr">416 </span><span class="traceAbsent">-mem: storing 34 in location 0</span> @@ -482,25 +482,25 @@ if ('onhashchange' in window) { <span id="L419" class="LineNr">419 </span><span class="Comment">//: to put spaces around the '<-'.</span> <span id="L420" class="LineNr">420 </span> <span id="L421" class="LineNr">421 </span><span class="Delimiter">:(scenario comma_without_space)</span> -<span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> main [ +<span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">2</span><span class="Delimiter">,</span><span class="Constant">2</span> <span id="L424" class="LineNr">424 </span>] <span id="L425" class="LineNr">425 </span><span class="traceContains">+mem: storing 2 in location 1</span> <span id="L426" class="LineNr">426 </span> <span id="L427" class="LineNr">427 </span><span class="Delimiter">:(scenario space_without_comma)</span> -<span id="L428" class="LineNr">428 </span><span class="muRecipe">def</span> main [ +<span id="L428" class="LineNr">428 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">2</span> <span class="Constant">2</span> <span id="L430" class="LineNr">430 </span>] <span id="L431" class="LineNr">431 </span><span class="traceContains">+mem: storing 2 in location 1</span> <span id="L432" class="LineNr">432 </span> <span id="L433" class="LineNr">433 </span><span class="Delimiter">:(scenario comma_before_space)</span> -<span id="L434" class="LineNr">434 </span><span class="muRecipe">def</span> main [ +<span id="L434" class="LineNr">434 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L436" class="LineNr">436 </span>] <span id="L437" class="LineNr">437 </span><span class="traceContains">+mem: storing 2 in location 1</span> <span id="L438" class="LineNr">438 </span> <span id="L439" class="LineNr">439 </span><span class="Delimiter">:(scenario comma_after_space)</span> -<span id="L440" class="LineNr">440 </span><span class="muRecipe">def</span> main [ +<span id="L440" class="LineNr">440 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">2</span> <span class="Delimiter">,</span><span class="Constant">2</span> <span id="L442" class="LineNr">442 </span>] <span id="L443" class="LineNr">443 </span><span class="traceContains">+mem: storing 2 in location 1</span> diff --git a/html/021check_instruction.cc.html b/html/021check_instruction.cc.html index b3364601..391f981c 100644 --- a/html/021check_instruction.cc.html +++ b/html/021check_instruction.cc.html @@ -68,25 +68,25 @@ if ('onhashchange' in window) { <span id="L9" class="LineNr"> 9 </span><span class="Comment">//: transform it in a separate layer or set of layers.</span> <span id="L10" class="LineNr"> 10 </span> <span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before "End Checks")</span> -<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> +<span id="L12" class="LineNr"> 12 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='021check_instruction.cc.html#L15'>check_instruction</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L13" class="LineNr"> 13 </span> <span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L16" class="LineNr"> 16 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- perform checks for recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> +<span id="L15" class="LineNr"> 15 </span><span class="Normal">void</span> <a href='021check_instruction.cc.html#L15'>check_instruction</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- perform checks for <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L17" class="LineNr"> 17 </span> map<string<span class="Delimiter">,</span> vector<type_ordinal> > metadata<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L19" class="LineNr"> 19 </span> instruction& 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 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> <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> <span id="L22" class="LineNr"> 22 </span> <span class="Comment">// Primitive Recipe Checks</span> -<span id="L23" class="LineNr"> 23 </span> <span class="Normal">case</span> COPY: <span class="Delimiter">{</span> -<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> -<span id="L25" class="LineNr"> 25 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredients and products should match in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L23" class="LineNr"> 23 </span> <span class="Normal">case</span> <a href='010vm.cc.html#L190'>COPY</a>: <span class="Delimiter">{</span> +<span id="L24" class="LineNr"> 24 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L25" class="LineNr"> 25 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredients and products should match in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L26" class="LineNr"> 26 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L27" class="LineNr"> 27 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L30" class="LineNr"> 30 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't copy '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"' to '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'; types don't match</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L30" class="LineNr"> 30 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't copy '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"' to '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'; types don't match</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L31" class="LineNr"> 31 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L32" class="LineNr"> 32 </span> <span class="Delimiter">}</span> <span id="L33" class="LineNr"> 33 </span> <span class="Delimiter">}</span> @@ -104,42 +104,42 @@ if ('onhashchange' in window) { <span id="L45" class="LineNr"> 45 </span> <span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(scenario copy_checks_reagent_count)</span> <span id="L47" class="LineNr"> 47 </span><span class="Special">% Hide_errors = true;</span> -<span id="L48" class="LineNr"> 48 </span><span class="muRecipe">def</span> main [ +<span id="L48" class="LineNr"> 48 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L49" class="LineNr"> 49 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L50" class="LineNr"> 50 </span>] -<span id="L51" class="LineNr"> 51 </span><span class="traceContains">+error: main: ingredients and products should match in '1:num <- copy 34, 35'</span> +<span id="L51" class="LineNr"> 51 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: ingredients and products should match in '1:num <- copy 34, 35'</span> <span id="L52" class="LineNr"> 52 </span> <span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(scenario write_scalar_to_array_disallowed)</span> <span id="L54" class="LineNr"> 54 </span><span class="Special">% Hide_errors = true;</span> -<span id="L55" class="LineNr"> 55 </span><span class="muRecipe">def</span> main [ +<span id="L55" class="LineNr"> 55 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L56" class="LineNr"> 56 </span> <span class="Constant">1</span>:array:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L57" class="LineNr"> 57 </span>] -<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> +<span id="L58" class="LineNr"> 58 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: can't copy '34' to '1:array:num'; types don't match</span> <span id="L59" class="LineNr"> 59 </span> <span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(scenario write_scalar_to_array_disallowed_2)</span> <span id="L61" class="LineNr"> 61 </span><span class="Special">% Hide_errors = true;</span> -<span id="L62" class="LineNr"> 62 </span><span class="muRecipe">def</span> main [ +<span id="L62" class="LineNr"> 62 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L64" class="LineNr"> 64 </span>] -<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> +<span id="L65" class="LineNr"> 65 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: can't copy '35' to '2:array:num'; types don't match</span> <span id="L66" class="LineNr"> 66 </span> <span id="L67" class="LineNr"> 67 </span><span class="Delimiter">:(scenario write_scalar_to_address_disallowed)</span> <span id="L68" class="LineNr"> 68 </span><span class="Special">% Hide_errors = true;</span> -<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> main [ -<span id="L70" class="LineNr"> 70 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L70" class="LineNr"> 70 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L71" class="LineNr"> 71 </span>] -<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> +<span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: can't copy '34' to '1:<a href='043space.cc.html#L76'>address</a>:num'; types don't match</span> <span id="L73" class="LineNr"> 73 </span> <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario write_address_to_number_allowed)</span> -<span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> main [ -<span id="L76" class="LineNr"> 76 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">12</span>/unsafe -<span id="L77" class="LineNr"> 77 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:num +<span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L76" class="LineNr"> 76 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">12</span>/unsafe +<span id="L77" class="LineNr"> 77 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L78" class="LineNr"> 78 </span>] <span id="L79" class="LineNr"> 79 </span><span class="traceContains">+mem: storing 12 in location 2</span> <span id="L80" class="LineNr"> 80 </span>$error: <span class="Constant">0</span> <span id="L81" class="LineNr"> 81 </span> <span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(scenario write_boolean_to_number_allowed)</span> -<span id="L83" class="LineNr"> 83 </span><span class="muRecipe">def</span> main [ +<span id="L83" class="LineNr"> 83 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L84" class="LineNr"> 84 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span>/<span class="Constant">true</span> <span id="L85" class="LineNr"> 85 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<span class="Normal">bool</span> <span id="L86" class="LineNr"> 86 </span>] @@ -147,7 +147,7 @@ if ('onhashchange' in window) { <span id="L88" class="LineNr"> 88 </span>$error: <span class="Constant">0</span> <span id="L89" class="LineNr"> 89 </span> <span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(scenario write_number_to_boolean_allowed)</span> -<span id="L91" class="LineNr"> 91 </span><span class="muRecipe">def</span> main [ +<span id="L91" class="LineNr"> 91 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L92" class="LineNr"> 92 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L93" class="LineNr"> 93 </span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span>:num <span id="L94" class="LineNr"> 94 </span>] @@ -156,19 +156,19 @@ if ('onhashchange' in window) { <span id="L97" class="LineNr"> 97 </span> <span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(code)</span> <span id="L99" class="LineNr"> 99 </span><span class="Comment">// types_match with some leniency</span> -<span id="L100" class="LineNr">100 </span><span class="Normal">bool</span> types_coercible<span class="Delimiter">(</span><span class="Normal">const</span> reagent& to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& from<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<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> && 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 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> && 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 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> && 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 id="L100" class="LineNr">100 </span><span class="Normal">bool</span> <a href='021check_instruction.cc.html#L100'>types_coercible</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& from<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L101" class="LineNr">101 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='021check_instruction.cc.html#L109'>types_match</a><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 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> && <a href='021check_instruction.cc.html#L207'>is_mu_number</a><span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L103" class="LineNr">103 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='021check_instruction.cc.html#L199'>is_mu_boolean</a><span class="Delimiter">(</span>from<span class="Delimiter">)</span> && <a href='021check_instruction.cc.html#L207'>is_mu_number</a><span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L104" class="LineNr">104 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='021check_instruction.cc.html#L207'>is_mu_number</a><span class="Delimiter">(</span>from<span class="Delimiter">)</span> && <a href='021check_instruction.cc.html#L199'>is_mu_boolean</a><span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L105" class="LineNr">105 </span> <span class="Comment">// End types_coercible Special-cases</span> <span id="L106" class="LineNr">106 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span> <span id="L108" class="LineNr">108 </span> -<span id="L109" class="LineNr">109 </span><span class="Normal">bool</span> types_match<span class="Delimiter">(</span><span class="Normal">const</span> reagent& to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& from<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L109" class="LineNr">109 </span><span class="Normal">bool</span> <a href='021check_instruction.cc.html#L109'>types_match</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& from<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L110" class="LineNr">110 </span> <span class="Comment">// to sidestep type-checking, use /unsafe in the source.</span> <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> -<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> +<span id="L112" class="LineNr">112 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='021check_instruction.cc.html#L165'>is_unsafe</a><span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <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> <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> <span id="L115" class="LineNr">115 </span> <span class="Comment">// End Matching Types For Literal(to)</span> @@ -188,7 +188,7 @@ if ('onhashchange' in window) { <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> && to<span class="Delimiter">.</span>type<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L130" class="LineNr">130 </span> <span class="Comment">// to sidestep type-checking, use /unsafe in the source.</span> <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> -<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> +<span id="L132" class="LineNr">132 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='021check_instruction.cc.html#L165'>is_unsafe</a><span class="Delimiter">(</span>from<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L133" class="LineNr">133 </span> <span class="Comment">// '_' never raises type error</span> <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> <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> @@ -207,21 +207,21 @@ if ('onhashchange' in window) { <span id="L148" class="LineNr">148 </span> <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-></span>left<span class="Delimiter">,</span> from<span class="Delimiter">-></span>left<span class="Delimiter">)</span> && types_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-></span>right<span class="Delimiter">,</span> from<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span> <span id="L150" class="LineNr">150 </span> -<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> +<span id="L151" class="LineNr">151 </span><span class="Normal">void</span> <a href='021check_instruction.cc.html#L151'>test_unknown_type_does_not_match_unknown_type</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L152" class="LineNr">152 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:foo"</span><span class="Delimiter">);</span> <span id="L153" class="LineNr">153 </span> reagent b<span class="Delimiter">(</span><span class="Constant">"b:bar"</span><span class="Delimiter">);</span> -<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> +<span id="L154" class="LineNr">154 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!types_strictly_match<span class="Delimiter">(</span>a<span class="Delimiter">,</span> b<span class="Delimiter">));</span> <span id="L155" class="LineNr">155 </span><span class="Delimiter">}</span> <span id="L156" class="LineNr">156 </span> -<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> +<span id="L157" class="LineNr">157 </span><span class="Normal">void</span> <a href='021check_instruction.cc.html#L157'>test_unknown_type_matches_itself</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L158" class="LineNr">158 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"a:foo"</span><span class="Delimiter">);</span> <span id="L159" class="LineNr">159 </span> reagent b<span class="Delimiter">(</span><span class="Constant">"b:foo"</span><span class="Delimiter">);</span> -<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> +<span id="L160" class="LineNr">160 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>types_strictly_match<span class="Delimiter">(</span>a<span class="Delimiter">,</span> b<span class="Delimiter">));</span> <span id="L161" class="LineNr">161 </span><span class="Delimiter">}</span> <span id="L162" class="LineNr">162 </span> <span id="L163" class="LineNr">163 </span><span class="Comment">//: helpers</span> <span id="L164" class="LineNr">164 </span> -<span id="L165" class="LineNr">165 </span><span class="Normal">bool</span> is_unsafe<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L165" class="LineNr">165 </span><span class="Normal">bool</span> <a href='021check_instruction.cc.html#L165'>is_unsafe</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"unsafe"</span><span class="Delimiter">);</span> <span id="L167" class="LineNr">167 </span><span class="Delimiter">}</span> <span id="L168" class="LineNr">168 </span> @@ -234,7 +234,7 @@ if ('onhashchange' in window) { <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> <span id="L176" class="LineNr">176 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L177" class="LineNr">177 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L178" class="LineNr">178 </span> raise << <span class="Constant">"invalid type "</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L178" class="LineNr">178 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid type "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L179" class="LineNr">179 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L180" class="LineNr">180 </span> <span class="Delimiter">}</span> <span id="L181" class="LineNr">181 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">);</span> @@ -249,13 +249,13 @@ if ('onhashchange' in window) { <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> <span id="L191" class="LineNr">191 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L192" class="LineNr">192 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L193" class="LineNr">193 </span> raise << <span class="Constant">"invalid type "</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L193" class="LineNr">193 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid type "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L194" class="LineNr">194 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L195" class="LineNr">195 </span> <span class="Delimiter">}</span> <span id="L196" class="LineNr">196 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">);</span> <span id="L197" class="LineNr">197 </span><span class="Delimiter">}</span> <span id="L198" class="LineNr">198 </span> -<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> +<span id="L199" class="LineNr">199 </span><span class="Normal">bool</span> <a href='021check_instruction.cc.html#L199'>is_mu_boolean</a><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 id="L200" class="LineNr">200 </span> <span class="Comment">// End Preprocess is_mu_boolean(reagent r)</span> <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> <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> @@ -263,7 +263,7 @@ if ('onhashchange' in window) { <span id="L204" class="LineNr">204 </span> <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"boolean"</span><span class="Delimiter">);</span> <span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span> <span id="L206" class="LineNr">206 </span> -<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> +<span id="L207" class="LineNr">207 </span><span class="Normal">bool</span> <a href='021check_instruction.cc.html#L207'>is_mu_number</a><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 id="L208" class="LineNr">208 </span> <span class="Comment">// End Preprocess is_mu_number(reagent r)</span> <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> <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">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> diff --git a/html/022arithmetic.cc.html b/html/022arithmetic.cc.html index c5f3273d..63ec154e 100644 --- a/html/022arithmetic.cc.html +++ b/html/022arithmetic.cc.html @@ -63,22 +63,22 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L4" class="LineNr"> 4 </span>ADD<span class="Delimiter">,</span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L6" class="LineNr"> 6 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"add"</span><span class="Delimiter">,</span> ADD<span class="Delimiter">);</span> +<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"add"</span><span class="Delimiter">,</span> ADD<span class="Delimiter">);</span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L8" class="LineNr"> 8 </span><span class="Normal">case</span> ADD: <span class="Delimiter">{</span> <span id="L9" class="LineNr"> 9 </span> <span class="Comment">// primary goal of these checks is to forbid address arithmetic</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L12" class="LineNr"> 12 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'add' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L12" class="LineNr"> 12 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'add' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L13" class="LineNr"> 13 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L14" class="LineNr"> 14 </span> <span class="Delimiter">}</span> <span id="L15" class="LineNr"> 15 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L17" class="LineNr"> 17 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'add' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L16" class="LineNr"> 16 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L17" class="LineNr"> 17 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'add' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L18" class="LineNr"> 18 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L19" class="LineNr"> 19 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L21" class="LineNr"> 21 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'add' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L21" class="LineNr"> 21 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'add' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L22" class="LineNr"> 22 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L23" class="LineNr"> 23 </span> <span class="Delimiter">}</span> <span id="L24" class="LineNr"> 24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -86,7 +86,7 @@ if ('onhashchange' in window) { <span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L27" class="LineNr"> 27 </span><span class="Normal">case</span> ADD: <span class="Delimiter">{</span> <span id="L28" class="LineNr"> 28 </span> <span class="Normal">double</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L31" class="LineNr"> 31 </span> <span class="Delimiter">}</span> <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> @@ -95,13 +95,13 @@ if ('onhashchange' in window) { <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">}</span> <span id="L36" class="LineNr"> 36 </span> <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(scenario add_literal)</span> -<span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> main [ +<span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L39" class="LineNr"> 39 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>add <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L40" class="LineNr"> 40 </span>] <span id="L41" class="LineNr"> 41 </span><span class="traceContains">+mem: storing 57 in location 1</span> <span id="L42" class="LineNr"> 42 </span> <span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(scenario add)</span> -<span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> main [ +<span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L45" class="LineNr"> 45 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L46" class="LineNr"> 46 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L47" class="LineNr"> 47 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>add <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -109,48 +109,48 @@ if ('onhashchange' in window) { <span id="L49" class="LineNr"> 49 </span><span class="traceContains">+mem: storing 57 in location 3</span> <span id="L50" class="LineNr"> 50 </span> <span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(scenario add_multiple)</span> -<span id="L52" class="LineNr"> 52 </span><span class="muRecipe">def</span> main [ +<span id="L52" class="LineNr"> 52 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L53" class="LineNr"> 53 </span> <span class="Constant">1</span>:num<span class="Special"> <- </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 id="L54" class="LineNr"> 54 </span>] <span id="L55" class="LineNr"> 55 </span><span class="traceContains">+mem: storing 12 in location 1</span> <span id="L56" class="LineNr"> 56 </span> <span id="L57" class="LineNr"> 57 </span><span class="Delimiter">:(scenario add_checks_type)</span> <span id="L58" class="LineNr"> 58 </span><span class="Special">% Hide_errors = true;</span> -<span id="L59" class="LineNr"> 59 </span><span class="muRecipe">def</span> main [ +<span id="L59" class="LineNr"> 59 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L60" class="LineNr"> 60 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>add <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L61" class="LineNr"> 61 </span>] -<span id="L62" class="LineNr"> 62 </span><span class="traceContains">+error: main: 'add' requires number ingredients, but got '2:bool'</span> +<span id="L62" class="LineNr"> 62 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'add' requires number ingredients, but got '2:bool'</span> <span id="L63" class="LineNr"> 63 </span> <span id="L64" class="LineNr"> 64 </span><span class="Delimiter">:(scenario add_checks_return_type)</span> <span id="L65" class="LineNr"> 65 </span><span class="Special">% Hide_errors = true;</span> -<span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> main [ -<span id="L67" class="LineNr"> 67 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span> +<span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L67" class="LineNr"> 67 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L68" class="LineNr"> 68 </span>] -<span id="L69" class="LineNr"> 69 </span><span class="traceContains">+error: main: 'add' should yield a number, but got '1:address:num'</span> +<span id="L69" class="LineNr"> 69 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'add' should yield a number, but got '1:address:num'</span> <span id="L70" class="LineNr"> 70 </span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L72" class="LineNr"> 72 </span>SUBTRACT<span class="Delimiter">,</span> <span id="L73" class="LineNr"> 73 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L74" class="LineNr"> 74 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"subtract"</span><span class="Delimiter">,</span> SUBTRACT<span class="Delimiter">);</span> +<span id="L74" class="LineNr"> 74 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"subtract"</span><span class="Delimiter">,</span> SUBTRACT<span class="Delimiter">);</span> <span id="L75" class="LineNr"> 75 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L76" class="LineNr"> 76 </span><span class="Normal">case</span> SUBTRACT: <span class="Delimiter">{</span> <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> -<span id="L78" class="LineNr"> 78 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L78" class="LineNr"> 78 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L79" class="LineNr"> 79 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L80" class="LineNr"> 80 </span> <span class="Delimiter">}</span> -<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 < 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 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L82" class="LineNr"> 82 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='022arithmetic.cc.html#L108'>is_raw</a><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 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> -<span id="L84" class="LineNr"> 84 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L84" class="LineNr"> 84 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L85" class="LineNr"> 85 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">}</span> <span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L89" class="LineNr"> 89 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L88" class="LineNr"> 88 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L89" class="LineNr"> 89 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L90" class="LineNr"> 90 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L93" class="LineNr"> 93 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L93" class="LineNr"> 93 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'subtract' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L94" class="LineNr"> 94 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L95" class="LineNr"> 95 </span> <span class="Delimiter">}</span> <span id="L96" class="LineNr"> 96 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -158,25 +158,25 @@ if ('onhashchange' in window) { <span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L99" class="LineNr"> 99 </span><span class="Normal">case</span> SUBTRACT: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <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> <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> <span id="L105" class="LineNr">105 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L106" class="LineNr">106 </span><span class="Delimiter">}</span> <span id="L107" class="LineNr">107 </span><span class="Delimiter">:(code)</span> -<span id="L108" class="LineNr">108 </span><span class="Normal">bool</span> is_raw<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L108" class="LineNr">108 </span><span class="Normal">bool</span> <a href='022arithmetic.cc.html#L108'>is_raw</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"raw"</span><span class="Delimiter">);</span> <span id="L110" class="LineNr">110 </span><span class="Delimiter">}</span> <span id="L111" class="LineNr">111 </span> <span id="L112" class="LineNr">112 </span><span class="Delimiter">:(scenario subtract_literal)</span> -<span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> main [ +<span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L114" class="LineNr">114 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>subtract <span class="Constant">5</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L115" class="LineNr">115 </span>] <span id="L116" class="LineNr">116 </span><span class="traceContains">+mem: storing 3 in location 1</span> <span id="L117" class="LineNr">117 </span> <span id="L118" class="LineNr">118 </span><span class="Delimiter">:(scenario subtract)</span> -<span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> main [ +<span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L120" class="LineNr">120 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L121" class="LineNr">121 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L122" class="LineNr">122 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>subtract <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -184,7 +184,7 @@ if ('onhashchange' in window) { <span id="L124" class="LineNr">124 </span><span class="traceContains">+mem: storing -11 in location 3</span> <span id="L125" class="LineNr">125 </span> <span id="L126" class="LineNr">126 </span><span class="Delimiter">:(scenario subtract_multiple)</span> -<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> main [ +<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L128" class="LineNr">128 </span> <span class="Constant">1</span>:num<span class="Special"> <- </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 id="L129" class="LineNr">129 </span>] <span id="L130" class="LineNr">130 </span><span class="traceContains">+mem: storing 1 in location 1</span> @@ -192,21 +192,21 @@ if ('onhashchange' in window) { <span id="L132" class="LineNr">132 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L133" class="LineNr">133 </span>MULTIPLY<span class="Delimiter">,</span> <span id="L134" class="LineNr">134 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L135" class="LineNr">135 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"multiply"</span><span class="Delimiter">,</span> MULTIPLY<span class="Delimiter">);</span> +<span id="L135" class="LineNr">135 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"multiply"</span><span class="Delimiter">,</span> MULTIPLY<span class="Delimiter">);</span> <span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L137" class="LineNr">137 </span><span class="Normal">case</span> MULTIPLY: <span class="Delimiter">{</span> -<span id="L138" class="LineNr">138 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L140" class="LineNr">140 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'multiply' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L140" class="LineNr">140 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'multiply' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L141" class="LineNr">141 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L142" class="LineNr">142 </span> <span class="Delimiter">}</span> <span id="L143" class="LineNr">143 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L145" class="LineNr">145 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'multiply' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L144" class="LineNr">144 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L145" class="LineNr">145 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'multiply' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L146" class="LineNr">146 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L147" class="LineNr">147 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L149" class="LineNr">149 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'multiply' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L149" class="LineNr">149 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'multiply' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L150" class="LineNr">150 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L151" class="LineNr">151 </span> <span class="Delimiter">}</span> <span id="L152" class="LineNr">152 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -214,7 +214,7 @@ if ('onhashchange' in window) { <span id="L154" class="LineNr">154 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L155" class="LineNr">155 </span><span class="Normal">case</span> MULTIPLY: <span class="Delimiter">{</span> <span id="L156" class="LineNr">156 </span> <span class="Normal">double</span> result = <span class="Constant">1</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L159" class="LineNr">159 </span> <span class="Delimiter">}</span> <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> @@ -223,13 +223,13 @@ if ('onhashchange' in window) { <span id="L163" class="LineNr">163 </span><span class="Delimiter">}</span> <span id="L164" class="LineNr">164 </span> <span id="L165" class="LineNr">165 </span><span class="Delimiter">:(scenario multiply_literal)</span> -<span id="L166" class="LineNr">166 </span><span class="muRecipe">def</span> main [ +<span id="L166" class="LineNr">166 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L167" class="LineNr">167 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>multiply <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">3</span> <span id="L168" class="LineNr">168 </span>] <span id="L169" class="LineNr">169 </span><span class="traceContains">+mem: storing 6 in location 1</span> <span id="L170" class="LineNr">170 </span> <span id="L171" class="LineNr">171 </span><span class="Delimiter">:(scenario multiply)</span> -<span id="L172" class="LineNr">172 </span><span class="muRecipe">def</span> main [ +<span id="L172" class="LineNr">172 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L173" class="LineNr">173 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">4</span> <span id="L174" class="LineNr">174 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">6</span> <span id="L175" class="LineNr">175 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>multiply <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -237,7 +237,7 @@ if ('onhashchange' in window) { <span id="L177" class="LineNr">177 </span><span class="traceContains">+mem: storing 24 in location 3</span> <span id="L178" class="LineNr">178 </span> <span id="L179" class="LineNr">179 </span><span class="Delimiter">:(scenario multiply_multiple)</span> -<span id="L180" class="LineNr">180 </span><span class="muRecipe">def</span> main [ +<span id="L180" class="LineNr">180 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L181" class="LineNr">181 </span> <span class="Constant">1</span>:num<span class="Special"> <- </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 id="L182" class="LineNr">182 </span>] <span id="L183" class="LineNr">183 </span><span class="traceContains">+mem: storing 24 in location 1</span> @@ -245,25 +245,25 @@ if ('onhashchange' in window) { <span id="L185" class="LineNr">185 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L186" class="LineNr">186 </span>DIVIDE<span class="Delimiter">,</span> <span id="L187" class="LineNr">187 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L188" class="LineNr">188 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"divide"</span><span class="Delimiter">,</span> DIVIDE<span class="Delimiter">);</span> +<span id="L188" class="LineNr">188 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"divide"</span><span class="Delimiter">,</span> DIVIDE<span class="Delimiter">);</span> <span id="L189" class="LineNr">189 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L190" class="LineNr">190 </span><span class="Normal">case</span> DIVIDE: <span class="Delimiter">{</span> <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> -<span id="L192" class="LineNr">192 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L192" class="LineNr">192 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' has no ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L193" class="LineNr">193 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L194" class="LineNr">194 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L197" class="LineNr">197 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L197" class="LineNr">197 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L198" class="LineNr">198 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L199" class="LineNr">199 </span> <span class="Delimiter">}</span> <span id="L200" class="LineNr">200 </span> <span class="Delimiter">}</span> -<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> -<span id="L202" class="LineNr">202 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L201" class="LineNr">201 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L202" class="LineNr">202 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L203" class="LineNr">203 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L204" class="LineNr">204 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L206" class="LineNr">206 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L207" class="LineNr">207 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> <span id="L209" class="LineNr">209 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -271,7 +271,7 @@ if ('onhashchange' in window) { <span id="L211" class="LineNr">211 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L212" class="LineNr">212 </span><span class="Normal">case</span> DIVIDE: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <span id="L216" class="LineNr">216 </span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L217" class="LineNr">217 </span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span> @@ -279,13 +279,13 @@ if ('onhashchange' in window) { <span id="L219" class="LineNr">219 </span><span class="Delimiter">}</span> <span id="L220" class="LineNr">220 </span> <span id="L221" class="LineNr">221 </span><span class="Delimiter">:(scenario divide_literal)</span> -<span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> main [ +<span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L223" class="LineNr">223 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>divide <span class="Constant">8</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L224" class="LineNr">224 </span>] <span id="L225" class="LineNr">225 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L226" class="LineNr">226 </span> <span id="L227" class="LineNr">227 </span><span class="Delimiter">:(scenario divide)</span> -<span id="L228" class="LineNr">228 </span><span class="muRecipe">def</span> main [ +<span id="L228" class="LineNr">228 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L229" class="LineNr">229 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">27</span> <span id="L230" class="LineNr">230 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> <span id="L231" class="LineNr">231 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>divide <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -293,7 +293,7 @@ if ('onhashchange' in window) { <span id="L233" class="LineNr">233 </span><span class="traceContains">+mem: storing 9 in location 3</span> <span id="L234" class="LineNr">234 </span> <span id="L235" class="LineNr">235 </span><span class="Delimiter">:(scenario divide_multiple)</span> -<span id="L236" class="LineNr">236 </span><span class="muRecipe">def</span> main [ +<span id="L236" class="LineNr">236 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L237" class="LineNr">237 </span> <span class="Constant">1</span>:num<span class="Special"> <- </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 id="L238" class="LineNr">238 </span>] <span id="L239" class="LineNr">239 </span><span class="traceContains">+mem: storing 2 in location 1</span> @@ -303,24 +303,24 @@ if ('onhashchange' in window) { <span id="L243" class="LineNr">243 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L244" class="LineNr">244 </span>DIVIDE_WITH_REMAINDER<span class="Delimiter">,</span> <span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L246" class="LineNr">246 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"divide-with-remainder"</span><span class="Delimiter">,</span> DIVIDE_WITH_REMAINDER<span class="Delimiter">);</span> +<span id="L246" class="LineNr">246 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"divide-with-remainder"</span><span class="Delimiter">,</span> DIVIDE_WITH_REMAINDER<span class="Delimiter">);</span> <span id="L247" class="LineNr">247 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L248" class="LineNr">248 </span><span class="Normal">case</span> DIVIDE_WITH_REMAINDER: <span class="Delimiter">{</span> -<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> -<span id="L250" class="LineNr">250 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L249" class="LineNr">249 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L250" class="LineNr">250 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L251" class="LineNr">251 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L252" class="LineNr">252 </span> <span class="Delimiter">}</span> <span id="L253" class="LineNr">253 </span> <span class="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> -<span id="L254" class="LineNr">254 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L254" class="LineNr">254 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L255" class="LineNr">255 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L256" class="LineNr">256 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L258" class="LineNr">258 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' yields two products in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L257" class="LineNr">257 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L258" class="LineNr">258 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' yields two products in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L259" class="LineNr">259 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L260" class="LineNr">260 </span> <span class="Delimiter">}</span> -<span id="L261" class="LineNr">261 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> && !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> -<span id="L263" class="LineNr">263 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L263" class="LineNr">263 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'divide-with-remainder' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L264" class="LineNr">264 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L265" class="LineNr">265 </span> <span class="Delimiter">}</span> <span id="L266" class="LineNr">266 </span> <span class="Delimiter">}</span> @@ -333,7 +333,7 @@ if ('onhashchange' in window) { <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</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 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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</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 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> -<span id="L276" class="LineNr">276 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"divide by zero in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L276" class="LineNr">276 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"divide by zero in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L277" class="LineNr">277 </span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span> <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> <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> @@ -347,14 +347,14 @@ if ('onhashchange' in window) { <span id="L287" class="LineNr">287 </span><span class="Delimiter">}</span> <span id="L288" class="LineNr">288 </span> <span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario divide_with_remainder_literal)</span> -<span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> main [ +<span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>divide-with-remainder <span class="Constant">9</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L292" class="LineNr">292 </span>] <span id="L293" class="LineNr">293 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L294" class="LineNr">294 </span><span class="traceContains">+mem: storing 1 in location 2</span> <span id="L295" class="LineNr">295 </span> <span id="L296" class="LineNr">296 </span><span class="Delimiter">:(scenario divide_with_remainder)</span> -<span id="L297" class="LineNr">297 </span><span class="muRecipe">def</span> main [ +<span id="L297" class="LineNr">297 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L298" class="LineNr">298 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">27</span> <span id="L299" class="LineNr">299 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">11</span> <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"> <- </span>divide-with-remainder <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -363,47 +363,47 @@ if ('onhashchange' in window) { <span id="L303" class="LineNr">303 </span><span class="traceContains">+mem: storing 5 in location 4</span> <span id="L304" class="LineNr">304 </span> <span id="L305" class="LineNr">305 </span><span class="Delimiter">:(scenario divide_with_decimal_point)</span> -<span id="L306" class="LineNr">306 </span><span class="muRecipe">def</span> main [ +<span id="L306" class="LineNr">306 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L307" class="LineNr">307 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>divide <span class="Constant">5</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L308" class="LineNr">308 </span>] <span id="L309" class="LineNr">309 </span><span class="traceContains">+mem: storing 2.5 in location 1</span> <span id="L310" class="LineNr">310 </span> <span id="L311" class="LineNr">311 </span><span class="Delimiter">:(scenario divide_by_zero)</span> -<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> main [ +<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L313" class="LineNr">313 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>divide <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L314" class="LineNr">314 </span>] <span id="L315" class="LineNr">315 </span><span class="traceContains">+mem: storing inf in location 1</span> <span id="L316" class="LineNr">316 </span> <span id="L317" class="LineNr">317 </span><span class="Delimiter">:(scenario divide_by_zero_2)</span> <span id="L318" class="LineNr">318 </span><span class="Special">% Hide_errors = true;</span> -<span id="L319" class="LineNr">319 </span><span class="muRecipe">def</span> main [ +<span id="L319" class="LineNr">319 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L320" class="LineNr">320 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>divide-with-remainder <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L321" class="LineNr">321 </span>] <span id="L322" class="LineNr">322 </span><span class="Comment"># integer division can't return floating-point infinity</span> -<span id="L323" class="LineNr">323 </span><span class="traceContains">+error: main: divide by zero in '1:num <- divide-with-remainder 4, 0'</span> +<span id="L323" class="LineNr">323 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: divide by zero in '1:num <- divide-with-remainder 4, 0'</span> <span id="L324" class="LineNr">324 </span> <span id="L325" class="LineNr">325 </span><span class="Comment">//: Bitwise shifts</span> <span id="L326" class="LineNr">326 </span> <span id="L327" class="LineNr">327 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L328" class="LineNr">328 </span>SHIFT_LEFT<span class="Delimiter">,</span> <span id="L329" class="LineNr">329 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L330" class="LineNr">330 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"shift-left"</span><span class="Delimiter">,</span> SHIFT_LEFT<span class="Delimiter">);</span> +<span id="L330" class="LineNr">330 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"shift-left"</span><span class="Delimiter">,</span> SHIFT_LEFT<span class="Delimiter">);</span> <span id="L331" class="LineNr">331 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L332" class="LineNr">332 </span><span class="Normal">case</span> SHIFT_LEFT: <span class="Delimiter">{</span> -<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> -<span id="L334" class="LineNr">334 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L333" class="LineNr">333 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L334" class="LineNr">334 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L335" class="LineNr">335 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L336" class="LineNr">336 </span> <span class="Delimiter">}</span> <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> -<span id="L338" class="LineNr">338 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L338" class="LineNr">338 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L339" class="LineNr">339 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L340" class="LineNr">340 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L342" class="LineNr">342 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L341" class="LineNr">341 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L342" class="LineNr">342 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L343" class="LineNr">343 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L344" class="LineNr">344 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L346" class="LineNr">346 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L346" class="LineNr">346 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-left' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L347" class="LineNr">347 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L348" class="LineNr">348 </span> <span class="Delimiter">}</span> <span id="L349" class="LineNr">349 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -415,7 +415,7 @@ if ('onhashchange' in window) { <span id="L355" class="LineNr">355 </span> <span class="Normal">int</span> b = <span class="Normal">static_cast</span><<span class="Normal">int</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 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> <span id="L357" class="LineNr">357 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>b < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L358" class="LineNr">358 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"second ingredient can't be negative in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L358" class="LineNr">358 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"second ingredient can't be negative in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <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> <span id="L360" class="LineNr">360 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L361" class="LineNr">361 </span> <span class="Delimiter">}</span> @@ -424,32 +424,32 @@ if ('onhashchange' in window) { <span id="L364" class="LineNr">364 </span><span class="Delimiter">}</span> <span id="L365" class="LineNr">365 </span> <span id="L366" class="LineNr">366 </span><span class="Delimiter">:(scenario shift_left_by_zero)</span> -<span id="L367" class="LineNr">367 </span><span class="muRecipe">def</span> main [ +<span id="L367" class="LineNr">367 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L368" class="LineNr">368 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-left <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L369" class="LineNr">369 </span>] <span id="L370" class="LineNr">370 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L371" class="LineNr">371 </span> <span id="L372" class="LineNr">372 </span><span class="Delimiter">:(scenario shift_left_1)</span> -<span id="L373" class="LineNr">373 </span><span class="muRecipe">def</span> main [ +<span id="L373" class="LineNr">373 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L374" class="LineNr">374 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-left <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L375" class="LineNr">375 </span>] <span id="L376" class="LineNr">376 </span><span class="traceContains">+mem: storing 16 in location 1</span> <span id="L377" class="LineNr">377 </span> <span id="L378" class="LineNr">378 </span><span class="Delimiter">:(scenario shift_left_2)</span> -<span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> main [ +<span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L380" class="LineNr">380 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-left <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L381" class="LineNr">381 </span>] <span id="L382" class="LineNr">382 </span><span class="traceContains">+mem: storing 12 in location 1</span> <span id="L383" class="LineNr">383 </span> <span id="L384" class="LineNr">384 </span><span class="Delimiter">:(scenario shift_left_by_negative)</span> <span id="L385" class="LineNr">385 </span><span class="Special">% Hide_errors = true;</span> -<span id="L386" class="LineNr">386 </span><span class="muRecipe">def</span> main [ +<span id="L386" class="LineNr">386 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L387" class="LineNr">387 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-left <span class="Constant">3</span><span class="Delimiter">,</span> -<span class="Constant">1</span> <span id="L388" class="LineNr">388 </span>] -<span id="L389" class="LineNr">389 </span><span class="traceContains">+error: main: second ingredient can't be negative in '1:num <- shift-left 3, -1'</span> +<span id="L389" class="LineNr">389 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: second ingredient can't be negative in '1:num <- shift-left 3, -1'</span> <span id="L390" class="LineNr">390 </span> <span id="L391" class="LineNr">391 </span><span class="Delimiter">:(scenario shift_left_ignores_fractional_part)</span> -<span id="L392" class="LineNr">392 </span><span class="muRecipe">def</span> main [ +<span id="L392" class="LineNr">392 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L393" class="LineNr">393 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>divide <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L394" class="LineNr">394 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>shift-left <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L395" class="LineNr">395 </span>] @@ -458,23 +458,23 @@ if ('onhashchange' in window) { <span id="L398" class="LineNr">398 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L399" class="LineNr">399 </span>SHIFT_RIGHT<span class="Delimiter">,</span> <span id="L400" class="LineNr">400 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L401" class="LineNr">401 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"shift-right"</span><span class="Delimiter">,</span> SHIFT_RIGHT<span class="Delimiter">);</span> +<span id="L401" class="LineNr">401 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"shift-right"</span><span class="Delimiter">,</span> SHIFT_RIGHT<span class="Delimiter">);</span> <span id="L402" class="LineNr">402 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L403" class="LineNr">403 </span><span class="Normal">case</span> SHIFT_RIGHT: <span class="Delimiter">{</span> -<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> -<span id="L405" class="LineNr">405 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L404" class="LineNr">404 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L405" class="LineNr">405 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L406" class="LineNr">406 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L407" class="LineNr">407 </span> <span class="Delimiter">}</span> <span id="L408" class="LineNr">408 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_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> -<span id="L409" class="LineNr">409 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L409" class="LineNr">409 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L410" class="LineNr">410 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L411" class="LineNr">411 </span> <span class="Delimiter">}</span> -<span id="L412" class="LineNr">412 </span> <span class="Normal">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> -<span id="L413" class="LineNr">413 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L412" class="LineNr">412 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L413" class="LineNr">413 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L414" class="LineNr">414 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L415" class="LineNr">415 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L417" class="LineNr">417 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L417" class="LineNr">417 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'shift-right' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L418" class="LineNr">418 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L419" class="LineNr">419 </span> <span class="Delimiter">}</span> <span id="L420" class="LineNr">420 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -486,7 +486,7 @@ if ('onhashchange' in window) { <span id="L426" class="LineNr">426 </span> <span class="Normal">int</span> b = <span class="Normal">static_cast</span><<span class="Normal">int</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 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> <span id="L428" class="LineNr">428 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>b < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L429" class="LineNr">429 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"second ingredient can't be negative in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L429" class="LineNr">429 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"second ingredient can't be negative in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <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> <span id="L431" class="LineNr">431 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L432" class="LineNr">432 </span> <span class="Delimiter">}</span> @@ -495,32 +495,32 @@ if ('onhashchange' in window) { <span id="L435" class="LineNr">435 </span><span class="Delimiter">}</span> <span id="L436" class="LineNr">436 </span> <span id="L437" class="LineNr">437 </span><span class="Delimiter">:(scenario shift_right_by_zero)</span> -<span id="L438" class="LineNr">438 </span><span class="muRecipe">def</span> main [ +<span id="L438" class="LineNr">438 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L439" class="LineNr">439 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-right <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L440" class="LineNr">440 </span>] <span id="L441" class="LineNr">441 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L442" class="LineNr">442 </span> <span id="L443" class="LineNr">443 </span><span class="Delimiter">:(scenario shift_right_1)</span> -<span id="L444" class="LineNr">444 </span><span class="muRecipe">def</span> main [ +<span id="L444" class="LineNr">444 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L445" class="LineNr">445 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-right <span class="Constant">1024</span><span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L446" class="LineNr">446 </span>] <span id="L447" class="LineNr">447 </span><span class="traceContains">+mem: storing 512 in location 1</span> <span id="L448" class="LineNr">448 </span> <span id="L449" class="LineNr">449 </span><span class="Delimiter">:(scenario shift_right_2)</span> -<span id="L450" class="LineNr">450 </span><span class="muRecipe">def</span> main [ +<span id="L450" class="LineNr">450 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L451" class="LineNr">451 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-right <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L452" class="LineNr">452 </span>] <span id="L453" class="LineNr">453 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L454" class="LineNr">454 </span> <span id="L455" class="LineNr">455 </span><span class="Delimiter">:(scenario shift_right_by_negative)</span> <span id="L456" class="LineNr">456 </span><span class="Special">% Hide_errors = true;</span> -<span id="L457" class="LineNr">457 </span><span class="muRecipe">def</span> main [ +<span id="L457" class="LineNr">457 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L458" class="LineNr">458 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>shift-right <span class="Constant">4</span><span class="Delimiter">,</span> -<span class="Constant">1</span> <span id="L459" class="LineNr">459 </span>] -<span id="L460" class="LineNr">460 </span><span class="traceContains">+error: main: second ingredient can't be negative in '1:num <- shift-right 4, -1'</span> +<span id="L460" class="LineNr">460 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: second ingredient can't be negative in '1:num <- shift-right 4, -1'</span> <span id="L461" class="LineNr">461 </span> <span id="L462" class="LineNr">462 </span><span class="Delimiter">:(scenario shift_right_ignores_fractional_part)</span> -<span id="L463" class="LineNr">463 </span><span class="muRecipe">def</span> main [ +<span id="L463" class="LineNr">463 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L464" class="LineNr">464 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>divide <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L465" class="LineNr">465 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>shift-right <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L466" class="LineNr">466 </span>] @@ -529,23 +529,23 @@ if ('onhashchange' in window) { <span id="L469" class="LineNr">469 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L470" class="LineNr">470 </span>AND_BITS<span class="Delimiter">,</span> <span id="L471" class="LineNr">471 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L472" class="LineNr">472 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"and-bits"</span><span class="Delimiter">,</span> AND_BITS<span class="Delimiter">);</span> +<span id="L472" class="LineNr">472 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"and-bits"</span><span class="Delimiter">,</span> AND_BITS<span class="Delimiter">);</span> <span id="L473" class="LineNr">473 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L474" class="LineNr">474 </span><span class="Normal">case</span> AND_BITS: <span class="Delimiter">{</span> -<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> -<span id="L476" class="LineNr">476 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L475" class="LineNr">475 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L476" class="LineNr">476 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L477" class="LineNr">477 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L478" class="LineNr">478 </span> <span class="Delimiter">}</span> <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> -<span id="L480" class="LineNr">480 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L480" class="LineNr">480 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L481" class="LineNr">481 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L482" class="LineNr">482 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L484" class="LineNr">484 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L483" class="LineNr">483 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L484" class="LineNr">484 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L485" class="LineNr">485 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L486" class="LineNr">486 </span> <span class="Delimiter">}</span> <span id="L487" class="LineNr">487 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<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><span class="Constant">0</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> -<span id="L488" class="LineNr">488 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L488" class="LineNr">488 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L489" class="LineNr">489 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L490" class="LineNr">490 </span> <span class="Delimiter">}</span> <span id="L491" class="LineNr">491 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -561,25 +561,25 @@ if ('onhashchange' in window) { <span id="L501" class="LineNr">501 </span><span class="Delimiter">}</span> <span id="L502" class="LineNr">502 </span> <span id="L503" class="LineNr">503 </span><span class="Delimiter">:(scenario and_bits_1)</span> -<span id="L504" class="LineNr">504 </span><span class="muRecipe">def</span> main [ +<span id="L504" class="LineNr">504 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L505" class="LineNr">505 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">and</span>-bits <span class="Constant">8</span><span class="Delimiter">,</span> <span class="Constant">3</span> <span id="L506" class="LineNr">506 </span>] <span id="L507" class="LineNr">507 </span><span class="traceContains">+mem: storing 0 in location 1</span> <span id="L508" class="LineNr">508 </span> <span id="L509" class="LineNr">509 </span><span class="Delimiter">:(scenario and_bits_2)</span> -<span id="L510" class="LineNr">510 </span><span class="muRecipe">def</span> main [ +<span id="L510" class="LineNr">510 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L511" class="LineNr">511 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">and</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L512" class="LineNr">512 </span>] <span id="L513" class="LineNr">513 </span><span class="traceContains">+mem: storing 2 in location 1</span> <span id="L514" class="LineNr">514 </span> <span id="L515" class="LineNr">515 </span><span class="Delimiter">:(scenario and_bits_3)</span> -<span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> main [ +<span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L517" class="LineNr">517 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">and</span>-bits <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">3</span> <span id="L518" class="LineNr">518 </span>] <span id="L519" class="LineNr">519 </span><span class="traceContains">+mem: storing 2 in location 1</span> <span id="L520" class="LineNr">520 </span> <span id="L521" class="LineNr">521 </span><span class="Delimiter">:(scenario and_bits_negative)</span> -<span id="L522" class="LineNr">522 </span><span class="muRecipe">def</span> main [ +<span id="L522" class="LineNr">522 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L523" class="LineNr">523 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">and</span>-bits -<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L524" class="LineNr">524 </span>] <span id="L525" class="LineNr">525 </span><span class="traceContains">+mem: storing 4 in location 1</span> @@ -587,23 +587,23 @@ if ('onhashchange' in window) { <span id="L527" class="LineNr">527 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L528" class="LineNr">528 </span>OR_BITS<span class="Delimiter">,</span> <span id="L529" class="LineNr">529 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L530" class="LineNr">530 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"or-bits"</span><span class="Delimiter">,</span> OR_BITS<span class="Delimiter">);</span> +<span id="L530" class="LineNr">530 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"or-bits"</span><span class="Delimiter">,</span> OR_BITS<span class="Delimiter">);</span> <span id="L531" class="LineNr">531 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L532" class="LineNr">532 </span><span class="Normal">case</span> OR_BITS: <span class="Delimiter">{</span> -<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> -<span id="L534" class="LineNr">534 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L533" class="LineNr">533 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L534" class="LineNr">534 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L535" class="LineNr">535 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L536" class="LineNr">536 </span> <span class="Delimiter">}</span> <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> -<span id="L538" class="LineNr">538 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L538" class="LineNr">538 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L539" class="LineNr">539 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L540" class="LineNr">540 </span> <span class="Delimiter">}</span> -<span id="L541" class="LineNr">541 </span> <span class="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> -<span id="L542" class="LineNr">542 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L541" class="LineNr">541 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L542" class="LineNr">542 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L543" class="LineNr">543 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L544" class="LineNr">544 </span> <span class="Delimiter">}</span> <span id="L545" class="LineNr">545 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<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><span class="Constant">0</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> -<span id="L546" class="LineNr">546 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L546" class="LineNr">546 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L547" class="LineNr">547 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L548" class="LineNr">548 </span> <span class="Delimiter">}</span> <span id="L549" class="LineNr">549 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -619,19 +619,19 @@ if ('onhashchange' in window) { <span id="L559" class="LineNr">559 </span><span class="Delimiter">}</span> <span id="L560" class="LineNr">560 </span> <span id="L561" class="LineNr">561 </span><span class="Delimiter">:(scenario or_bits_1)</span> -<span id="L562" class="LineNr">562 </span><span class="muRecipe">def</span> main [ +<span id="L562" class="LineNr">562 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L563" class="LineNr">563 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">or</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">8</span> <span id="L564" class="LineNr">564 </span>] <span id="L565" class="LineNr">565 </span><span class="traceContains">+mem: storing 11 in location 1</span> <span id="L566" class="LineNr">566 </span> <span id="L567" class="LineNr">567 </span><span class="Delimiter">:(scenario or_bits_2)</span> -<span id="L568" class="LineNr">568 </span><span class="muRecipe">def</span> main [ +<span id="L568" class="LineNr">568 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L569" class="LineNr">569 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">or</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">10</span> <span id="L570" class="LineNr">570 </span>] <span id="L571" class="LineNr">571 </span><span class="traceContains">+mem: storing 11 in location 1</span> <span id="L572" class="LineNr">572 </span> <span id="L573" class="LineNr">573 </span><span class="Delimiter">:(scenario or_bits_3)</span> -<span id="L574" class="LineNr">574 </span><span class="muRecipe">def</span> main [ +<span id="L574" class="LineNr">574 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L575" class="LineNr">575 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">or</span>-bits <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">6</span> <span id="L576" class="LineNr">576 </span>] <span id="L577" class="LineNr">577 </span><span class="traceContains">+mem: storing 6 in location 1</span> @@ -639,23 +639,23 @@ if ('onhashchange' in window) { <span id="L579" class="LineNr">579 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L580" class="LineNr">580 </span>XOR_BITS<span class="Delimiter">,</span> <span id="L581" class="LineNr">581 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L582" class="LineNr">582 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"xor-bits"</span><span class="Delimiter">,</span> XOR_BITS<span class="Delimiter">);</span> +<span id="L582" class="LineNr">582 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"xor-bits"</span><span class="Delimiter">,</span> XOR_BITS<span class="Delimiter">);</span> <span id="L583" class="LineNr">583 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L584" class="LineNr">584 </span><span class="Normal">case</span> XOR_BITS: <span class="Delimiter">{</span> -<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> -<span id="L586" class="LineNr">586 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L585" class="LineNr">585 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L586" class="LineNr">586 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L587" class="LineNr">587 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L588" class="LineNr">588 </span> <span class="Delimiter">}</span> <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> -<span id="L590" class="LineNr">590 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L590" class="LineNr">590 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' requires number ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L591" class="LineNr">591 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L592" class="LineNr">592 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L594" class="LineNr">594 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L593" class="LineNr">593 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L594" class="LineNr">594 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L595" class="LineNr">595 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L596" class="LineNr">596 </span> <span class="Delimiter">}</span> <span id="L597" class="LineNr">597 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<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><span class="Constant">0</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> -<span id="L598" class="LineNr">598 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L598" class="LineNr">598 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'xor-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L599" class="LineNr">599 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L600" class="LineNr">600 </span> <span class="Delimiter">}</span> <span id="L601" class="LineNr">601 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -671,19 +671,19 @@ if ('onhashchange' in window) { <span id="L611" class="LineNr">611 </span><span class="Delimiter">}</span> <span id="L612" class="LineNr">612 </span> <span id="L613" class="LineNr">613 </span><span class="Delimiter">:(scenario xor_bits_1)</span> -<span id="L614" class="LineNr">614 </span><span class="muRecipe">def</span> main [ +<span id="L614" class="LineNr">614 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L615" class="LineNr">615 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">xor</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">8</span> <span id="L616" class="LineNr">616 </span>] <span id="L617" class="LineNr">617 </span><span class="traceContains">+mem: storing 11 in location 1</span> <span id="L618" class="LineNr">618 </span> <span id="L619" class="LineNr">619 </span><span class="Delimiter">:(scenario xor_bits_2)</span> -<span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> main [ +<span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L621" class="LineNr">621 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">xor</span>-bits <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">10</span> <span id="L622" class="LineNr">622 </span>] <span id="L623" class="LineNr">623 </span><span class="traceContains">+mem: storing 9 in location 1</span> <span id="L624" class="LineNr">624 </span> <span id="L625" class="LineNr">625 </span><span class="Delimiter">:(scenario xor_bits_3)</span> -<span id="L626" class="LineNr">626 </span><span class="muRecipe">def</span> main [ +<span id="L626" class="LineNr">626 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L627" class="LineNr">627 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><span class="Normal">xor</span>-bits <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">6</span> <span id="L628" class="LineNr">628 </span>] <span id="L629" class="LineNr">629 </span><span class="traceContains">+mem: storing 2 in location 1</span> @@ -691,23 +691,23 @@ if ('onhashchange' in window) { <span id="L631" class="LineNr">631 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L632" class="LineNr">632 </span>FLIP_BITS<span class="Delimiter">,</span> <span id="L633" class="LineNr">633 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L634" class="LineNr">634 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"flip-bits"</span><span class="Delimiter">,</span> FLIP_BITS<span class="Delimiter">);</span> +<span id="L634" class="LineNr">634 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"flip-bits"</span><span class="Delimiter">,</span> FLIP_BITS<span class="Delimiter">);</span> <span id="L635" class="LineNr">635 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L636" class="LineNr">636 </span><span class="Normal">case</span> FLIP_BITS: <span class="Delimiter">{</span> -<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> -<span id="L638" class="LineNr">638 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L637" class="LineNr">637 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L638" class="LineNr">638 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L639" class="LineNr">639 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L640" class="LineNr">640 </span> <span class="Delimiter">}</span> <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> -<span id="L642" class="LineNr">642 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' requires a number ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L642" class="LineNr">642 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' requires a number ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L643" class="LineNr">643 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L644" class="LineNr">644 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L646" class="LineNr">646 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L645" class="LineNr">645 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L646" class="LineNr">646 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' yields one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L647" class="LineNr">647 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L648" class="LineNr">648 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L650" class="LineNr">650 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L650" class="LineNr">650 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'flip-bits' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L651" class="LineNr">651 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L652" class="LineNr">652 </span> <span class="Delimiter">}</span> <span id="L653" class="LineNr">653 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -722,25 +722,25 @@ if ('onhashchange' in window) { <span id="L662" class="LineNr">662 </span><span class="Delimiter">}</span> <span id="L663" class="LineNr">663 </span> <span id="L664" class="LineNr">664 </span><span class="Delimiter">:(scenario flip_bits_zero)</span> -<span id="L665" class="LineNr">665 </span><span class="muRecipe">def</span> main [ +<span id="L665" class="LineNr">665 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L666" class="LineNr">666 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>flip-bits <span class="Constant">0</span> <span id="L667" class="LineNr">667 </span>] <span id="L668" class="LineNr">668 </span><span class="traceContains">+mem: storing -1 in location 1</span> <span id="L669" class="LineNr">669 </span> <span id="L670" class="LineNr">670 </span><span class="Delimiter">:(scenario flip_bits_negative)</span> -<span id="L671" class="LineNr">671 </span><span class="muRecipe">def</span> main [ +<span id="L671" class="LineNr">671 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L672" class="LineNr">672 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>flip-bits -<span class="Constant">1</span> <span id="L673" class="LineNr">673 </span>] <span id="L674" class="LineNr">674 </span><span class="traceContains">+mem: storing 0 in location 1</span> <span id="L675" class="LineNr">675 </span> <span id="L676" class="LineNr">676 </span><span class="Delimiter">:(scenario flip_bits_1)</span> -<span id="L677" class="LineNr">677 </span><span class="muRecipe">def</span> main [ +<span id="L677" class="LineNr">677 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L678" class="LineNr">678 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>flip-bits <span class="Constant">3</span> <span id="L679" class="LineNr">679 </span>] <span id="L680" class="LineNr">680 </span><span class="traceContains">+mem: storing -4 in location 1</span> <span id="L681" class="LineNr">681 </span> <span id="L682" class="LineNr">682 </span><span class="Delimiter">:(scenario flip_bits_2)</span> -<span id="L683" class="LineNr">683 </span><span class="muRecipe">def</span> main [ +<span id="L683" class="LineNr">683 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L684" class="LineNr">684 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>flip-bits <span class="Constant">12</span> <span id="L685" class="LineNr">685 </span>] <span id="L686" class="LineNr">686 </span><span class="traceContains">+mem: storing -13 in location 1</span> @@ -748,15 +748,15 @@ if ('onhashchange' in window) { <span id="L688" class="LineNr">688 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L689" class="LineNr">689 </span>ROUND<span class="Delimiter">,</span> <span id="L690" class="LineNr">690 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L691" class="LineNr">691 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"round"</span><span class="Delimiter">,</span> ROUND<span class="Delimiter">);</span> +<span id="L691" class="LineNr">691 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"round"</span><span class="Delimiter">,</span> ROUND<span class="Delimiter">);</span> <span id="L692" class="LineNr">692 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L693" class="LineNr">693 </span><span class="Normal">case</span> ROUND: <span class="Delimiter">{</span> -<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> -<span id="L695" class="LineNr">695 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'round' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L694" class="LineNr">694 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L695" class="LineNr">695 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'round' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L696" class="LineNr">696 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L697" class="LineNr">697 </span> <span class="Delimiter">}</span> <span id="L698" class="LineNr">698 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L699" class="LineNr">699 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'round' should be a number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L699" class="LineNr">699 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'round' should be a number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L700" class="LineNr">700 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L701" class="LineNr">701 </span> <span class="Delimiter">}</span> <span id="L702" class="LineNr">702 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -769,19 +769,19 @@ if ('onhashchange' in window) { <span id="L709" class="LineNr">709 </span><span class="Delimiter">}</span> <span id="L710" class="LineNr">710 </span> <span id="L711" class="LineNr">711 </span><span class="Delimiter">:(scenario round_to_nearest_integer)</span> -<span id="L712" class="LineNr">712 </span><span class="muRecipe">def</span> main [ +<span id="L712" class="LineNr">712 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L713" class="LineNr">713 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>round <span class="Constant">12.2</span> <span id="L714" class="LineNr">714 </span>] <span id="L715" class="LineNr">715 </span><span class="traceContains">+mem: storing 12 in location 1</span> <span id="L716" class="LineNr">716 </span> <span id="L717" class="LineNr">717 </span><span class="Delimiter">:(scenario round_halves_toward_zero)</span> -<span id="L718" class="LineNr">718 </span><span class="muRecipe">def</span> main [ +<span id="L718" class="LineNr">718 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L719" class="LineNr">719 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>round <span class="Constant">12.5</span> <span id="L720" class="LineNr">720 </span>] <span id="L721" class="LineNr">721 </span><span class="traceContains">+mem: storing 12 in location 1</span> <span id="L722" class="LineNr">722 </span> <span id="L723" class="LineNr">723 </span><span class="Delimiter">:(scenario round_halves_toward_zero_2)</span> -<span id="L724" class="LineNr">724 </span><span class="muRecipe">def</span> main [ +<span id="L724" class="LineNr">724 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L725" class="LineNr">725 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>round -<span class="Constant">12.5</span> <span id="L726" class="LineNr">726 </span>] <span id="L727" class="LineNr">727 </span><span class="traceContains">+mem: storing -12 in location 1</span> @@ -789,15 +789,15 @@ if ('onhashchange' in window) { <span id="L729" class="LineNr">729 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L730" class="LineNr">730 </span>TRUNCATE<span class="Delimiter">,</span> <span id="L731" class="LineNr">731 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L732" class="LineNr">732 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"truncate"</span><span class="Delimiter">,</span> TRUNCATE<span class="Delimiter">);</span> +<span id="L732" class="LineNr">732 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"truncate"</span><span class="Delimiter">,</span> TRUNCATE<span class="Delimiter">);</span> <span id="L733" class="LineNr">733 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L734" class="LineNr">734 </span><span class="Normal">case</span> TRUNCATE: <span class="Delimiter">{</span> -<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> -<span id="L736" class="LineNr">736 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'truncate' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L735" class="LineNr">735 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L736" class="LineNr">736 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'truncate' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L737" class="LineNr">737 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L738" class="LineNr">738 </span> <span class="Delimiter">}</span> <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> -<span id="L740" class="LineNr">740 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'truncate' should be a number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L740" class="LineNr">740 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'truncate' should be a number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L741" class="LineNr">741 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L742" class="LineNr">742 </span> <span class="Delimiter">}</span> <span id="L743" class="LineNr">743 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -810,37 +810,37 @@ if ('onhashchange' in window) { <span id="L750" class="LineNr">750 </span><span class="Delimiter">}</span> <span id="L751" class="LineNr">751 </span> <span id="L752" class="LineNr">752 </span><span class="Delimiter">:(scenario truncate_to_nearest_integer)</span> -<span id="L753" class="LineNr">753 </span><span class="muRecipe">def</span> main [ -<span id="L754" class="LineNr">754 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>truncate <span class="Constant">12.2</span> +<span id="L753" class="LineNr">753 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L754" class="LineNr">754 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><a href='101run_sandboxed.cc.html#L449'>truncate</a> <span class="Constant">12.2</span> <span id="L755" class="LineNr">755 </span>] <span id="L756" class="LineNr">756 </span><span class="traceContains">+mem: storing 12 in location 1</span> <span id="L757" class="LineNr">757 </span> <span id="L758" class="LineNr">758 </span><span class="Delimiter">:(scenario truncate_negative)</span> -<span id="L759" class="LineNr">759 </span><span class="muRecipe">def</span> main [ -<span id="L760" class="LineNr">760 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>truncate -<span class="Constant">12.2</span> +<span id="L759" class="LineNr">759 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L760" class="LineNr">760 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><a href='101run_sandboxed.cc.html#L449'>truncate</a> -<span class="Constant">12.2</span> <span id="L761" class="LineNr">761 </span>] <span id="L762" class="LineNr">762 </span><span class="traceContains">+mem: storing -12 in location 1</span> <span id="L763" class="LineNr">763 </span> <span id="L764" class="LineNr">764 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L765" class="LineNr">765 </span>CHARACTER_TO_CODE<span class="Delimiter">,</span> <span id="L766" class="LineNr">766 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L767" class="LineNr">767 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"character-to-code"</span><span class="Delimiter">,</span> CHARACTER_TO_CODE<span class="Delimiter">);</span> +<span id="L767" class="LineNr">767 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"character-to-code"</span><span class="Delimiter">,</span> CHARACTER_TO_CODE<span class="Delimiter">);</span> <span id="L768" class="LineNr">768 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L769" class="LineNr">769 </span><span class="Normal">case</span> CHARACTER_TO_CODE: <span class="Delimiter">{</span> -<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> -<span id="L771" class="LineNr">771 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'character-to-code' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L770" class="LineNr">770 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L771" class="LineNr">771 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'character-to-code' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L772" class="LineNr">772 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L773" class="LineNr">773 </span> <span class="Delimiter">}</span> <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> -<span id="L775" class="LineNr">775 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'character-to-code' should be a character, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L775" class="LineNr">775 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'character-to-code' should be a character, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L776" class="LineNr">776 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L777" class="LineNr">777 </span> <span class="Delimiter">}</span> -<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> -<span id="L779" class="LineNr">779 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'character-to-code' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L778" class="LineNr">778 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L779" class="LineNr">779 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'character-to-code' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L780" class="LineNr">780 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L781" class="LineNr">781 </span> <span class="Delimiter">}</span> <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> -<span id="L783" class="LineNr">783 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of 'character-to-code' should be a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L783" class="LineNr">783 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of 'character-to-code' should be a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L784" class="LineNr">784 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L785" class="LineNr">785 </span> <span class="Delimiter">}</span> <span id="L786" class="LineNr">786 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -848,7 +848,7 @@ if ('onhashchange' in window) { <span id="L788" class="LineNr">788 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L789" class="LineNr">789 </span><span class="Normal">case</span> CHARACTER_TO_CODE: <span class="Delimiter">{</span> <span id="L790" class="LineNr">790 </span> <span class="Normal">double</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L793" class="LineNr">793 </span> <span class="Delimiter">}</span> <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> diff --git a/html/023boolean.cc.html b/html/023boolean.cc.html index a2abce8e..94c3edac 100644 --- a/html/023boolean.cc.html +++ b/html/023boolean.cc.html @@ -62,21 +62,21 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L4" class="LineNr"> 4 </span>AND<span class="Delimiter">,</span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L6" class="LineNr"> 6 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"and"</span><span class="Delimiter">,</span> AND<span class="Delimiter">);</span> +<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"and"</span><span class="Delimiter">,</span> AND<span class="Delimiter">);</span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L8" class="LineNr"> 8 </span><span class="Normal">case</span> AND: <span class="Delimiter">{</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L11" class="LineNr"> 11 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' requires boolean ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L11" class="LineNr"> 11 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' requires boolean ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L12" class="LineNr"> 12 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L13" class="LineNr"> 13 </span> <span class="Delimiter">}</span> <span id="L14" class="LineNr"> 14 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L16" class="LineNr"> 16 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L15" class="LineNr"> 15 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L17" class="LineNr"> 17 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L18" class="LineNr"> 18 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L20" class="LineNr"> 20 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L20" class="LineNr"> 20 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L21" class="LineNr"> 21 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L22" class="LineNr"> 22 </span> <span class="Delimiter">}</span> <span id="L23" class="LineNr"> 23 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -84,7 +84,7 @@ if ('onhashchange' in window) { <span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L26" class="LineNr"> 26 </span><span class="Normal">case</span> AND: <span class="Delimiter">{</span> <span id="L27" class="LineNr"> 27 </span> <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L29" class="LineNr"> 29 </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> <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> <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> @@ -92,7 +92,7 @@ if ('onhashchange' in window) { <span id="L33" class="LineNr"> 33 </span><span class="Delimiter">}</span> <span id="L34" class="LineNr"> 34 </span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(scenario and)</span> -<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> main [ +<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L37" class="LineNr"> 37 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L38" class="LineNr"> 38 </span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L39" class="LineNr"> 39 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </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> @@ -100,19 +100,19 @@ if ('onhashchange' in window) { <span id="L41" class="LineNr"> 41 </span><span class="traceContains">+mem: storing 0 in location 3</span> <span id="L42" class="LineNr"> 42 </span> <span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(scenario and_2)</span> -<span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> main [ +<span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L45" class="LineNr"> 45 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </span><span class="Normal">and</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L46" class="LineNr"> 46 </span>] <span id="L47" class="LineNr"> 47 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L48" class="LineNr"> 48 </span> <span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(scenario and_multiple)</span> -<span id="L50" class="LineNr"> 50 </span><span class="muRecipe">def</span> main [ +<span id="L50" class="LineNr"> 50 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L51" class="LineNr"> 51 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L52" class="LineNr"> 52 </span>] <span id="L53" class="LineNr"> 53 </span><span class="traceContains">+mem: storing 0 in location 1</span> <span id="L54" class="LineNr"> 54 </span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario and_multiple_2)</span> -<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [ +<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L57" class="LineNr"> 57 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L58" class="LineNr"> 58 </span>] <span id="L59" class="LineNr"> 59 </span><span class="traceContains">+mem: storing 1 in location 1</span> @@ -120,21 +120,21 @@ if ('onhashchange' in window) { <span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L62" class="LineNr"> 62 </span>OR<span class="Delimiter">,</span> <span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L64" class="LineNr"> 64 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"or"</span><span class="Delimiter">,</span> OR<span class="Delimiter">);</span> +<span id="L64" class="LineNr"> 64 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"or"</span><span class="Delimiter">,</span> OR<span class="Delimiter">);</span> <span id="L65" class="LineNr"> 65 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L66" class="LineNr"> 66 </span><span class="Normal">case</span> OR: <span class="Delimiter">{</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L69" class="LineNr"> 69 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' requires boolean ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'and' requires boolean ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L70" class="LineNr"> 70 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L71" class="LineNr"> 71 </span> <span class="Delimiter">}</span> <span id="L72" class="LineNr"> 72 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L74" class="LineNr"> 74 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L73" class="LineNr"> 73 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L74" class="LineNr"> 74 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L75" class="LineNr"> 75 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L76" class="LineNr"> 76 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L78" class="LineNr"> 78 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L78" class="LineNr"> 78 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'or' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L79" class="LineNr"> 79 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L80" class="LineNr"> 80 </span> <span class="Delimiter">}</span> <span id="L81" class="LineNr"> 81 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -142,7 +142,7 @@ if ('onhashchange' in window) { <span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L84" class="LineNr"> 84 </span><span class="Normal">case</span> OR: <span class="Delimiter">{</span> <span id="L85" class="LineNr"> 85 </span> <span class="Normal">bool</span> result = <span class="Constant">false</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <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> <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> @@ -150,7 +150,7 @@ if ('onhashchange' in window) { <span id="L91" class="LineNr"> 91 </span><span class="Delimiter">}</span> <span id="L92" class="LineNr"> 92 </span> <span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(scenario or)</span> -<span id="L94" class="LineNr"> 94 </span><span class="muRecipe">def</span> main [ +<span id="L94" class="LineNr"> 94 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L95" class="LineNr"> 95 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L96" class="LineNr"> 96 </span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L97" class="LineNr"> 97 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </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> @@ -158,19 +158,19 @@ if ('onhashchange' in window) { <span id="L99" class="LineNr"> 99 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L100" class="LineNr">100 </span> <span id="L101" class="LineNr">101 </span><span class="Delimiter">:(scenario or_2)</span> -<span id="L102" class="LineNr">102 </span><span class="muRecipe">def</span> main [ +<span id="L102" class="LineNr">102 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L103" class="LineNr">103 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </span><span class="Normal">or</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L104" class="LineNr">104 </span>] <span id="L105" class="LineNr">105 </span><span class="traceContains">+mem: storing 0 in location 1</span> <span id="L106" class="LineNr">106 </span> <span id="L107" class="LineNr">107 </span><span class="Delimiter">:(scenario or_multiple)</span> -<span id="L108" class="LineNr">108 </span><span class="muRecipe">def</span> main [ +<span id="L108" class="LineNr">108 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L109" class="LineNr">109 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L110" class="LineNr">110 </span>] <span id="L111" class="LineNr">111 </span><span class="traceContains">+mem: storing 0 in location 1</span> <span id="L112" class="LineNr">112 </span> <span id="L113" class="LineNr">113 </span><span class="Delimiter">:(scenario or_multiple_2)</span> -<span id="L114" class="LineNr">114 </span><span class="muRecipe">def</span> main [ +<span id="L114" class="LineNr">114 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L115" class="LineNr">115 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L116" class="LineNr">116 </span>] <span id="L117" class="LineNr">117 </span><span class="traceContains">+mem: storing 1 in location 1</span> @@ -178,23 +178,23 @@ if ('onhashchange' in window) { <span id="L119" class="LineNr">119 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L120" class="LineNr">120 </span>NOT<span class="Delimiter">,</span> <span id="L121" class="LineNr">121 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L122" class="LineNr">122 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"not"</span><span class="Delimiter">,</span> NOT<span class="Delimiter">);</span> +<span id="L122" class="LineNr">122 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"not"</span><span class="Delimiter">,</span> NOT<span class="Delimiter">);</span> <span id="L123" class="LineNr">123 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L124" class="LineNr">124 </span><span class="Normal">case</span> NOT: <span class="Delimiter">{</span> -<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> -<span id="L126" class="LineNr">126 </span> raise << <span class="Constant">"ingredients and products should match in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L125" class="LineNr">125 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L126" class="LineNr">126 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"ingredients and products should match in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L127" class="LineNr">127 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L128" class="LineNr">128 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L131" class="LineNr">131 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'not' requires boolean ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L131" class="LineNr">131 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'not' requires boolean ingredients, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L132" class="LineNr">132 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L133" class="LineNr">133 </span> <span class="Delimiter">}</span> <span id="L134" class="LineNr">134 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L138" class="LineNr">138 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'not' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L138" class="LineNr">138 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'not' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L139" class="LineNr">139 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span> <span id="L141" class="LineNr">141 </span> <span class="Delimiter">}</span> @@ -202,22 +202,22 @@ if ('onhashchange' in window) { <span id="L143" class="LineNr">143 </span><span class="Delimiter">}</span> <span id="L144" class="LineNr">144 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L145" class="LineNr">145 </span><span class="Normal">case</span> NOT: <span class="Delimiter">{</span> -<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> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L146" class="LineNr">146 </span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">));</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L149" class="LineNr">149 </span> <span class="Delimiter">}</span> <span id="L150" class="LineNr">150 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span> <span id="L152" class="LineNr">152 </span> <span id="L153" class="LineNr">153 </span><span class="Delimiter">:(scenario not)</span> -<span id="L154" class="LineNr">154 </span><span class="muRecipe">def</span> main [ +<span id="L154" class="LineNr">154 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L155" class="LineNr">155 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L156" class="LineNr">156 </span> <span class="Constant">2</span>:<span class="Normal">bool</span><span class="Special"> <- </span><span class="Normal">not</span> <span class="Constant">1</span>:<span class="Normal">bool</span> <span id="L157" class="LineNr">157 </span>] <span id="L158" class="LineNr">158 </span><span class="traceContains">+mem: storing 0 in location 2</span> <span id="L159" class="LineNr">159 </span> <span id="L160" class="LineNr">160 </span><span class="Delimiter">:(scenario not_multiple)</span> -<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> main [ +<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </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 id="L163" class="LineNr">163 </span>] <span id="L164" class="LineNr">164 </span><span class="traceContains">+mem: storing 0 in location 1</span> diff --git a/html/024jump.cc.html b/html/024jump.cc.html index 9a32324e..d833f1fd 100644 --- a/html/024jump.cc.html +++ b/html/024jump.cc.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Jump primitives</span> <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario jump_can_skip_instructions)</span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [ +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L5" class="LineNr"> 5 </span> jump <span class="Constant">1:offset</span> <span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L7" class="LineNr"> 7 </span>] @@ -72,15 +72,15 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L13" class="LineNr"> 13 </span>JUMP<span class="Delimiter">,</span> <span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L15" class="LineNr"> 15 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"jump"</span><span class="Delimiter">,</span> JUMP<span class="Delimiter">);</span> +<span id="L15" class="LineNr"> 15 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"jump"</span><span class="Delimiter">,</span> JUMP<span class="Delimiter">);</span> <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L17" class="LineNr"> 17 </span><span class="Normal">case</span> JUMP: <span class="Delimiter">{</span> -<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> -<span id="L19" class="LineNr"> 19 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L18" class="LineNr"> 18 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L19" class="LineNr"> 19 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L20" class="LineNr"> 20 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L21" class="LineNr"> 21 </span> <span class="Delimiter">}</span> <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> -<span id="L23" class="LineNr"> 23 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'jump' should be a label or offset, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L23" class="LineNr"> 23 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'jump' should be a label or offset, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L24" class="LineNr"> 24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L25" class="LineNr"> 25 </span> <span class="Delimiter">}</span> <span id="L26" class="LineNr"> 26 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -89,16 +89,16 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr"> 29 </span><span class="Normal">case</span> JUMP: <span class="Delimiter">{</span> <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> <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> -<span id="L32" class="LineNr"> 32 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to instruction "</span> << current_step_index<span class="Delimiter">()</span> << end<span class="Delimiter">();</span> +<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to <a href='010vm.cc.html#L32'>instruction</a> "</span> << current_step_index<span class="Delimiter">()</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L34" class="LineNr"> 34 </span><span class="Delimiter">}</span> <span id="L35" class="LineNr"> 35 </span> <span id="L36" class="LineNr"> 36 </span><span class="Comment">//: special type to designate jump targets</span> <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L38" class="LineNr"> 38 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"offset"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L38" class="LineNr"> 38 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"offset"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L39" class="LineNr"> 39 </span> <span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(scenario jump_backward)</span> -<span id="L41" class="LineNr"> 41 </span><span class="muRecipe">def</span> main [ +<span id="L41" class="LineNr"> 41 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L42" class="LineNr"> 42 </span> jump <span class="Constant">1:offset</span> <span class="Comment"># 0 -+</span> <span id="L43" class="LineNr"> 43 </span> jump <span class="Constant">3:offset</span> <span class="Comment"># | +-+ 1</span> <span id="L44" class="LineNr"> 44 </span> <span class="Comment"># \/ /\ |</span> @@ -111,19 +111,19 @@ if ('onhashchange' in window) { <span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L52" class="LineNr"> 52 </span>JUMP_IF<span class="Delimiter">,</span> <span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L54" class="LineNr"> 54 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"jump-if"</span><span class="Delimiter">,</span> JUMP_IF<span class="Delimiter">);</span> +<span id="L54" class="LineNr"> 54 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"jump-if"</span><span class="Delimiter">,</span> JUMP_IF<span class="Delimiter">);</span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L56" class="LineNr"> 56 </span><span class="Normal">case</span> JUMP_IF: <span class="Delimiter">{</span> -<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> -<span id="L58" class="LineNr"> 58 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-if' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L57" class="LineNr"> 57 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-if' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L59" class="LineNr"> 59 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L60" class="LineNr"> 60 </span> <span class="Delimiter">}</span> <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> -<span id="L62" class="LineNr"> 62 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-if' requires a boolean for its first ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-if' requires a boolean for its first ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L63" class="LineNr"> 63 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L64" class="LineNr"> 64 </span> <span class="Delimiter">}</span> <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> -<span id="L66" class="LineNr"> 66 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-if' requires a label or offset for its second ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L66" class="LineNr"> 66 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-if' requires a label or offset for its second ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L67" class="LineNr"> 67 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L68" class="LineNr"> 68 </span> <span class="Delimiter">}</span> <span id="L69" class="LineNr"> 69 </span> <span class="Comment">// End JUMP_IF Checks</span> @@ -133,26 +133,26 @@ if ('onhashchange' in window) { <span id="L73" class="LineNr"> 73 </span><span class="Normal">case</span> JUMP_IF: <span class="Delimiter">{</span> <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> <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> -<span id="L76" class="LineNr"> 76 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-if fell through"</span> << end<span class="Delimiter">();</span> +<span id="L76" class="LineNr"> 76 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-if fell through"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L77" class="LineNr"> 77 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L78" class="LineNr"> 78 </span> <span class="Delimiter">}</span> <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> -<span id="L80" class="LineNr"> 80 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to instruction "</span> << current_step_index<span class="Delimiter">()</span> << end<span class="Delimiter">();</span> +<span id="L80" class="LineNr"> 80 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to <a href='010vm.cc.html#L32'>instruction</a> "</span> << current_step_index<span class="Delimiter">()</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L82" class="LineNr"> 82 </span><span class="Delimiter">}</span> <span id="L83" class="LineNr"> 83 </span> <span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(scenario jump_if)</span> -<span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> main [ +<span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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> <span id="L87" class="LineNr"> 87 </span> <span class="Constant">123</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L88" class="LineNr"> 88 </span>] <span id="L89" class="LineNr"> 89 </span><span class="traceContains">+run: jump-if {999: "literal"}, {1: "offset"}</span> -<span id="L90" class="LineNr"> 90 </span><span class="traceContains">+run: jumping to instruction 2</span> +<span id="L90" class="LineNr"> 90 </span><span class="traceContains">+run: jumping to <a href='010vm.cc.html#L32'>instruction</a> 2</span> <span id="L91" class="LineNr"> 91 </span><span class="traceAbsent">-run: {1: "number"} <- copy {1: "literal"}</span> <span id="L92" class="LineNr"> 92 </span><span class="traceAbsent">-mem: storing 1 in location 123</span> <span id="L93" class="LineNr"> 93 </span> <span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(scenario jump_if_fallthrough)</span> -<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [ +<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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> <span id="L97" class="LineNr"> 97 </span> <span class="Constant">123</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L98" class="LineNr"> 98 </span>] @@ -164,19 +164,19 @@ if ('onhashchange' in window) { <span id="L104" class="LineNr">104 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L105" class="LineNr">105 </span>JUMP_UNLESS<span class="Delimiter">,</span> <span id="L106" class="LineNr">106 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L107" class="LineNr">107 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"jump-unless"</span><span class="Delimiter">,</span> JUMP_UNLESS<span class="Delimiter">);</span> +<span id="L107" class="LineNr">107 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"jump-unless"</span><span class="Delimiter">,</span> JUMP_UNLESS<span class="Delimiter">);</span> <span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L109" class="LineNr">109 </span><span class="Normal">case</span> JUMP_UNLESS: <span class="Delimiter">{</span> -<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> -<span id="L111" class="LineNr">111 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-unless' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L110" class="LineNr">110 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-unless' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L112" class="LineNr">112 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span> <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> -<span id="L115" class="LineNr">115 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-unless' requires a boolean for its first ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L115" class="LineNr">115 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-unless' requires a boolean for its first ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L116" class="LineNr">116 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L117" class="LineNr">117 </span> <span class="Delimiter">}</span> <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> -<span id="L119" class="LineNr">119 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-unless' requires a label or offset for its second ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump-unless' requires a label or offset for its second ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L120" class="LineNr">120 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L121" class="LineNr">121 </span> <span class="Delimiter">}</span> <span id="L122" class="LineNr">122 </span> <span class="Comment">// End JUMP_UNLESS Checks</span> @@ -186,26 +186,26 @@ if ('onhashchange' in window) { <span id="L126" class="LineNr">126 </span><span class="Normal">case</span> JUMP_UNLESS: <span class="Delimiter">{</span> <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> <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> -<span id="L129" class="LineNr">129 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-unless fell through"</span> << end<span class="Delimiter">();</span> +<span id="L129" class="LineNr">129 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jump-unless fell through"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L130" class="LineNr">130 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L131" class="LineNr">131 </span> <span class="Delimiter">}</span> <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> -<span id="L133" class="LineNr">133 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to instruction "</span> << current_step_index<span class="Delimiter">()</span> << end<span class="Delimiter">();</span> +<span id="L133" class="LineNr">133 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"jumping to <a href='010vm.cc.html#L32'>instruction</a> "</span> << current_step_index<span class="Delimiter">()</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span> <span id="L136" class="LineNr">136 </span> <span id="L137" class="LineNr">137 </span><span class="Delimiter">:(scenario jump_unless)</span> -<span id="L138" class="LineNr">138 </span><span class="muRecipe">def</span> main [ +<span id="L138" class="LineNr">138 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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> <span id="L140" class="LineNr">140 </span> <span class="Constant">123</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L141" class="LineNr">141 </span>] <span id="L142" class="LineNr">142 </span><span class="traceContains">+run: jump-unless {0: "literal"}, {1: "offset"}</span> -<span id="L143" class="LineNr">143 </span><span class="traceContains">+run: jumping to instruction 2</span> +<span id="L143" class="LineNr">143 </span><span class="traceContains">+run: jumping to <a href='010vm.cc.html#L32'>instruction</a> 2</span> <span id="L144" class="LineNr">144 </span><span class="traceAbsent">-run: {123: "number"} <- copy {1: "literal"}</span> <span id="L145" class="LineNr">145 </span><span class="traceAbsent">-mem: storing 1 in location 123</span> <span id="L146" class="LineNr">146 </span> <span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario jump_unless_fallthrough)</span> -<span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> main [ +<span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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> <span id="L150" class="LineNr">150 </span> <span class="Constant">123</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L151" class="LineNr">151 </span>] diff --git a/html/025compare.cc.html b/html/025compare.cc.html index 8e133853..f90f5aac 100644 --- a/html/025compare.cc.html +++ b/html/025compare.cc.html @@ -62,26 +62,26 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L4" class="LineNr"> 4 </span>EQUAL<span class="Delimiter">,</span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L6" class="LineNr"> 6 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"equal"</span><span class="Delimiter">,</span> EQUAL<span class="Delimiter">);</span> +<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"equal"</span><span class="Delimiter">,</span> EQUAL<span class="Delimiter">);</span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L8" class="LineNr"> 8 </span><span class="Normal">case</span> EQUAL: <span class="Delimiter">{</span> -<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> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L10" class="LineNr"> 10 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L9" class="LineNr"> 9 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L10" class="LineNr"> 10 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L11" class="LineNr"> 11 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L12" class="LineNr"> 12 </span> <span class="Delimiter">}</span> <span id="L13" class="LineNr"> 13 </span> <span class="Normal">const</span> reagent& 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 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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> && !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> -<span id="L16" class="LineNr"> 16 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' expects ingredients to be all of the same type, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' expects ingredients to be all of the same type, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L17" class="LineNr"> 17 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L18" class="LineNr"> 18 </span> <span class="Delimiter">}</span> <span id="L19" class="LineNr"> 19 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L21" class="LineNr"> 21 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L20" class="LineNr"> 20 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L21" class="LineNr"> 21 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L22" class="LineNr"> 22 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L23" class="LineNr"> 23 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L25" class="LineNr"> 25 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L25" class="LineNr"> 25 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L26" class="LineNr"> 26 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L27" class="LineNr"> 27 </span> <span class="Delimiter">}</span> <span id="L28" class="LineNr"> 28 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -90,8 +90,8 @@ if ('onhashchange' in window) { <span id="L31" class="LineNr"> 31 </span><span class="Normal">case</span> EQUAL: <span class="Delimiter">{</span> <span id="L32" class="LineNr"> 32 </span> vector<<span class="Normal">double</span>>& exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L33" class="LineNr"> 33 </span> <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">(),</span> exemplar<span class="Delimiter">.</span>begin<span class="Delimiter">()))</span> <span class="Delimiter">{</span> <span id="L36" class="LineNr"> 36 </span> result = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L37" class="LineNr"> 37 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L38" class="LineNr"> 38 </span> <span class="Delimiter">}</span> @@ -102,7 +102,7 @@ if ('onhashchange' in window) { <span id="L43" class="LineNr"> 43 </span><span class="Delimiter">}</span> <span id="L44" class="LineNr"> 44 </span> <span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(scenario equal)</span> -<span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> main [ +<span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L47" class="LineNr"> 47 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L48" class="LineNr"> 48 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L49" class="LineNr"> 49 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -112,7 +112,7 @@ if ('onhashchange' in window) { <span id="L53" class="LineNr"> 53 </span><span class="traceContains">+mem: storing 0 in location 3</span> <span id="L54" class="LineNr"> 54 </span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario equal_2)</span> -<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [ +<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L57" class="LineNr"> 57 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L58" class="LineNr"> 58 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L59" class="LineNr"> 59 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -122,13 +122,13 @@ if ('onhashchange' in window) { <span id="L63" class="LineNr"> 63 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L64" class="LineNr"> 64 </span> <span id="L65" class="LineNr"> 65 </span><span class="Delimiter">:(scenario equal_multiple)</span> -<span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> main [ +<span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L67" class="LineNr"> 67 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L68" class="LineNr"> 68 </span>] <span id="L69" class="LineNr"> 69 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L70" class="LineNr"> 70 </span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario equal_multiple_2)</span> -<span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [ +<span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L73" class="LineNr"> 73 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L74" class="LineNr"> 74 </span>] <span id="L75" class="LineNr"> 75 </span><span class="traceContains">+mem: storing 0 in location 1</span> @@ -136,24 +136,24 @@ if ('onhashchange' in window) { <span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L78" class="LineNr"> 78 </span>NOT_EQUAL<span class="Delimiter">,</span> <span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L80" class="LineNr"> 80 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"not-equal"</span><span class="Delimiter">,</span> NOT_EQUAL<span class="Delimiter">);</span> +<span id="L80" class="LineNr"> 80 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"not-equal"</span><span class="Delimiter">,</span> NOT_EQUAL<span class="Delimiter">);</span> <span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L82" class="LineNr"> 82 </span><span class="Normal">case</span> NOT_EQUAL: <span class="Delimiter">{</span> -<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> -<span id="L84" class="LineNr"> 84 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' needs two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L83" class="LineNr"> 83 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L84" class="LineNr"> 84 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' needs two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L85" class="LineNr"> 85 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">}</span> <span id="L87" class="LineNr"> 87 </span> <span class="Normal">const</span> reagent& 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 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> && !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> -<span id="L89" class="LineNr"> 89 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' expects ingredients to be all of the same type, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L89" class="LineNr"> 89 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' expects ingredients to be all of the same type, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L90" class="LineNr"> 90 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L93" class="LineNr"> 93 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L92" class="LineNr"> 92 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L93" class="LineNr"> 93 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L94" class="LineNr"> 94 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L95" class="LineNr"> 95 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L97" class="LineNr"> 97 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L97" class="LineNr"> 97 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L98" class="LineNr"> 98 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">}</span> <span id="L100" class="LineNr">100 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -162,13 +162,13 @@ if ('onhashchange' in window) { <span id="L103" class="LineNr">103 </span><span class="Normal">case</span> NOT_EQUAL: <span class="Delimiter">{</span> <span id="L104" class="LineNr">104 </span> vector<<span class="Normal">double</span>>& exemplar = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <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> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">(),</span> exemplar<span class="Delimiter">.</span>begin<span class="Delimiter">());</span> <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> <span id="L108" class="LineNr">108 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L109" class="LineNr">109 </span><span class="Delimiter">}</span> <span id="L110" class="LineNr">110 </span> <span id="L111" class="LineNr">111 </span><span class="Delimiter">:(scenario not_equal)</span> -<span id="L112" class="LineNr">112 </span><span class="muRecipe">def</span> main [ +<span id="L112" class="LineNr">112 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L113" class="LineNr">113 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L114" class="LineNr">114 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L115" class="LineNr">115 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span><span class="Normal">not</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -178,7 +178,7 @@ if ('onhashchange' in window) { <span id="L119" class="LineNr">119 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L120" class="LineNr">120 </span> <span id="L121" class="LineNr">121 </span><span class="Delimiter">:(scenario not_equal_2)</span> -<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> main [ +<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L123" class="LineNr">123 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L124" class="LineNr">124 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L125" class="LineNr">125 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span><span class="Normal">not</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -190,25 +190,25 @@ if ('onhashchange' in window) { <span id="L131" class="LineNr">131 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L132" class="LineNr">132 </span>GREATER_THAN<span class="Delimiter">,</span> <span id="L133" class="LineNr">133 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L134" class="LineNr">134 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"greater-than"</span><span class="Delimiter">,</span> GREATER_THAN<span class="Delimiter">);</span> +<span id="L134" class="LineNr">134 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"greater-than"</span><span class="Delimiter">,</span> GREATER_THAN<span class="Delimiter">);</span> <span id="L135" class="LineNr">135 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L136" class="LineNr">136 </span><span class="Normal">case</span> GREATER_THAN: <span class="Delimiter">{</span> -<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> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L138" class="LineNr">138 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L137" class="LineNr">137 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L138" class="LineNr">138 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L139" class="LineNr">139 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span> -<span id="L141" class="LineNr">141 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L143" class="LineNr">143 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L144" class="LineNr">144 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span> <span id="L146" class="LineNr">146 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L148" class="LineNr">148 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L147" class="LineNr">147 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L148" class="LineNr">148 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L149" class="LineNr">149 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L150" class="LineNr">150 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L152" class="LineNr">152 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L152" class="LineNr">152 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-than' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L153" class="LineNr">153 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L154" class="LineNr">154 </span> <span class="Delimiter">}</span> <span id="L155" class="LineNr">155 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -216,7 +216,7 @@ if ('onhashchange' in window) { <span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L158" class="LineNr">158 </span><span class="Normal">case</span> GREATER_THAN: <span class="Delimiter">{</span> <span id="L159" class="LineNr">159 </span> <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <= 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 id="L162" class="LineNr">162 </span> result = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L163" class="LineNr">163 </span> <span class="Delimiter">}</span> @@ -227,7 +227,7 @@ if ('onhashchange' in window) { <span id="L168" class="LineNr">168 </span><span class="Delimiter">}</span> <span id="L169" class="LineNr">169 </span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">:(scenario greater_than)</span> -<span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> main [ +<span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L172" class="LineNr">172 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L173" class="LineNr">173 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L174" class="LineNr">174 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>greater-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -235,7 +235,7 @@ if ('onhashchange' in window) { <span id="L176" class="LineNr">176 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L177" class="LineNr">177 </span> <span id="L178" class="LineNr">178 </span><span class="Delimiter">:(scenario greater_than_2)</span> -<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> main [ +<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L180" class="LineNr">180 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L181" class="LineNr">181 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L182" class="LineNr">182 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>greater-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -243,13 +243,13 @@ if ('onhashchange' in window) { <span id="L184" class="LineNr">184 </span><span class="traceContains">+mem: storing 0 in location 3</span> <span id="L185" class="LineNr">185 </span> <span id="L186" class="LineNr">186 </span><span class="Delimiter">:(scenario greater_than_multiple)</span> -<span id="L187" class="LineNr">187 </span><span class="muRecipe">def</span> main [ +<span id="L187" class="LineNr">187 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L188" class="LineNr">188 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L189" class="LineNr">189 </span>] <span id="L190" class="LineNr">190 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L191" class="LineNr">191 </span> <span id="L192" class="LineNr">192 </span><span class="Delimiter">:(scenario greater_than_multiple_2)</span> -<span id="L193" class="LineNr">193 </span><span class="muRecipe">def</span> main [ +<span id="L193" class="LineNr">193 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L194" class="LineNr">194 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L195" class="LineNr">195 </span>] <span id="L196" class="LineNr">196 </span><span class="traceContains">+mem: storing 0 in location 1</span> @@ -257,25 +257,25 @@ if ('onhashchange' in window) { <span id="L198" class="LineNr">198 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L199" class="LineNr">199 </span>LESSER_THAN<span class="Delimiter">,</span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L201" class="LineNr">201 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"lesser-than"</span><span class="Delimiter">,</span> LESSER_THAN<span class="Delimiter">);</span> +<span id="L201" class="LineNr">201 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"lesser-than"</span><span class="Delimiter">,</span> LESSER_THAN<span class="Delimiter">);</span> <span id="L202" class="LineNr">202 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L203" class="LineNr">203 </span><span class="Normal">case</span> LESSER_THAN: <span class="Delimiter">{</span> -<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> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L205" class="LineNr">205 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L204" class="LineNr">204 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L205" class="LineNr">205 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L206" class="LineNr">206 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L207" class="LineNr">207 </span> <span class="Delimiter">}</span> -<span id="L208" class="LineNr">208 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L210" class="LineNr">210 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L210" class="LineNr">210 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L211" class="LineNr">211 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L212" class="LineNr">212 </span> <span class="Delimiter">}</span> <span id="L213" class="LineNr">213 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L215" class="LineNr">215 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L214" class="LineNr">214 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L216" class="LineNr">216 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L217" class="LineNr">217 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L219" class="LineNr">219 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L219" class="LineNr">219 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-than' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L220" class="LineNr">220 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L221" class="LineNr">221 </span> <span class="Delimiter">}</span> <span id="L222" class="LineNr">222 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -283,7 +283,7 @@ if ('onhashchange' in window) { <span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L225" class="LineNr">225 </span><span class="Normal">case</span> LESSER_THAN: <span class="Delimiter">{</span> <span id="L226" class="LineNr">226 </span> <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> >= 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 id="L229" class="LineNr">229 </span> result = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L230" class="LineNr">230 </span> <span class="Delimiter">}</span> @@ -294,7 +294,7 @@ if ('onhashchange' in window) { <span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span> <span id="L236" class="LineNr">236 </span> <span id="L237" class="LineNr">237 </span><span class="Delimiter">:(scenario lesser_than)</span> -<span id="L238" class="LineNr">238 </span><span class="muRecipe">def</span> main [ +<span id="L238" class="LineNr">238 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L239" class="LineNr">239 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">32</span> <span id="L240" class="LineNr">240 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L241" class="LineNr">241 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>lesser-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -302,7 +302,7 @@ if ('onhashchange' in window) { <span id="L243" class="LineNr">243 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L244" class="LineNr">244 </span> <span id="L245" class="LineNr">245 </span><span class="Delimiter">:(scenario lesser_than_2)</span> -<span id="L246" class="LineNr">246 </span><span class="muRecipe">def</span> main [ +<span id="L246" class="LineNr">246 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L247" class="LineNr">247 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L248" class="LineNr">248 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L249" class="LineNr">249 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>lesser-than <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -310,13 +310,13 @@ if ('onhashchange' in window) { <span id="L251" class="LineNr">251 </span><span class="traceContains">+mem: storing 0 in location 3</span> <span id="L252" class="LineNr">252 </span> <span id="L253" class="LineNr">253 </span><span class="Delimiter">:(scenario lesser_than_multiple)</span> -<span id="L254" class="LineNr">254 </span><span class="muRecipe">def</span> main [ +<span id="L254" class="LineNr">254 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L255" class="LineNr">255 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L256" class="LineNr">256 </span>] <span id="L257" class="LineNr">257 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L258" class="LineNr">258 </span> <span id="L259" class="LineNr">259 </span><span class="Delimiter">:(scenario lesser_than_multiple_2)</span> -<span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> main [ +<span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L261" class="LineNr">261 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L262" class="LineNr">262 </span>] <span id="L263" class="LineNr">263 </span><span class="traceContains">+mem: storing 0 in location 1</span> @@ -324,25 +324,25 @@ if ('onhashchange' in window) { <span id="L265" class="LineNr">265 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L266" class="LineNr">266 </span>GREATER_OR_EQUAL<span class="Delimiter">,</span> <span id="L267" class="LineNr">267 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L268" class="LineNr">268 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"greater-or-equal"</span><span class="Delimiter">,</span> GREATER_OR_EQUAL<span class="Delimiter">);</span> +<span id="L268" class="LineNr">268 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"greater-or-equal"</span><span class="Delimiter">,</span> GREATER_OR_EQUAL<span class="Delimiter">);</span> <span id="L269" class="LineNr">269 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L270" class="LineNr">270 </span><span class="Normal">case</span> GREATER_OR_EQUAL: <span class="Delimiter">{</span> -<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> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L272" class="LineNr">272 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L271" class="LineNr">271 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L272" class="LineNr">272 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L273" class="LineNr">273 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L274" class="LineNr">274 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L277" class="LineNr">277 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L277" class="LineNr">277 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L278" class="LineNr">278 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L279" class="LineNr">279 </span> <span class="Delimiter">}</span> <span id="L280" class="LineNr">280 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L282" class="LineNr">282 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L281" class="LineNr">281 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L282" class="LineNr">282 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L283" class="LineNr">283 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L284" class="LineNr">284 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L286" class="LineNr">286 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L286" class="LineNr">286 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L287" class="LineNr">287 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L288" class="LineNr">288 </span> <span class="Delimiter">}</span> <span id="L289" class="LineNr">289 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -350,7 +350,7 @@ if ('onhashchange' in window) { <span id="L291" class="LineNr">291 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L292" class="LineNr">292 </span><span class="Normal">case</span> GREATER_OR_EQUAL: <span class="Delimiter">{</span> <span id="L293" class="LineNr">293 </span> <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> < 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 id="L296" class="LineNr">296 </span> result = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L297" class="LineNr">297 </span> <span class="Delimiter">}</span> @@ -361,7 +361,7 @@ if ('onhashchange' in window) { <span id="L302" class="LineNr">302 </span><span class="Delimiter">}</span> <span id="L303" class="LineNr">303 </span> <span id="L304" class="LineNr">304 </span><span class="Delimiter">:(scenario greater_or_equal)</span> -<span id="L305" class="LineNr">305 </span><span class="muRecipe">def</span> main [ +<span id="L305" class="LineNr">305 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L306" class="LineNr">306 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L307" class="LineNr">307 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L308" class="LineNr">308 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -369,7 +369,7 @@ if ('onhashchange' in window) { <span id="L310" class="LineNr">310 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L311" class="LineNr">311 </span> <span id="L312" class="LineNr">312 </span><span class="Delimiter">:(scenario greater_or_equal_2)</span> -<span id="L313" class="LineNr">313 </span><span class="muRecipe">def</span> main [ +<span id="L313" class="LineNr">313 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L314" class="LineNr">314 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L315" class="LineNr">315 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L316" class="LineNr">316 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -377,7 +377,7 @@ if ('onhashchange' in window) { <span id="L318" class="LineNr">318 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L319" class="LineNr">319 </span> <span id="L320" class="LineNr">320 </span><span class="Delimiter">:(scenario greater_or_equal_3)</span> -<span id="L321" class="LineNr">321 </span><span class="muRecipe">def</span> main [ +<span id="L321" class="LineNr">321 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L322" class="LineNr">322 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L323" class="LineNr">323 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L324" class="LineNr">324 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -385,13 +385,13 @@ if ('onhashchange' in window) { <span id="L326" class="LineNr">326 </span><span class="traceContains">+mem: storing 0 in location 3</span> <span id="L327" class="LineNr">327 </span> <span id="L328" class="LineNr">328 </span><span class="Delimiter">:(scenario greater_or_equal_multiple)</span> -<span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> main [ +<span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L330" class="LineNr">330 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L331" class="LineNr">331 </span>] <span id="L332" class="LineNr">332 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L333" class="LineNr">333 </span> <span id="L334" class="LineNr">334 </span><span class="Delimiter">:(scenario greater_or_equal_multiple_2)</span> -<span id="L335" class="LineNr">335 </span><span class="muRecipe">def</span> main [ +<span id="L335" class="LineNr">335 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L336" class="LineNr">336 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L337" class="LineNr">337 </span>] <span id="L338" class="LineNr">338 </span><span class="traceContains">+mem: storing 0 in location 1</span> @@ -399,25 +399,25 @@ if ('onhashchange' in window) { <span id="L340" class="LineNr">340 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L341" class="LineNr">341 </span>LESSER_OR_EQUAL<span class="Delimiter">,</span> <span id="L342" class="LineNr">342 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L343" class="LineNr">343 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"lesser-or-equal"</span><span class="Delimiter">,</span> LESSER_OR_EQUAL<span class="Delimiter">);</span> +<span id="L343" class="LineNr">343 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"lesser-or-equal"</span><span class="Delimiter">,</span> LESSER_OR_EQUAL<span class="Delimiter">);</span> <span id="L344" class="LineNr">344 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L345" class="LineNr">345 </span><span class="Normal">case</span> LESSER_OR_EQUAL: <span class="Delimiter">{</span> -<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> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L347" class="LineNr">347 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-or-equal' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L346" class="LineNr">346 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L347" class="LineNr">347 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-or-equal' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L348" class="LineNr">348 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L349" class="LineNr">349 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L352" class="LineNr">352 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-or-equal' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L352" class="LineNr">352 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'lesser-or-equal' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L353" class="LineNr">353 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L354" class="LineNr">354 </span> <span class="Delimiter">}</span> <span id="L355" class="LineNr">355 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L357" class="LineNr">357 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L356" class="LineNr">356 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L357" class="LineNr">357 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L358" class="LineNr">358 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L359" class="LineNr">359 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L361" class="LineNr">361 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L361" class="LineNr">361 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'greater-or-equal' should yield a boolean, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L362" class="LineNr">362 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L363" class="LineNr">363 </span> <span class="Delimiter">}</span> <span id="L364" class="LineNr">364 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -425,7 +425,7 @@ if ('onhashchange' in window) { <span id="L366" class="LineNr">366 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L367" class="LineNr">367 </span><span class="Normal">case</span> LESSER_OR_EQUAL: <span class="Delimiter">{</span> <span id="L368" class="LineNr">368 </span> <span class="Normal">bool</span> result = <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> > 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 id="L371" class="LineNr">371 </span> result = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L372" class="LineNr">372 </span> <span class="Delimiter">}</span> @@ -436,7 +436,7 @@ if ('onhashchange' in window) { <span id="L377" class="LineNr">377 </span><span class="Delimiter">}</span> <span id="L378" class="LineNr">378 </span> <span id="L379" class="LineNr">379 </span><span class="Delimiter">:(scenario lesser_or_equal)</span> -<span id="L380" class="LineNr">380 </span><span class="muRecipe">def</span> main [ +<span id="L380" class="LineNr">380 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L381" class="LineNr">381 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">32</span> <span id="L382" class="LineNr">382 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L383" class="LineNr">383 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -444,7 +444,7 @@ if ('onhashchange' in window) { <span id="L385" class="LineNr">385 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L386" class="LineNr">386 </span> <span id="L387" class="LineNr">387 </span><span class="Delimiter">:(scenario lesser_or_equal_2)</span> -<span id="L388" class="LineNr">388 </span><span class="muRecipe">def</span> main [ +<span id="L388" class="LineNr">388 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L389" class="LineNr">389 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L390" class="LineNr">390 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L391" class="LineNr">391 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -452,7 +452,7 @@ if ('onhashchange' in window) { <span id="L393" class="LineNr">393 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L394" class="LineNr">394 </span> <span id="L395" class="LineNr">395 </span><span class="Delimiter">:(scenario lesser_or_equal_3)</span> -<span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span> main [ +<span id="L396" class="LineNr">396 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L397" class="LineNr">397 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L398" class="LineNr">398 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">33</span> <span id="L399" class="LineNr">399 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>lesser-<span class="Normal">or</span>-equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -460,13 +460,13 @@ if ('onhashchange' in window) { <span id="L401" class="LineNr">401 </span><span class="traceContains">+mem: storing 0 in location 3</span> <span id="L402" class="LineNr">402 </span> <span id="L403" class="LineNr">403 </span><span class="Delimiter">:(scenario lesser_or_equal_multiple)</span> -<span id="L404" class="LineNr">404 </span><span class="muRecipe">def</span> main [ +<span id="L404" class="LineNr">404 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L405" class="LineNr">405 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L406" class="LineNr">406 </span>] <span id="L407" class="LineNr">407 </span><span class="traceContains">+mem: storing 1 in location 1</span> <span id="L408" class="LineNr">408 </span> <span id="L409" class="LineNr">409 </span><span class="Delimiter">:(scenario lesser_or_equal_multiple_2)</span> -<span id="L410" class="LineNr">410 </span><span class="muRecipe">def</span> main [ +<span id="L410" class="LineNr">410 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L411" class="LineNr">411 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </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 id="L412" class="LineNr">412 </span>] <span id="L413" class="LineNr">413 </span><span class="traceContains">+mem: storing 0 in location 1</span> @@ -474,25 +474,25 @@ if ('onhashchange' in window) { <span id="L415" class="LineNr">415 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L416" class="LineNr">416 </span>MAX<span class="Delimiter">,</span> <span id="L417" class="LineNr">417 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L418" class="LineNr">418 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"max"</span><span class="Delimiter">,</span> MAX<span class="Delimiter">);</span> +<span id="L418" class="LineNr">418 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"max"</span><span class="Delimiter">,</span> MAX<span class="Delimiter">);</span> <span id="L419" class="LineNr">419 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L420" class="LineNr">420 </span><span class="Normal">case</span> MAX: <span class="Delimiter">{</span> -<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> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L422" class="LineNr">422 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L421" class="LineNr">421 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L422" class="LineNr">422 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L423" class="LineNr">423 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L424" class="LineNr">424 </span> <span class="Delimiter">}</span> -<span id="L425" class="LineNr">425 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L427" class="LineNr">427 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L427" class="LineNr">427 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L428" class="LineNr">428 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L429" class="LineNr">429 </span> <span class="Delimiter">}</span> <span id="L430" class="LineNr">430 </span> <span class="Delimiter">}</span> -<span id="L431" class="LineNr">431 </span> <span 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> -<span id="L432" class="LineNr">432 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L431" class="LineNr">431 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L432" class="LineNr">432 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L433" class="LineNr">433 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L434" class="LineNr">434 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L436" class="LineNr">436 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L436" class="LineNr">436 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'max' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L437" class="LineNr">437 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L438" class="LineNr">438 </span> <span class="Delimiter">}</span> <span id="L439" class="LineNr">439 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -500,7 +500,7 @@ if ('onhashchange' in window) { <span id="L441" class="LineNr">441 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L442" class="LineNr">442 </span><span class="Normal">case</span> MAX: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> > result<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L447" class="LineNr">447 </span> <span class="Delimiter">}</span> @@ -513,25 +513,25 @@ if ('onhashchange' in window) { <span id="L454" class="LineNr">454 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L455" class="LineNr">455 </span>MIN<span class="Delimiter">,</span> <span id="L456" class="LineNr">456 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L457" class="LineNr">457 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"min"</span><span class="Delimiter">,</span> MIN<span class="Delimiter">);</span> +<span id="L457" class="LineNr">457 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"min"</span><span class="Delimiter">,</span> MIN<span class="Delimiter">);</span> <span id="L458" class="LineNr">458 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L459" class="LineNr">459 </span><span class="Normal">case</span> MIN: <span class="Delimiter">{</span> -<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> -<span id="L461" class="LineNr">461 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L460" class="LineNr">460 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> <= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L461" class="LineNr">461 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' needs at least two ingredients to compare in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L462" class="LineNr">462 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L463" class="LineNr">463 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L466" class="LineNr">466 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L466" class="LineNr">466 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' can only compare numbers; got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L467" class="LineNr">467 </span> <span class="Identifier">goto</span> finish_checking_instruction<span class="Delimiter">;</span> <span id="L468" class="LineNr">468 </span> <span class="Delimiter">}</span> <span id="L469" class="LineNr">469 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L471" class="LineNr">471 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L470" class="LineNr">470 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L471" class="LineNr">471 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' yields exactly one product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L472" class="LineNr">472 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L473" class="LineNr">473 </span> <span class="Delimiter">}</span> <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> && !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> && !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> -<span id="L475" class="LineNr">475 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L475" class="LineNr">475 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'min' should yield a number, but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L476" class="LineNr">476 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L477" class="LineNr">477 </span> <span class="Delimiter">}</span> <span id="L478" class="LineNr">478 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -539,7 +539,7 @@ if ('onhashchange' in window) { <span id="L480" class="LineNr">480 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L481" class="LineNr">481 </span><span class="Normal">case</span> MIN: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> < result<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L486" class="LineNr">486 </span> <span class="Delimiter">}</span> diff --git a/html/026call.cc.html b/html/026call.cc.html index bfb31307..02184410 100644 --- a/html/026call.cc.html +++ b/html/026call.cc.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <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> <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario calling_recipe)</span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [ +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L5" class="LineNr"> 5 </span> f <span id="L6" class="LineNr"> 6 </span>] <span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> f [ @@ -70,7 +70,7 @@ if ('onhashchange' in window) { <span id="L10" class="LineNr"> 10 </span><span class="traceContains">+mem: storing 4 in location 3</span> <span id="L11" class="LineNr"> 11 </span> <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenario return_on_fallthrough)</span> -<span id="L13" class="LineNr"> 13 </span><span class="muRecipe">def</span> main [ +<span id="L13" class="LineNr"> 13 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L14" class="LineNr"> 14 </span> f <span id="L15" class="LineNr"> 15 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L16" class="LineNr"> 16 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -94,10 +94,10 @@ if ('onhashchange' in window) { <span id="L34" class="LineNr"> 34 </span><span class="Comment">// recipe. When that finishes, we continue this one where we left off.</span> <span id="L35" class="LineNr"> 35 </span><span class="Comment">// This requires maintaining a 'stack' of interrupted recipes or 'calls'.</span> <span id="L36" class="LineNr"> 36 </span><span class="Normal">struct</span> call <span class="Delimiter">{</span> -<span id="L37" class="LineNr"> 37 </span> recipe_ordinal running_recipe<span class="Delimiter">;</span> +<span id="L37" class="LineNr"> 37 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> running_recipe<span class="Delimiter">;</span> <span id="L38" class="LineNr"> 38 </span> <span class="Normal">int</span> running_step_index<span class="Delimiter">;</span> <span id="L39" class="LineNr"> 39 </span> <span class="Comment">// End call Fields</span> -<span id="L40" class="LineNr"> 40 </span> call<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L40" class="LineNr"> 40 </span> call<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L41" class="LineNr"> 41 </span> running_recipe = r<span class="Delimiter">;</span> <span id="L42" class="LineNr"> 42 </span> running_step_index = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L43" class="LineNr"> 43 </span> <span class="Comment">// End call Constructor</span> @@ -112,15 +112,15 @@ if ('onhashchange' in window) { <span id="L52" class="LineNr"> 52 </span><span class="Normal">struct</span> routine <span class="Delimiter">{</span> <span id="L53" class="LineNr"> 53 </span> call_stack calls<span class="Delimiter">;</span> <span id="L54" class="LineNr"> 54 </span> <span class="Comment">// End routine Fields</span> -<span id="L55" class="LineNr"> 55 </span> routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">);</span> +<span id="L55" class="LineNr"> 55 </span> routine<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">);</span> <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> <span id="L57" class="LineNr"> 57 </span> <span class="Normal">const</span> vector<instruction>& steps<span class="Delimiter">()</span> <span class="Normal">const</span><span class="Delimiter">;</span> <span id="L58" class="LineNr"> 58 </span><span class="Delimiter">};</span> <span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(code)</span> -<span id="L60" class="LineNr"> 60 </span>routine::routine<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L60" class="LineNr"> 60 </span>routine::routine<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L62" class="LineNr"> 62 </span> ++Trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">;</span> -<span id="L63" class="LineNr"> 63 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"new routine; incrementing callstack depth to "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << end<span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"new routine; incrementing callstack depth to "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L64" class="LineNr"> 64 </span> assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>callstack_depth < <span class="Constant">9000</span><span class="Delimiter">);</span> <span class="Comment">// 9998-101 plus cushion</span> <span id="L65" class="LineNr"> 65 </span> <span class="Delimiter">}</span> <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> @@ -162,13 +162,13 @@ if ('onhashchange' in window) { <span id="L102" class="LineNr">102 </span><span class="Delimiter">:(after "Defined Recipe Checks")</span> <span id="L103" class="LineNr">103 </span><span class="Comment">// not a primitive; check that it's present in the book of recipes</span> <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> -<span id="L105" class="LineNr">105 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"undefined operation in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L105" class="LineNr">105 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"undefined operation in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L106" class="LineNr">106 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span> <span id="L108" class="LineNr">108 </span><span class="Delimiter">:(replace{} "default:" following "End Primitive Recipe Implementations")</span> <span id="L109" class="LineNr">109 </span><span class="Normal">default</span>: <span class="Delimiter">{</span> <span id="L110" class="LineNr">110 </span> <span class="Normal">const</span> instruction& call_instruction = current_instruction<span class="Delimiter">();</span> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> <span class="Comment">// duplicate from Checks</span> <span id="L112" class="LineNr">112 </span> <span class="Comment">// stop running this instruction immediately</span> <span id="L113" class="LineNr">113 </span> ++current_step_index<span class="Delimiter">();</span> <span id="L114" class="LineNr">114 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> @@ -176,7 +176,7 @@ if ('onhashchange' in window) { <span id="L116" class="LineNr">116 </span> <span class="Comment">// not a primitive; look up the book of recipes</span> <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> <span id="L118" class="LineNr">118 </span> ++Trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">;</span> -<span id="L119" class="LineNr">119 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"incrementing callstack depth to "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << end<span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"incrementing callstack depth to "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L120" class="LineNr">120 </span> assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>callstack_depth < <span class="Constant">9000</span><span class="Delimiter">);</span> <span class="Comment">// 9998-101 plus cushion</span> <span id="L121" class="LineNr">121 </span> <span class="Delimiter">}</span> <span id="L122" class="LineNr">122 </span> Current_routine<span class="Delimiter">-></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> @@ -190,17 +190,17 @@ if ('onhashchange' in window) { <span id="L130" class="LineNr">130 </span> <span id="L131" class="LineNr">131 </span><span class="Delimiter">:(scenario calling_undefined_recipe_fails)</span> <span id="L132" class="LineNr">132 </span><span class="Special">% Hide_errors = true;</span> -<span id="L133" class="LineNr">133 </span><span class="muRecipe">def</span> main [ +<span id="L133" class="LineNr">133 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L134" class="LineNr">134 </span> foo <span id="L135" class="LineNr">135 </span>] -<span id="L136" class="LineNr">136 </span><span class="traceContains">+error: main: undefined operation in 'foo '</span> +<span id="L136" class="LineNr">136 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: undefined operation in 'foo '</span> <span id="L137" class="LineNr">137 </span> <span id="L138" class="LineNr">138 </span><span class="Delimiter">:(scenario calling_undefined_recipe_handles_missing_result)</span> <span id="L139" class="LineNr">139 </span><span class="Special">% Hide_errors = true;</span> -<span id="L140" class="LineNr">140 </span><span class="muRecipe">def</span> main [ +<span id="L140" class="LineNr">140 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L141" class="LineNr">141 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>foo <span id="L142" class="LineNr">142 </span>] -<span id="L143" class="LineNr">143 </span><span class="traceContains">+error: main: undefined operation in 'x:num <- foo '</span> +<span id="L143" class="LineNr">143 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: undefined operation in 'x:num <- foo '</span> <span id="L144" class="LineNr">144 </span> <span id="L145" class="LineNr">145 </span><span class="SalientComment">//:: finally, we need to fix the termination conditions for the run loop</span> <span id="L146" class="LineNr">146 </span> @@ -218,10 +218,10 @@ if ('onhashchange' in window) { <span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before "Running One Instruction")</span> <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> <span id="L160" class="LineNr">160 </span><span class="Comment">// it, and the one below that, and so on</span> -<span id="L161" class="LineNr">161 </span><span class="Normal">while</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> >= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>steps<span class="Delimiter">()))</span> <span class="Delimiter">{</span> +<span id="L161" class="LineNr">161 </span><span class="Normal">while</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>steps<span class="Delimiter">()))</span> <span class="Delimiter">{</span> <span id="L162" class="LineNr">162 </span> <span class="Comment">// Falling Through End Of Recipe</span> <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> -<span id="L164" class="LineNr">164 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"fall-through: exiting "</span> << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">"; decrementing callstack depth from "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << end<span class="Delimiter">();</span> +<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"fall-through: exiting "</span> << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">"; decrementing callstack depth from "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L165" class="LineNr">165 </span> --Trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">;</span> <span id="L166" class="LineNr">166 </span> assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>callstack_depth >= <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L167" class="LineNr">167 </span> <span class="Delimiter">}</span> diff --git a/html/027call_ingredient.cc.html b/html/027call_ingredient.cc.html index a3411945..f3abc7ab 100644 --- a/html/027call_ingredient.cc.html +++ b/html/027call_ingredient.cc.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span><span class="Comment">//: ingredients, use 'next-ingredient'.</span> <span id="L3" class="LineNr"> 3 </span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario next_ingredient)</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L6" class="LineNr"> 6 </span> f <span class="Constant">2</span> <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> f [ @@ -71,7 +71,7 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span><span class="traceContains">+mem: storing 3 in location 13</span> <span id="L13" class="LineNr"> 13 </span> <span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(scenario next_ingredient_missing)</span> -<span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> main [ +<span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L16" class="LineNr"> 16 </span> f <span id="L17" class="LineNr"> 17 </span>] <span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> f [ @@ -87,7 +87,7 @@ if ('onhashchange' in window) { <span id="L28" class="LineNr"> 28 </span>next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L29" class="LineNr"> 29 </span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before "End Call Housekeeping")</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <span id="L34" class="LineNr"> 34 </span> <span class="Comment">// End Compute Call Ingredient</span> @@ -98,11 +98,11 @@ if ('onhashchange' in window) { <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L40" class="LineNr"> 40 </span>NEXT_INGREDIENT<span class="Delimiter">,</span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L42" class="LineNr"> 42 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"next-ingredient"</span><span class="Delimiter">,</span> NEXT_INGREDIENT<span class="Delimiter">);</span> +<span id="L42" class="LineNr"> 42 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"next-ingredient"</span><span class="Delimiter">,</span> NEXT_INGREDIENT<span class="Delimiter">);</span> <span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L44" class="LineNr"> 44 </span><span class="Normal">case</span> NEXT_INGREDIENT: <span class="Delimiter">{</span> <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> -<span id="L46" class="LineNr"> 46 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'next-ingredient' didn't expect any ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'next-ingredient' didn't expect any ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L47" class="LineNr"> 47 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L48" class="LineNr"> 48 </span> <span class="Delimiter">}</span> <span id="L49" class="LineNr"> 49 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -110,29 +110,29 @@ if ('onhashchange' in window) { <span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L52" class="LineNr"> 52 </span><span class="Normal">case</span> NEXT_INGREDIENT: <span class="Delimiter">{</span> <span id="L53" class="LineNr"> 53 </span> assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> -<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 < SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> <span id="L56" class="LineNr"> 56 </span> <span class="Comment">// End Preprocess NEXT_INGREDIENT product</span> <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">"main"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L59" class="LineNr"> 59 </span> <span class="Comment">// todo: how to test this?</span> <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> -<span id="L61" class="LineNr"> 61 </span> raise << <span class="Constant">"main: wrong type for ingredient '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"main: wrong type for ingredient '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L62" class="LineNr"> 62 </span> <span class="Delimiter">}</span> <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> <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> -<span id="L65" class="LineNr"> 65 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"wrong type for ingredient '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L65" class="LineNr"> 65 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"wrong type for ingredient '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L66" class="LineNr"> 66 </span> <span class="Comment">// End next-ingredient Type Mismatch Error</span> <span id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span> <span id="L68" class="LineNr"> 68 </span> products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span> <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> -<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> +<span id="L70" class="LineNr"> 70 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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> <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> <span id="L72" class="LineNr"> 72 </span> ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span> <span id="L73" class="LineNr"> 73 </span> <span class="Delimiter">}</span> <span id="L74" class="LineNr"> 74 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<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> < <span class="Constant">2</span><span class="Delimiter">)</span> -<span id="L76" class="LineNr"> 76 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"no ingredient to save in '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L75" class="LineNr"> 75 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> < <span class="Constant">2</span><span class="Delimiter">)</span> +<span id="L76" class="LineNr"> 76 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"no ingredient to save in '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="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> <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> <span id="L79" class="LineNr"> 79 </span> <span class="Comment">// pad the first product with sufficient zeros to match its type</span> @@ -144,7 +144,7 @@ if ('onhashchange' in window) { <span id="L85" class="LineNr"> 85 </span> <span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(scenario next_ingredient_fail_on_missing)</span> <span id="L87" class="LineNr"> 87 </span><span class="Special">% Hide_errors = true;</span> -<span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> main [ +<span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L89" class="LineNr"> 89 </span> f <span id="L90" class="LineNr"> 90 </span>] <span id="L91" class="LineNr"> 91 </span><span class="muRecipe">def</span> f [ @@ -153,7 +153,7 @@ if ('onhashchange' in window) { <span id="L94" class="LineNr"> 94 </span><span class="traceContains">+error: f: no ingredient to save in '11:num'</span> <span id="L95" class="LineNr"> 95 </span> <span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(scenario rewind_ingredients)</span> -<span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> main [ +<span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L98" class="LineNr"> 98 </span> f <span class="Constant">2</span> <span id="L99" class="LineNr"> 99 </span>] <span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> f [ @@ -170,7 +170,7 @@ if ('onhashchange' in window) { <span id="L111" class="LineNr">111 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L112" class="LineNr">112 </span>REWIND_INGREDIENTS<span class="Delimiter">,</span> <span id="L113" class="LineNr">113 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L114" class="LineNr">114 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"rewind-ingredients"</span><span class="Delimiter">,</span> REWIND_INGREDIENTS<span class="Delimiter">);</span> +<span id="L114" class="LineNr">114 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"rewind-ingredients"</span><span class="Delimiter">,</span> REWIND_INGREDIENTS<span class="Delimiter">);</span> <span id="L115" class="LineNr">115 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L116" class="LineNr">116 </span><span class="Normal">case</span> REWIND_INGREDIENTS: <span class="Delimiter">{</span> <span id="L117" class="LineNr">117 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -182,7 +182,7 @@ if ('onhashchange' in window) { <span id="L123" class="LineNr">123 </span><span class="Delimiter">}</span> <span id="L124" class="LineNr">124 </span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">:(scenario ingredient)</span> -<span id="L126" class="LineNr">126 </span><span class="muRecipe">def</span> main [ +<span id="L126" class="LineNr">126 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L127" class="LineNr">127 </span> f <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">2</span> <span id="L128" class="LineNr">128 </span>] <span id="L129" class="LineNr">129 </span><span class="muRecipe">def</span> f [ @@ -195,31 +195,31 @@ if ('onhashchange' in window) { <span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L137" class="LineNr">137 </span>INGREDIENT<span class="Delimiter">,</span> <span id="L138" class="LineNr">138 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L139" class="LineNr">139 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"ingredient"</span><span class="Delimiter">,</span> INGREDIENT<span class="Delimiter">);</span> +<span id="L139" class="LineNr">139 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"ingredient"</span><span class="Delimiter">,</span> INGREDIENT<span class="Delimiter">);</span> <span id="L140" class="LineNr">140 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L141" class="LineNr">141 </span><span class="Normal">case</span> INGREDIENT: <span class="Delimiter">{</span> -<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> -<span id="L143" class="LineNr">143 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'ingredient' expects exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L142" class="LineNr">142 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'ingredient' expects exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L144" class="LineNr">144 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span> <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> && !is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L147" class="LineNr">147 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'ingredient' expects a literal ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L147" class="LineNr">147 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'ingredient' expects a literal ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L148" class="LineNr">148 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L149" class="LineNr">149 </span> <span class="Delimiter">}</span> <span id="L150" class="LineNr">150 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L151" class="LineNr">151 </span><span class="Delimiter">}</span> <span id="L152" class="LineNr">152 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L153" class="LineNr">153 </span><span class="Normal">case</span> INGREDIENT: <span class="Delimiter">{</span> -<span id="L154" class="LineNr">154 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Normal">static_cast</span><<span class="Normal">int</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> < SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L154" class="LineNr">154 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Normal">static_cast</span><<span class="Normal">int</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> < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> <span id="L156" class="LineNr">156 </span> products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span> <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> -<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> +<span id="L158" class="LineNr">158 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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> <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> <span id="L160" class="LineNr">160 </span> ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span> <span id="L161" class="LineNr">161 </span> <span class="Delimiter">}</span> <span id="L162" class="LineNr">162 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L163" class="LineNr">163 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> @@ -230,7 +230,7 @@ if ('onhashchange' in window) { <span id="L171" class="LineNr">171 </span> <span id="L172" class="LineNr">172 </span><span class="Comment">//: a particularly common array type is the text, or address:array:character</span> <span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L174" class="LineNr">174 </span><span class="Normal">bool</span> <a href='027call_ingredient.cc.html#L174'>is_mu_text</a><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 id="L175" class="LineNr">175 </span> <span class="Comment">// End Preprocess is_mu_text(reagent x)</span> <span id="L176" class="LineNr">176 </span> <span class="Identifier">return</span> x<span class="Delimiter">.</span>type <span id="L177" class="LineNr">177 </span> && !x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>atom diff --git a/html/028call_return.cc.html b/html/028call_return.cc.html index f694cd68..80c6fc69 100644 --- a/html/028call_return.cc.html +++ b/html/028call_return.cc.html @@ -60,7 +60,7 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Comment">//: Calls can also generate products, using 'reply' or 'return'.</span> <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario return)</span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [ +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>f <span class="Constant">34</span> <span id="L6" class="LineNr"> 6 </span>] <span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> f [ @@ -72,7 +72,7 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr"> 13 </span><span class="traceContains">+mem: storing 35 in location 2</span> <span id="L14" class="LineNr"> 14 </span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(scenario reply)</span> -<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> main [ +<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>f <span class="Constant">34</span> <span id="L18" class="LineNr"> 18 </span>] <span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> f [ @@ -86,8 +86,8 @@ if ('onhashchange' in window) { <span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L28" class="LineNr"> 28 </span>RETURN<span class="Delimiter">,</span> <span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L30" class="LineNr"> 30 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"return"</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span> -<span id="L31" class="LineNr"> 31 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"reply"</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span> <span class="Comment">// synonym while teaching</span> +<span id="L30" class="LineNr"> 30 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"return"</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span> +<span id="L31" class="LineNr"> 31 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"reply"</span><span class="Delimiter">,</span> RETURN<span class="Delimiter">);</span> <span class="Comment">// synonym while teaching</span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L33" class="LineNr"> 33 </span><span class="Normal">case</span> RETURN: <span class="Delimiter">{</span> <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> @@ -96,20 +96,20 @@ if ('onhashchange' in window) { <span id="L37" class="LineNr"> 37 </span><span class="Normal">case</span> RETURN: <span class="Delimiter">{</span> <span id="L38" class="LineNr"> 38 </span> <span class="Comment">// Starting Reply</span> <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> -<span id="L40" class="LineNr"> 40 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << current_instruction<span class="Delimiter">().</span>name << <span class="Constant">": decrementing callstack depth from "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << end<span class="Delimiter">();</span> +<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << current_instruction<span class="Delimiter">().</span>name << <span class="Constant">": decrementing callstack depth from "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L41" class="LineNr"> 41 </span> --Trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">;</span> <span id="L42" class="LineNr"> 42 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>callstack_depth < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L43" class="LineNr"> 43 </span> Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L43" class="LineNr"> 43 </span> Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L44" class="LineNr"> 44 </span> <span class="Identifier">goto</span> stop_running_current_routine<span class="Delimiter">;</span> <span id="L45" class="LineNr"> 45 </span> <span class="Delimiter">}</span> <span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span> <span id="L47" class="LineNr"> 47 </span> Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span> <span id="L48" class="LineNr"> 48 </span> <span class="Comment">// just in case 'main' returns a value, drop it for now</span> <span id="L49" class="LineNr"> 49 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></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 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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<span id="L51" class="LineNr"> 51 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"result "</span> << i << <span class="Constant">" is "</span> << to_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << end<span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L51" class="LineNr"> 51 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"result "</span> << i << <span class="Constant">" is "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L52" class="LineNr"> 52 </span> <span class="Comment">// make return products available to caller</span> -<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> +<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><a href='003trace.cc.html#L195'>end</a><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 id="L54" class="LineNr"> 54 </span> <span class="Comment">// End Reply</span> <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> <span id="L56" class="LineNr"> 56 </span><span class="Delimiter">}</span> @@ -117,51 +117,51 @@ if ('onhashchange' in window) { <span id="L58" class="LineNr"> 58 </span><span class="Comment">//: Types in return instructions are checked ahead of time.</span> <span id="L59" class="LineNr"> 59 </span> <span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(before "End Checks")</span> -<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> +<span id="L61" class="LineNr"> 61 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='028call_return.cc.html#L63'>check_types_of_return_instructions</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L62" class="LineNr"> 62 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L63" class="LineNr"> 63 </span><span class="Normal">void</span> <a href='028call_return.cc.html#L63'>check_types_of_return_instructions</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L64" class="LineNr"> 64 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L65" class="LineNr"> 65 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check types of return instructions in recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L65" class="LineNr"> 65 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check types of return instructions in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L67" class="LineNr"> 67 </span> <span class="Normal">const</span> instruction& caller_instruction = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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> <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> -<span id="L70" class="LineNr"> 70 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>operation < MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L70" class="LineNr"> 70 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>operation < <a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L71" class="LineNr"> 71 </span> <span class="Normal">const</span> recipe& callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> caller_instruction<span class="Delimiter">.</span>operation<span class="Delimiter">);</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L73" class="LineNr"> 73 </span> <span class="Normal">const</span> instruction& return_inst = callee<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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> <span id="L75" class="LineNr"> 75 </span> <span class="Comment">// check types with the caller</span> -<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> > SIZE<span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L77" class="LineNr"> 77 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too few values returned from "</span> << callee<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L76" class="LineNr"> 76 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">)</span> > <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>return_inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L77" class="LineNr"> 77 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too few values returned from "</span> << callee<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L78" class="LineNr"> 78 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 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> <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> <span id="L83" class="LineNr"> 83 </span> <span class="Comment">// End Check RETURN Copy(lhs, rhs)</span> <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> -<span id="L85" class="LineNr"> 85 </span> raise << maybe<span class="Delimiter">(</span>callee<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << return_inst<span class="Delimiter">.</span>name << <span class="Constant">" ingredient '"</span> << lhs<span class="Delimiter">.</span>original_string << <span class="Constant">"' can't be saved in '"</span> << rhs<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L86" class="LineNr"> 86 </span> raise << <span class="Constant">" ['"</span> << to_string<span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"' vs '"</span> << to_string<span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"']</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L85" class="LineNr"> 85 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << return_inst<span class="Delimiter">.</span>name << <span class="Constant">" ingredient '"</span> << lhs<span class="Delimiter">.</span>original_string << <span class="Constant">"' can't be saved in '"</span> << rhs<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L86" class="LineNr"> 86 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" ['"</span> << to_string<span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"' vs '"</span> << to_string<span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"']</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L87" class="LineNr"> 87 </span> <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span> <span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span> <span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">}</span> <span id="L90" class="LineNr"> 90 </span> <span class="Comment">// check that any return ingredients with /same-as-ingredient connect up</span> <span id="L91" class="LineNr"> 91 </span> <span class="Comment">// the corresponding ingredient and product in the caller.</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 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">"same-as-ingredient"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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">"same-as-ingredient"</span><span class="Delimiter">);</span> <span id="L95" class="LineNr"> 95 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!tmp || !tmp<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L96" class="LineNr"> 96 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'same-as-ingredient' metadata should take exactly one value in '"</span> << to_original_string<span class="Delimiter">(</span>return_inst<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L96" class="LineNr"> 96 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'same-as-ingredient' metadata should take exactly one value in '"</span> << to_original_string<span class="Delimiter">(</span>return_inst<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L97" class="LineNr"> 97 </span> <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span> <span id="L98" class="LineNr"> 98 </span> <span class="Delimiter">}</span> -<span id="L99" class="LineNr"> 99 </span> <span class="Normal">int</span> ingredient_index = to_integer<span class="Delimiter">(</span>tmp<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L100" class="LineNr">100 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index >= SIZE<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L101" class="LineNr">101 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too few ingredients in '"</span> << to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L99" class="LineNr"> 99 </span> <span class="Normal">int</span> ingredient_index = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>tmp<span class="Delimiter">-></span>value<span class="Delimiter">);</span> +<span id="L100" class="LineNr">100 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L101" class="LineNr">101 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too few ingredients in '"</span> << to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L102" class="LineNr">102 </span> <span class="Identifier">goto</span> finish_return_check<span class="Delimiter">;</span> <span id="L103" class="LineNr">103 </span> <span class="Delimiter">}</span> <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> && !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> && 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> -<span id="L105" class="LineNr">105 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> << <span class="Constant">"' should write to '"</span> << caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>original_string << <span class="Constant">"' rather than '"</span> << caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L105" class="LineNr">105 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << to_original_string<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">)</span> << <span class="Constant">"' should write to '"</span> << caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">).</span>original_string << <span class="Constant">"' rather than '"</span> << caller_instruction<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L106" class="LineNr">106 </span> <span class="Delimiter">}</span> <span id="L107" class="LineNr">107 </span> <span class="Delimiter">}</span> <span id="L108" class="LineNr">108 </span> <span class="Delimiter">}</span> @@ -172,7 +172,7 @@ if ('onhashchange' in window) { <span id="L113" class="LineNr">113 </span> <span id="L114" class="LineNr">114 </span><span class="Delimiter">:(scenario return_type_mismatch)</span> <span id="L115" class="LineNr">115 </span><span class="Special">% Hide_errors = true;</span> -<span id="L116" class="LineNr">116 </span><span class="muRecipe">def</span> main [ +<span id="L116" class="LineNr">116 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L117" class="LineNr">117 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>f <span class="Constant">2</span> <span id="L118" class="LineNr">118 </span>] <span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> f [ @@ -192,7 +192,7 @@ if ('onhashchange' in window) { <span id="L133" class="LineNr">133 </span> <span id="L134" class="LineNr">134 </span><span class="Delimiter">:(scenario return_same_as_ingredient)</span> <span id="L135" class="LineNr">135 </span><span class="Special">% Hide_errors = true;</span> -<span id="L136" class="LineNr">136 </span><span class="muRecipe">def</span> main [ +<span id="L136" class="LineNr">136 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L137" class="LineNr">137 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L138" class="LineNr">138 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>test1 <span class="Constant">1</span>:num <span class="Comment"># call with different ingredient and product</span> <span id="L139" class="LineNr">139 </span>] @@ -200,10 +200,10 @@ if ('onhashchange' in window) { <span id="L141" class="LineNr">141 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>next-ingredient <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> <span id="L143" class="LineNr">143 </span>] -<span id="L144" class="LineNr">144 </span><span class="traceContains">+error: main: '2:num <- test1 1:num' should write to '1:num' rather than '2:num'</span> +<span id="L144" class="LineNr">144 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: '2:num <- test1 1:num' should write to '1:num' rather than '2:num'</span> <span id="L145" class="LineNr">145 </span> <span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenario return_same_as_ingredient_dummy)</span> -<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [ +<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L148" class="LineNr">148 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L149" class="LineNr">149 </span> _<span class="Special"> <- </span>test1 <span class="Constant">1</span>:num <span class="Comment"># call with different ingredient and product</span> <span id="L150" class="LineNr">150 </span>] @@ -214,15 +214,15 @@ if ('onhashchange' in window) { <span id="L155" class="LineNr">155 </span>$error: <span class="Constant">0</span> <span id="L156" class="LineNr">156 </span> <span id="L157" class="LineNr">157 </span><span class="Delimiter">:(code)</span> -<span id="L158" class="LineNr">158 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> vector<<span class="Normal">double</span>>& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L158" class="LineNr">158 </span>string <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span><span class="Normal">const</span> vector<<span class="Normal">double</span>>& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"[]"</span><span class="Delimiter">;</span> <span id="L160" class="LineNr">160 </span> ostringstream out<span class="Delimiter">;</span> -<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> +<span id="L161" class="LineNr">161 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L162" class="LineNr">162 </span> out << 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 id="L163" class="LineNr">163 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L164" class="LineNr">164 </span> <span class="Delimiter">}</span> <span id="L165" class="LineNr">165 </span> out << <span class="Constant">"["</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L167" class="LineNr">167 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i > <span class="Constant">0</span><span class="Delimiter">)</span> out << <span class="Constant">", "</span><span class="Delimiter">;</span> <span id="L168" class="LineNr">168 </span> out << no_scientific<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span id="L169" class="LineNr">169 </span> <span class="Delimiter">}</span> diff --git a/html/029tools.cc.html b/html/029tools.cc.html index b403273b..e4948edf 100644 --- a/html/029tools.cc.html +++ b/html/029tools.cc.html @@ -62,27 +62,27 @@ if ('onhashchange' in window) { <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> <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario trace)</span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [ -<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] +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L5" class="LineNr"> 5 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [foo]<span class="Delimiter">,</span> [<span class="Normal">this</span> is a <a href='003trace.cc.html#L171'>trace</a> in Mu] <span id="L6" class="LineNr"> 6 </span>] -<span id="L7" class="LineNr"> 7 </span><span class="traceContains">+foo: this is a trace in Mu</span> +<span id="L7" class="LineNr"> 7 </span><span class="traceContains">+foo: this is a <a href='003trace.cc.html#L171'>trace</a> in Mu</span> <span id="L8" class="LineNr"> 8 </span> <span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L10" class="LineNr"> 10 </span>TRACE<span class="Delimiter">,</span> <span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L12" class="LineNr"> 12 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">,</span> TRACE<span class="Delimiter">);</span> +<span id="L12" class="LineNr"> 12 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">,</span> TRACE<span class="Delimiter">);</span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L14" class="LineNr"> 14 </span><span class="Normal">case</span> TRACE: <span class="Delimiter">{</span> -<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> < <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L16" class="LineNr"> 16 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'trace' takes three or more ingredients rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L15" class="LineNr"> 15 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> < <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L16" class="LineNr"> 16 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'trace' takes three or more ingredients rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L17" class="LineNr"> 17 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L18" class="LineNr"> 18 </span> <span class="Delimiter">}</span> <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> -<span id="L20" class="LineNr"> 20 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'trace' should be a number (depth), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L20" class="LineNr"> 20 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'trace' should be a number (depth), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L21" class="LineNr"> 21 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L22" class="LineNr"> 22 </span> <span class="Delimiter">}</span> <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> -<span id="L24" class="LineNr"> 24 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'trace' should be a literal string (label), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L24" class="LineNr"> 24 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'trace' should be a literal string (label), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L25" class="LineNr"> 25 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L26" class="LineNr"> 26 </span> <span class="Delimiter">}</span> <span id="L27" class="LineNr"> 27 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -92,11 +92,11 @@ if ('onhashchange' in window) { <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> <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> <span id="L33" class="LineNr"> 33 </span> ostringstream out<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L35" class="LineNr"> 35 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i > <span class="Constant">2</span><span class="Delimiter">)</span> out << <span class="Constant">' '</span><span class="Delimiter">;</span> <span id="L36" class="LineNr"> 36 </span> out << 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 id="L37" class="LineNr"> 37 </span> <span class="Delimiter">}</span> -<span id="L38" class="LineNr"> 38 </span> trace<span class="Delimiter">(</span>depth<span class="Delimiter">,</span> label<span class="Delimiter">)</span> << out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << end<span class="Delimiter">();</span> +<span id="L38" class="LineNr"> 38 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span>depth<span class="Delimiter">,</span> label<span class="Delimiter">)</span> << out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L39" class="LineNr"> 39 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L40" class="LineNr"> 40 </span><span class="Delimiter">}</span> <span id="L41" class="LineNr"> 41 </span> @@ -105,7 +105,7 @@ if ('onhashchange' in window) { <span id="L44" class="LineNr"> 44 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L45" class="LineNr"> 45 </span>STASH<span class="Delimiter">,</span> <span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L47" class="LineNr"> 47 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"stash"</span><span class="Delimiter">,</span> STASH<span class="Delimiter">);</span> +<span id="L47" class="LineNr"> 47 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"stash"</span><span class="Delimiter">,</span> STASH<span class="Delimiter">);</span> <span id="L48" class="LineNr"> 48 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L49" class="LineNr"> 49 </span><span class="Normal">case</span> STASH: <span class="Delimiter">{</span> <span id="L50" class="LineNr"> 50 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -113,28 +113,28 @@ if ('onhashchange' in window) { <span id="L52" class="LineNr"> 52 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L53" class="LineNr"> 53 </span><span class="Normal">case</span> STASH: <span class="Delimiter">{</span> <span id="L54" class="LineNr"> 54 </span> ostringstream out<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L56" class="LineNr"> 56 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i<span class="Delimiter">)</span> out << <span class="Constant">' '</span><span class="Delimiter">;</span> <span id="L57" class="LineNr"> 57 </span> out << 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 id="L58" class="LineNr"> 58 </span> <span class="Delimiter">}</span> -<span id="L59" class="LineNr"> 59 </span> trace<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">"app"</span><span class="Delimiter">)</span> << out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << end<span class="Delimiter">();</span> +<span id="L59" class="LineNr"> 59 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">"app"</span><span class="Delimiter">)</span> << out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L60" class="LineNr"> 60 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L61" class="LineNr"> 61 </span><span class="Delimiter">}</span> <span id="L62" class="LineNr"> 62 </span> <span id="L63" class="LineNr"> 63 </span><span class="Delimiter">:(scenario stash_literal_string)</span> -<span id="L64" class="LineNr"> 64 </span><span class="muRecipe">def</span> main [ +<span id="L64" class="LineNr"> 64 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L65" class="LineNr"> 65 </span> stash [foo] <span id="L66" class="LineNr"> 66 </span>] <span id="L67" class="LineNr"> 67 </span><span class="traceContains">+app: foo</span> <span id="L68" class="LineNr"> 68 </span> <span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(scenario stash_literal_number)</span> -<span id="L70" class="LineNr"> 70 </span><span class="muRecipe">def</span> main [ +<span id="L70" class="LineNr"> 70 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L71" class="LineNr"> 71 </span> stash [foo:]<span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L72" class="LineNr"> 72 </span>] <span id="L73" class="LineNr"> 73 </span><span class="traceContains">+app: foo: 4</span> <span id="L74" class="LineNr"> 74 </span> <span id="L75" class="LineNr"> 75 </span><span class="Delimiter">:(scenario stash_number)</span> -<span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> main [ +<span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L77" class="LineNr"> 77 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L78" class="LineNr"> 78 </span> stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:num <span id="L79" class="LineNr"> 79 </span>] @@ -146,7 +146,7 @@ if ('onhashchange' in window) { <span id="L85" class="LineNr"> 85 </span> <span class="Identifier">return</span> r<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L86" class="LineNr"> 86 </span> <span class="Comment">// End inspect Special-cases(r, data)</span> <span id="L87" class="LineNr"> 87 </span> ostringstream out<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>data<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>data<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L89" class="LineNr"> 89 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i<span class="Delimiter">)</span> out << <span class="Constant">' '</span><span class="Delimiter">;</span> <span id="L90" class="LineNr"> 90 </span> out << no_scientific<span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> @@ -156,7 +156,7 @@ if ('onhashchange' in window) { <span id="L95" class="LineNr"> 95 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L96" class="LineNr"> 96 </span>HIDE_ERRORS<span class="Delimiter">,</span> <span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L98" class="LineNr"> 98 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hide-errors"</span><span class="Delimiter">,</span> HIDE_ERRORS<span class="Delimiter">);</span> +<span id="L98" class="LineNr"> 98 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hide-errors"</span><span class="Delimiter">,</span> HIDE_ERRORS<span class="Delimiter">);</span> <span id="L99" class="LineNr"> 99 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L100" class="LineNr">100 </span><span class="Normal">case</span> HIDE_ERRORS: <span class="Delimiter">{</span> <span id="L101" class="LineNr">101 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -170,7 +170,7 @@ if ('onhashchange' in window) { <span id="L109" class="LineNr">109 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L110" class="LineNr">110 </span>SHOW_ERRORS<span class="Delimiter">,</span> <span id="L111" class="LineNr">111 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L112" class="LineNr">112 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"show-errors"</span><span class="Delimiter">,</span> SHOW_ERRORS<span class="Delimiter">);</span> +<span id="L112" class="LineNr">112 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"show-errors"</span><span class="Delimiter">,</span> SHOW_ERRORS<span class="Delimiter">);</span> <span id="L113" class="LineNr">113 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L114" class="LineNr">114 </span><span class="Normal">case</span> SHOW_ERRORS: <span class="Delimiter">{</span> <span id="L115" class="LineNr">115 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -184,7 +184,7 @@ if ('onhashchange' in window) { <span id="L123" class="LineNr">123 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L124" class="LineNr">124 </span>TRACE_UNTIL<span class="Delimiter">,</span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L126" class="LineNr">126 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-until"</span><span class="Delimiter">,</span> TRACE_UNTIL<span class="Delimiter">);</span> +<span id="L126" class="LineNr">126 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-until"</span><span class="Delimiter">,</span> TRACE_UNTIL<span class="Delimiter">);</span> <span id="L127" class="LineNr">127 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L128" class="LineNr">128 </span><span class="Normal">case</span> TRACE_UNTIL: <span class="Delimiter">{</span> <span id="L129" class="LineNr">129 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -200,7 +200,7 @@ if ('onhashchange' in window) { <span id="L139" class="LineNr">139 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L140" class="LineNr">140 </span>_DUMP_TRACE<span class="Delimiter">,</span> <span id="L141" class="LineNr">141 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L142" class="LineNr">142 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-trace"</span><span class="Delimiter">,</span> _DUMP_TRACE<span class="Delimiter">);</span> +<span id="L142" class="LineNr">142 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-trace"</span><span class="Delimiter">,</span> _DUMP_TRACE<span class="Delimiter">);</span> <span id="L143" class="LineNr">143 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L144" class="LineNr">144 </span><span class="Normal">case</span> _DUMP_TRACE: <span class="Delimiter">{</span> <span id="L145" class="LineNr">145 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -208,10 +208,10 @@ if ('onhashchange' in window) { <span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L148" class="LineNr">148 </span><span class="Normal">case</span> _DUMP_TRACE: <span class="Delimiter">{</span> <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> -<span id="L150" class="LineNr">150 </span> DUMP<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L150" class="LineNr">150 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> <span id="L151" class="LineNr">151 </span> <span class="Delimiter">}</span> <span id="L152" class="LineNr">152 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<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> +<span id="L153" class="LineNr">153 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span> <span id="L154" class="LineNr">154 </span> <span class="Delimiter">}</span> <span id="L155" class="LineNr">155 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span> @@ -219,21 +219,21 @@ if ('onhashchange' in window) { <span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L159" class="LineNr">159 </span>_CLEAR_TRACE<span class="Delimiter">,</span> <span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L161" class="LineNr">161 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$clear-trace"</span><span class="Delimiter">,</span> _CLEAR_TRACE<span class="Delimiter">);</span> +<span id="L161" class="LineNr">161 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$clear-trace"</span><span class="Delimiter">,</span> _CLEAR_TRACE<span class="Delimiter">);</span> <span id="L162" class="LineNr">162 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L163" class="LineNr">163 </span><span class="Normal">case</span> _CLEAR_TRACE: <span class="Delimiter">{</span> <span id="L164" class="LineNr">164 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L165" class="LineNr">165 </span><span class="Delimiter">}</span> <span id="L166" class="LineNr">166 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L167" class="LineNr">167 </span><span class="Normal">case</span> _CLEAR_TRACE: <span class="Delimiter">{</span> -<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">-></span>past_lines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<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">-></span>past_lines<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L169" class="LineNr">169 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">}</span> <span id="L171" class="LineNr">171 </span> <span id="L172" class="LineNr">172 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L173" class="LineNr">173 </span>_SAVE_TRACE<span class="Delimiter">,</span> <span id="L174" class="LineNr">174 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L175" class="LineNr">175 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$save-trace"</span><span class="Delimiter">,</span> _SAVE_TRACE<span class="Delimiter">);</span> +<span id="L175" class="LineNr">175 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$save-trace"</span><span class="Delimiter">,</span> _SAVE_TRACE<span class="Delimiter">);</span> <span id="L176" class="LineNr">176 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L177" class="LineNr">177 </span><span class="Normal">case</span> _SAVE_TRACE: <span class="Delimiter">{</span> <span id="L178" class="LineNr">178 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -242,7 +242,7 @@ if ('onhashchange' in window) { <span id="L181" class="LineNr">181 </span><span class="Normal">case</span> _SAVE_TRACE: <span class="Delimiter">{</span> <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> <span id="L183" class="LineNr">183 </span> ofstream fout<span class="Delimiter">(</span><span class="Constant">"last_trace"</span><span class="Delimiter">);</span> -<span id="L184" class="LineNr">184 </span> fout << Trace_stream<span class="Delimiter">-></span>readable_contents<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L184" class="LineNr">184 </span> fout << Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> <span id="L185" class="LineNr">185 </span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> <span id="L186" class="LineNr">186 </span> <span class="Delimiter">}</span> <span id="L187" class="LineNr">187 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -253,16 +253,16 @@ if ('onhashchange' in window) { <span id="L192" class="LineNr">192 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L193" class="LineNr">193 </span>_PRINT<span class="Delimiter">,</span> <span id="L194" class="LineNr">194 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L195" class="LineNr">195 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$print"</span><span class="Delimiter">,</span> _PRINT<span class="Delimiter">);</span> +<span id="L195" class="LineNr">195 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$print"</span><span class="Delimiter">,</span> _PRINT<span class="Delimiter">);</span> <span id="L196" class="LineNr">196 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L197" class="LineNr">197 </span><span class="Normal">case</span> _PRINT: <span class="Delimiter">{</span> <span id="L198" class="LineNr">198 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L199" class="LineNr">199 </span><span class="Delimiter">}</span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L201" class="LineNr">201 </span><span class="Normal">case</span> _PRINT: <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L204" class="LineNr">204 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"$print: "</span> << current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> +<span id="L204" class="LineNr">204 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"$print: "</span> << current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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">"newline"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L206" class="LineNr">206 </span> cout << 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 id="L207" class="LineNr">207 </span> <span class="Delimiter">}</span> @@ -274,8 +274,8 @@ if ('onhashchange' in window) { <span id="L213" class="LineNr">213 </span> <span class="Delimiter">}</span> <span id="L214" class="LineNr">214 </span> <span class="Comment">// End $print Special-cases</span> <span id="L215" class="LineNr">215 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<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 < 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> -<span id="L217" class="LineNr">217 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"$print: "</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> << end<span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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> +<span id="L217" class="LineNr">217 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"$print: "</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 href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L218" class="LineNr">218 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>j > <span class="Constant">0</span><span class="Delimiter">)</span> cout << <span class="Constant">" "</span><span class="Delimiter">;</span> <span id="L219" class="LineNr">219 </span> cout << 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 id="L220" class="LineNr">220 </span> <span class="Delimiter">}</span> @@ -288,7 +288,7 @@ if ('onhashchange' in window) { <span id="L227" class="LineNr">227 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L228" class="LineNr">228 </span>_EXIT<span class="Delimiter">,</span> <span id="L229" class="LineNr">229 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L230" class="LineNr">230 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$exit"</span><span class="Delimiter">,</span> _EXIT<span class="Delimiter">);</span> +<span id="L230" class="LineNr">230 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$exit"</span><span class="Delimiter">,</span> _EXIT<span class="Delimiter">);</span> <span id="L231" class="LineNr">231 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L232" class="LineNr">232 </span><span class="Normal">case</span> _EXIT: <span class="Delimiter">{</span> <span id="L233" class="LineNr">233 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -302,15 +302,15 @@ if ('onhashchange' in window) { <span id="L241" class="LineNr">241 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L242" class="LineNr">242 </span>_SYSTEM<span class="Delimiter">,</span> <span id="L243" class="LineNr">243 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L244" class="LineNr">244 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$system"</span><span class="Delimiter">,</span> _SYSTEM<span class="Delimiter">);</span> +<span id="L244" class="LineNr">244 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$system"</span><span class="Delimiter">,</span> _SYSTEM<span class="Delimiter">);</span> <span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L246" class="LineNr">246 </span><span class="Normal">case</span> _SYSTEM: <span class="Delimiter">{</span> -<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> -<span id="L248" class="LineNr">248 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$system' requires exactly one ingredient, but got '"</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L247" class="LineNr">247 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L248" class="LineNr">248 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$system' requires exactly one ingredient, but got '"</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L249" class="LineNr">249 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L250" class="LineNr">250 </span> <span class="Delimiter">}</span> <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> -<span id="L252" class="LineNr">252 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient to '$system' must be a literal text, but got '"</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L252" class="LineNr">252 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient to '$system' must be a literal text, but got '"</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L253" class="LineNr">253 </span> <span class="Delimiter">}</span> <span id="L254" class="LineNr">254 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L255" class="LineNr">255 </span><span class="Delimiter">}</span> @@ -325,7 +325,7 @@ if ('onhashchange' in window) { <span id="L264" class="LineNr">264 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L265" class="LineNr">265 </span>_DUMP_MEMORY<span class="Delimiter">,</span> <span id="L266" class="LineNr">266 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L267" class="LineNr">267 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-memory"</span><span class="Delimiter">,</span> _DUMP_MEMORY<span class="Delimiter">);</span> +<span id="L267" class="LineNr">267 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-memory"</span><span class="Delimiter">,</span> _DUMP_MEMORY<span class="Delimiter">);</span> <span id="L268" class="LineNr">268 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L269" class="LineNr">269 </span><span class="Normal">case</span> _DUMP_MEMORY: <span class="Delimiter">{</span> <span id="L270" class="LineNr">270 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -347,7 +347,7 @@ if ('onhashchange' in window) { <span id="L286" class="LineNr">286 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L287" class="LineNr">287 </span>_LOG<span class="Delimiter">,</span> <span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L289" class="LineNr">289 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$log"</span><span class="Delimiter">,</span> _LOG<span class="Delimiter">);</span> +<span id="L289" class="LineNr">289 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$log"</span><span class="Delimiter">,</span> _LOG<span class="Delimiter">);</span> <span id="L290" class="LineNr">290 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L291" class="LineNr">291 </span><span class="Normal">case</span> _LOG: <span class="Delimiter">{</span> <span id="L292" class="LineNr">292 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -355,7 +355,7 @@ if ('onhashchange' in window) { <span id="L294" class="LineNr">294 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L295" class="LineNr">295 </span><span class="Normal">case</span> _LOG: <span class="Delimiter">{</span> <span id="L296" class="LineNr">296 </span> ostringstream out<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L298" class="LineNr">298 </span> out << 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 id="L299" class="LineNr">299 </span> <span class="Delimiter">}</span> <span id="L300" class="LineNr">300 </span> LOG << out<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> @@ -369,7 +369,7 @@ if ('onhashchange' in window) { <span id="L308" class="LineNr">308 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L309" class="LineNr">309 </span>_FOO<span class="Delimiter">,</span> <span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L311" class="LineNr">311 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$foo"</span><span class="Delimiter">,</span> _FOO<span class="Delimiter">);</span> +<span id="L311" class="LineNr">311 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$foo"</span><span class="Delimiter">,</span> _FOO<span class="Delimiter">);</span> <span id="L312" class="LineNr">312 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L313" class="LineNr">313 </span><span class="Normal">case</span> _FOO: <span class="Delimiter">{</span> <span id="L314" class="LineNr">314 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/030container.cc.html b/html/030container.cc.html index 2d62580d..2c4fe1d1 100644 --- a/html/030container.cc.html +++ b/html/030container.cc.html @@ -65,9 +65,9 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> <span id="L4" class="LineNr"> 4 </span><span class="Comment">//: We'll use this container as a running example in scenarios below.</span> -<span id="L5" class="LineNr"> 5 </span>type_ordinal point = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"point"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<span id="L6" class="LineNr"> 6 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">);</span> <span class="Comment">// initialize</span> -<span id="L7" class="LineNr"> 7 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span> +<span id="L5" class="LineNr"> 5 </span><a href='010vm.cc.html#L124'>type_ordinal</a> point = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"point"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L6" class="LineNr"> 6 </span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">);</span> <span class="Comment">// initialize</span> +<span id="L7" class="LineNr"> 7 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>kind = <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">;</span> <span id="L8" class="LineNr"> 8 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>name = <span class="Constant">"point"</span><span class="Delimiter">;</span> <span id="L9" class="LineNr"> 9 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">"x:number"</span><span class="Delimiter">));</span> <span id="L10" class="LineNr"> 10 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">"y:number"</span><span class="Delimiter">));</span> @@ -79,7 +79,7 @@ if ('onhashchange' in window) { <span id="L16" class="LineNr"> 16 </span><span class="Comment">//: container. Don't do this in general. I'm tagging exceptions with /unsafe to</span> <span id="L17" class="LineNr"> 17 </span><span class="Comment">//: skip later checks.</span> <span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario copy_multiple_locations)</span> -<span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> main [ +<span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L20" class="LineNr"> 20 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L21" class="LineNr"> 21 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L22" class="LineNr"> 22 </span> <span class="Constant">3</span>:point<span class="Special"> <- </span>copy <span class="Constant">1</span>:point/unsafe @@ -90,23 +90,23 @@ if ('onhashchange' in window) { <span id="L27" class="LineNr"> 27 </span><span class="Comment">//: trying to copy to a differently-typed destination will fail</span> <span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(scenario copy_checks_size)</span> <span id="L29" class="LineNr"> 29 </span><span class="Special">% Hide_errors = true;</span> -<span id="L30" class="LineNr"> 30 </span><span class="muRecipe">def</span> main [ +<span id="L30" class="LineNr"> 30 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L31" class="LineNr"> 31 </span> <span class="Constant">2</span>:point<span class="Special"> <- </span>copy <span class="Constant">1</span>:num <span id="L32" class="LineNr"> 32 </span>] -<span id="L33" class="LineNr"> 33 </span><span class="traceContains">+error: main: can't copy '1:num' to '2:point'; types don't match</span> +<span id="L33" class="LineNr"> 33 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: can't copy '1:num' to '2:point'; types don't match</span> <span id="L34" class="LineNr"> 34 </span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> <span id="L36" class="LineNr"> 36 </span><span class="Comment">// A more complex example container, containing another container as one of</span> <span id="L37" class="LineNr"> 37 </span><span class="Comment">// its elements.</span> -<span id="L38" class="LineNr"> 38 </span>type_ordinal point_number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"point-number"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<span id="L39" class="LineNr"> 39 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">);</span> <span class="Comment">// initialize</span> -<span id="L40" class="LineNr"> 40 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span> +<span id="L38" class="LineNr"> 38 </span><a href='010vm.cc.html#L124'>type_ordinal</a> point_number = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"point-number"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L39" class="LineNr"> 39 </span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">);</span> <span class="Comment">// initialize</span> +<span id="L40" class="LineNr"> 40 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>kind = <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">;</span> <span id="L41" class="LineNr"> 41 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>name = <span class="Constant">"point-number"</span><span class="Delimiter">;</span> <span id="L42" class="LineNr"> 42 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">"xy:point"</span><span class="Delimiter">));</span> <span id="L43" class="LineNr"> 43 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">"z:number"</span><span class="Delimiter">));</span> <span id="L44" class="LineNr"> 44 </span> <span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(scenario copy_handles_nested_container_elements)</span> -<span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> main [ +<span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L47" class="LineNr"> 47 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L48" class="LineNr"> 48 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L49" class="LineNr"> 49 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -116,7 +116,7 @@ if ('onhashchange' in window) { <span id="L53" class="LineNr"> 53 </span> <span id="L54" class="LineNr"> 54 </span><span class="Comment">//: products of recipes can include containers</span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario return_container)</span> -<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [ +<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L57" class="LineNr"> 57 </span> <span class="Constant">3</span>:point<span class="Special"> <- </span>f <span class="Constant">2</span> <span id="L58" class="LineNr"> 58 </span>] <span id="L59" class="LineNr"> 59 </span><span class="muRecipe">def</span> f [ @@ -132,7 +132,7 @@ if ('onhashchange' in window) { <span id="L69" class="LineNr"> 69 </span><span class="Comment">//: numbers, no matter how large they are.</span> <span id="L70" class="LineNr"> 70 </span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario compare_multiple_locations)</span> -<span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [ +<span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L73" class="LineNr"> 73 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span class="Comment"># first</span> <span id="L74" class="LineNr"> 74 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L75" class="LineNr"> 75 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -144,7 +144,7 @@ if ('onhashchange' in window) { <span id="L81" class="LineNr"> 81 </span><span class="traceContains">+mem: storing 1 in location 7</span> <span id="L82" class="LineNr"> 82 </span> <span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(scenario compare_multiple_locations_2)</span> -<span id="L84" class="LineNr"> 84 </span><span class="muRecipe">def</span> main [ +<span id="L84" class="LineNr"> 84 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L85" class="LineNr"> 85 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span class="Comment"># first</span> <span id="L86" class="LineNr"> 86 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L87" class="LineNr"> 87 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -179,30 +179,30 @@ if ('onhashchange' in window) { <span id="L116" class="LineNr">116 </span><span class="Delimiter">:(before "End save_snapshots")</span> <span id="L117" class="LineNr">117 </span>Container_metadata_snapshot = Container_metadata<span class="Delimiter">;</span> <span id="L118" class="LineNr">118 </span><span class="Delimiter">:(before "End restore_snapshots")</span> -<span id="L119" class="LineNr">119 </span>restore_container_metadata<span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span><a href='030container.cc.html#L124'>restore_container_metadata</a><span class="Delimiter">();</span> <span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before "End One-time Setup")</span> -<span id="L121" class="LineNr">121 </span>atexit<span class="Delimiter">(</span>clear_container_metadata<span class="Delimiter">);</span> +<span id="L121" class="LineNr">121 </span>atexit<span class="Delimiter">(</span><a href='030container.cc.html#L136'>clear_container_metadata</a><span class="Delimiter">);</span> <span id="L122" class="LineNr">122 </span><span class="Delimiter">:(code)</span> <span id="L123" class="LineNr">123 </span><span class="Comment">// invariant: Container_metadata always contains a superset of Container_metadata_snapshot</span> -<span id="L124" class="LineNr">124 </span><span class="Normal">void</span> restore_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L125" class="LineNr">125 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L124" class="LineNr">124 </span><span class="Normal">void</span> <a href='030container.cc.html#L124'>restore_container_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L125" class="LineNr">125 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L126" class="LineNr">126 </span> assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span> -<span id="L127" class="LineNr">127 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i < SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L127" class="LineNr">127 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L128" class="LineNr">128 </span> assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == Container_metadata_snapshot<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span> <span id="L129" class="LineNr">129 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span> <span id="L131" class="LineNr">131 </span> <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span> <span id="L132" class="LineNr">132 </span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L133" class="LineNr">133 </span> <span class="Delimiter">}</span> -<span id="L134" class="LineNr">134 </span> Container_metadata<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">));</span> +<span id="L134" class="LineNr">134 </span> Container_metadata<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">));</span> <span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span> -<span id="L136" class="LineNr">136 </span><span class="Normal">void</span> clear_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L137" class="LineNr">137 </span> Container_metadata_snapshot<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L138" class="LineNr">138 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L136" class="LineNr">136 </span><span class="Normal">void</span> <a href='030container.cc.html#L136'>clear_container_metadata</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L137" class="LineNr">137 </span> Container_metadata_snapshot<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L138" class="LineNr">138 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L139" class="LineNr">139 </span> <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span> <span id="L140" class="LineNr">140 </span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L141" class="LineNr">141 </span> <span class="Delimiter">}</span> -<span id="L142" class="LineNr">142 </span> Container_metadata<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L142" class="LineNr">142 </span> Container_metadata<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L143" class="LineNr">143 </span><span class="Delimiter">}</span> <span id="L144" class="LineNr">144 </span> <span id="L145" class="LineNr">145 </span><span class="Comment">//: do no work in size_of, simply lookup Container_metadata</span> @@ -214,14 +214,14 @@ if ('onhashchange' in window) { <span id="L151" class="LineNr">151 </span><span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span> <span id="L152" class="LineNr">152 </span><span class="Comment">// Update base_type in size_of(type)</span> <span id="L153" class="LineNr">153 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L154" class="LineNr">154 </span> raise << <span class="Constant">"no such type "</span> << base_type<span class="Delimiter">-></span>value << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L154" class="LineNr">154 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"no such type "</span> << base_type<span class="Delimiter">-></span>value << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L155" class="LineNr">155 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span> <span id="L157" class="LineNr">157 </span>type_info t = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L158" class="LineNr">158 </span><span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L158" class="LineNr">158 </span><span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L159" class="LineNr">159 </span> <span class="Comment">// Compute size_of Container</span> <span id="L160" class="LineNr">160 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L161" class="LineNr">161 </span> raise << <span class="Constant">"unknown size for container type '"</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L161" class="LineNr">161 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unknown size for container type '"</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L162" class="LineNr">162 </span><span class="CommentedCode">//? DUMP("");</span> <span id="L163" class="LineNr">163 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L164" class="LineNr">164 </span> <span class="Delimiter">}</span> @@ -234,15 +234,15 @@ if ('onhashchange' in window) { <span id="L171" class="LineNr">171 </span><span class="Delimiter">:(after "End Type Modifying Transforms")</span> <span id="L172" class="LineNr">172 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>compute_container_sizes<span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span> -<span id="L174" class="LineNr">174 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L174" class="LineNr">174 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L175" class="LineNr">175 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L176" class="LineNr">176 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- compute container sizes for "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<span id="L177" class="LineNr">177 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L176" class="LineNr">176 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- compute container sizes for "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L177" class="LineNr">177 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L178" class="LineNr">178 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L179" class="LineNr">179 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"- compute container sizes for "</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<span id="L180" class="LineNr">180 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L179" class="LineNr">179 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"- compute container sizes for "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L180" class="LineNr">180 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="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">" in '"</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">"'"</span><span class="Delimiter">);</span> -<span id="L182" class="LineNr">182 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L182" class="LineNr">182 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="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">" in '"</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">"'"</span><span class="Delimiter">);</span> <span id="L184" class="LineNr">184 </span> <span class="Delimiter">}</span> <span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span> @@ -260,35 +260,35 @@ if ('onhashchange' in window) { <span id="L197" class="LineNr">197 </span> <span id="L198" class="LineNr">198 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set<type_tree>& pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L199" class="LineNr">199 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L200" class="LineNr">200 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"compute container sizes for "</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L200" class="LineNr">200 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"compute container sizes for "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L201" class="LineNr">201 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L202" class="LineNr">202 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>pending_metadata<span class="Delimiter">,</span> *type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L203" class="LineNr">203 </span> pending_metadata<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>*type<span class="Delimiter">);</span> <span id="L204" class="LineNr">204 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L205" class="LineNr">205 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L206" class="LineNr">206 </span> raise << <span class="Constant">"invalid type "</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid type "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>type<span class="Delimiter">)</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L207" class="LineNr">207 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> <span id="L209" class="LineNr">209 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name == <span class="Constant">"address"</span><span class="Delimiter">)</span> -<span id="L210" class="LineNr">210 </span> compute_container_sizes<span class="Delimiter">(</span>payload_type<span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L210" class="LineNr">210 </span> compute_container_sizes<span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L211" class="LineNr">211 </span> <span class="Comment">// End compute_container_sizes Non-atom Special-cases</span> <span id="L212" class="LineNr">212 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L213" class="LineNr">213 </span> <span class="Delimiter">}</span> <span id="L214" class="LineNr">214 </span> assert<span class="Delimiter">(</span>type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <span id="L215" class="LineNr">215 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L216" class="LineNr">216 </span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L217" class="LineNr">217 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> +<span id="L217" class="LineNr">217 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span id="L218" class="LineNr">218 </span> compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L219" class="LineNr">219 </span> <span class="Comment">// End compute_container_sizes Atom Special-cases</span> <span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span> <span id="L221" class="LineNr">221 </span> <span id="L222" class="LineNr">222 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_info& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set<type_tree>& pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L223" class="LineNr">223 </span> assert<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span> +<span id="L223" class="LineNr">223 </span> assert<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">);</span> <span id="L224" class="LineNr">224 </span> <span class="Comment">// size of a container is the sum of the sizes of its element</span> <span id="L225" class="LineNr">225 </span> <span class="Comment">// (So it can only contain arrays if they're static and include their</span> <span id="L226" class="LineNr">226 </span> <span class="Comment">// length in the type.)</span> <span id="L227" class="LineNr">227 </span> container_metadata metadata<span class="Delimiter">;</span> -<span id="L228" class="LineNr">228 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L229" class="LineNr">229 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = container_info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L230" class="LineNr">230 </span> <span class="Comment">// Compute Container Size(element, full_type)</span> <span id="L231" class="LineNr">231 </span> compute_container_sizes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> @@ -298,7 +298,7 @@ if ('onhashchange' in window) { <span id="L235" class="LineNr">235 </span> Container_metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<type_tree*<span class="Delimiter">,</span> container_metadata><span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*full_type<span class="Delimiter">),</span> metadata<span class="Delimiter">));</span> <span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span> <span id="L237" class="LineNr">237 </span> -<span id="L238" class="LineNr">238 </span><span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L238" class="LineNr">238 </span><span class="Normal">const</span> type_tree* <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L239" class="LineNr">239 </span> assert<span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <span id="L240" class="LineNr">240 </span> <span class="Normal">const</span> type_tree* result = type<span class="Delimiter">-></span>right<span class="Delimiter">;</span> <span id="L241" class="LineNr">241 </span> assert<span class="Delimiter">(</span>!result<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> @@ -307,33 +307,33 @@ if ('onhashchange' in window) { <span id="L244" class="LineNr">244 </span><span class="Delimiter">}</span> <span id="L245" class="LineNr">245 </span> <span id="L246" class="LineNr">246 </span>container_metadata& get<span class="Delimiter">(</span>vector<pair<type_tree*<span class="Delimiter">,</span> container_metadata> >& all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L247" class="LineNr">247 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L248" class="LineNr">248 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>all<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L248" class="LineNr">248 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L264'>matches</a><span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span> <span id="L249" class="LineNr">249 </span> <span class="Identifier">return</span> all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span> <span id="L250" class="LineNr">250 </span> <span class="Delimiter">}</span> <span id="L251" class="LineNr">251 </span> tb_shutdown<span class="Delimiter">();</span> -<span id="L252" class="LineNr">252 </span> raise << <span class="Constant">"unknown size for type '"</span> << to_string<span class="Delimiter">(</span>key<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L252" class="LineNr">252 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unknown size for type '"</span> << to_string<span class="Delimiter">(</span>key<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L253" class="LineNr">253 </span> assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span> <span id="L254" class="LineNr">254 </span><span class="Delimiter">}</span> <span id="L255" class="LineNr">255 </span> <span id="L256" class="LineNr">256 </span><span class="Normal">bool</span> contains_key<span class="Delimiter">(</span><span class="Normal">const</span> vector<pair<type_tree*<span class="Delimiter">,</span> container_metadata> >& all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L257" class="LineNr">257 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L258" class="LineNr">258 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>all<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L258" class="LineNr">258 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L264'>matches</a><span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span> <span id="L259" class="LineNr">259 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L260" class="LineNr">260 </span> <span class="Delimiter">}</span> <span id="L261" class="LineNr">261 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L262" class="LineNr">262 </span><span class="Delimiter">}</span> <span id="L263" class="LineNr">263 </span> -<span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> matches<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> <a href='030container.cc.html#L264'>matches</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L265" class="LineNr">265 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>a == b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L266" class="LineNr">266 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!a || !b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L267" class="LineNr">267 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-></span>atom != b<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L268" class="LineNr">268 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">-></span>value == b<span class="Delimiter">-></span>value<span class="Delimiter">;</span> -<span id="L269" class="LineNr">269 </span> <span class="Identifier">return</span> matches<span class="Delimiter">(</span>a<span class="Delimiter">-></span>left<span class="Delimiter">,</span> b<span class="Delimiter">-></span>left<span class="Delimiter">)</span> && matches<span class="Delimiter">(</span>a<span class="Delimiter">-></span>right<span class="Delimiter">,</span> b<span class="Delimiter">-></span>right<span class="Delimiter">);</span> +<span id="L269" class="LineNr">269 </span> <span class="Identifier">return</span> <a href='030container.cc.html#L264'>matches</a><span class="Delimiter">(</span>a<span class="Delimiter">-></span>left<span class="Delimiter">,</span> b<span class="Delimiter">-></span>left<span class="Delimiter">)</span> && <a href='030container.cc.html#L264'>matches</a><span class="Delimiter">(</span>a<span class="Delimiter">-></span>right<span class="Delimiter">,</span> b<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span> <span id="L271" class="LineNr">271 </span> <span id="L272" class="LineNr">272 </span><span class="Delimiter">:(scenario stash_container)</span> -<span id="L273" class="LineNr">273 </span><span class="muRecipe">def</span> main [ +<span id="L273" class="LineNr">273 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L274" class="LineNr">274 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span class="Comment"># first</span> <span id="L275" class="LineNr">275 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L276" class="LineNr">276 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -344,65 +344,65 @@ if ('onhashchange' in window) { <span id="L281" class="LineNr">281 </span><span class="Comment">//: for the following unit tests we'll do the work of the transform by hand</span> <span id="L282" class="LineNr">282 </span> <span id="L283" class="LineNr">283 </span><span class="Delimiter">:(before "End Unit Tests")</span> -<span id="L284" class="LineNr">284 </span><span class="Normal">void</span> test_container_sizes<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L284" class="LineNr">284 </span><span class="Normal">void</span> <a href='030container.cc.html#L284'>test_container_sizes</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L285" class="LineNr">285 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L286" class="LineNr">286 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<span id="L287" class="LineNr">287 </span> CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L287" class="LineNr">287 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L288" class="LineNr">288 </span> <span class="Comment">// scan</span> <span id="L289" class="LineNr">289 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L290" class="LineNr">290 </span> <span class="Comment">// the reagent we scanned knows its size</span> -<span id="L291" class="LineNr">291 </span> CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L291" class="LineNr">291 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L292" class="LineNr">292 </span> <span class="Comment">// the global table also knows its size</span> -<span id="L293" class="LineNr">293 </span> CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> -<span id="L294" class="LineNr">294 </span> CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L293" class="LineNr">293 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L294" class="LineNr">294 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span> <span id="L296" class="LineNr">296 </span> -<span id="L297" class="LineNr">297 </span><span class="Normal">void</span> test_container_sizes_through_aliases<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L297" class="LineNr">297 </span><span class="Normal">void</span> <a href='030container.cc.html#L297'>test_container_sizes_through_aliases</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L298" class="LineNr">298 </span> <span class="Comment">// a new alias for a container</span> -<span id="L299" class="LineNr">299 </span> put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"pt"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"point"</span><span class="Delimiter">));</span> +<span id="L299" class="LineNr">299 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"pt"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"point"</span><span class="Delimiter">));</span> <span id="L300" class="LineNr">300 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:pt"</span><span class="Delimiter">);</span> <span id="L301" class="LineNr">301 </span> <span class="Comment">// scan</span> <span id="L302" class="LineNr">302 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L303" class="LineNr">303 </span> <span class="Comment">// the reagent we scanned knows its size</span> -<span id="L304" class="LineNr">304 </span> CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L304" class="LineNr">304 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L305" class="LineNr">305 </span> <span class="Comment">// the global table also knows its size</span> -<span id="L306" class="LineNr">306 </span> CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> -<span id="L307" class="LineNr">307 </span> CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L306" class="LineNr">306 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L307" class="LineNr">307 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L308" class="LineNr">308 </span><span class="Delimiter">}</span> <span id="L309" class="LineNr">309 </span> -<span id="L310" class="LineNr">310 </span><span class="Normal">void</span> test_container_sizes_nested<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L310" class="LineNr">310 </span><span class="Normal">void</span> <a href='030container.cc.html#L310'>test_container_sizes_nested</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L311" class="LineNr">311 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L312" class="LineNr">312 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:point-number"</span><span class="Delimiter">);</span> -<span id="L313" class="LineNr">313 </span> CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L313" class="LineNr">313 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L314" class="LineNr">314 </span> <span class="Comment">// scan</span> <span id="L315" class="LineNr">315 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L316" class="LineNr">316 </span> <span class="Comment">// the reagent we scanned knows its size</span> -<span id="L317" class="LineNr">317 </span> CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span> +<span id="L317" class="LineNr">317 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span> <span id="L318" class="LineNr">318 </span> <span class="Comment">// the global table also knows its size</span> -<span id="L319" class="LineNr">319 </span> CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> -<span id="L320" class="LineNr">320 </span> CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span> +<span id="L319" class="LineNr">319 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L320" class="LineNr">320 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span> <span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span> <span id="L322" class="LineNr">322 </span> -<span id="L323" class="LineNr">323 </span><span class="Normal">void</span> test_container_sizes_recursive<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L323" class="LineNr">323 </span><span class="Normal">void</span> <a href='030container.cc.html#L323'>test_container_sizes_recursive</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L324" class="LineNr">324 </span> <span class="Comment">// define a container containing an address to itself</span> <span id="L325" class="LineNr">325 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L326" class="LineNr">326 </span> <span class="Constant">" x:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L327" class="LineNr">327 </span> <span class="Constant">" y:address:foo</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L327" class="LineNr">327 </span> <span class="Constant">" y:<a href='043space.cc.html#L76'>address</a>:foo</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L328" class="LineNr">328 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L329" class="LineNr">329 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> <span id="L330" class="LineNr">330 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<span id="L331" class="LineNr">331 </span> CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L331" class="LineNr">331 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L332" class="LineNr">332 </span><span class="Delimiter">}</span> <span id="L333" class="LineNr">333 </span> -<span id="L334" class="LineNr">334 </span><span class="Normal">void</span> test_container_sizes_from_address<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L334" class="LineNr">334 </span><span class="Normal">void</span> <a href='030container.cc.html#L334'>test_container_sizes_from_address</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L335" class="LineNr">335 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L336" class="LineNr">336 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<span id="L337" class="LineNr">337 </span> CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L337" class="LineNr">337 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L338" class="LineNr">338 </span> <span class="Comment">// scanning an address to the container precomputes the size of the container</span> -<span id="L339" class="LineNr">339 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:point"</span><span class="Delimiter">);</span> +<span id="L339" class="LineNr">339 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:point"</span><span class="Delimiter">);</span> <span id="L340" class="LineNr">340 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<span id="L341" class="LineNr">341 </span> CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> -<span id="L342" class="LineNr">342 </span> CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L341" class="LineNr">341 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L342" class="LineNr">342 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L343" class="LineNr">343 </span><span class="Delimiter">}</span> <span id="L344" class="LineNr">344 </span> <span id="L345" class="LineNr">345 </span><span class="SalientComment">//:: To access elements of a container, use 'get'</span> @@ -410,7 +410,7 @@ if ('onhashchange' in window) { <span id="L347" class="LineNr">347 </span><span class="Comment">//: appropriate element of the container value.</span> <span id="L348" class="LineNr">348 </span> <span id="L349" class="LineNr">349 </span><span class="Delimiter">:(scenario get)</span> -<span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> main [ +<span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L351" class="LineNr">351 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L352" class="LineNr">352 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L353" class="LineNr">353 </span> <span class="Constant">15</span>:num<span class="Special"> <- </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> @@ -420,47 +420,47 @@ if ('onhashchange' in window) { <span id="L357" class="LineNr">357 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L358" class="LineNr">358 </span>GET<span class="Delimiter">,</span> <span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L360" class="LineNr">360 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"get"</span><span class="Delimiter">,</span> GET<span class="Delimiter">);</span> +<span id="L360" class="LineNr">360 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"get"</span><span class="Delimiter">,</span> GET<span class="Delimiter">);</span> <span id="L361" class="LineNr">361 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L362" class="LineNr">362 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span> -<span id="L363" class="LineNr">363 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L364" class="LineNr">364 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L363" class="LineNr">363 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L364" class="LineNr">364 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L365" class="LineNr">365 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L366" class="LineNr">366 </span> <span class="Delimiter">}</span> <span id="L367" class="LineNr">367 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// new copy for every invocation</span> <span id="L368" class="LineNr">368 </span> <span class="Comment">// Update GET base in Check</span> <span id="L369" class="LineNr">369 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L370" class="LineNr">370 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L370" class="LineNr">370 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L371" class="LineNr">371 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L372" class="LineNr">372 </span> <span class="Delimiter">}</span> <span id="L373" class="LineNr">373 </span> <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span> <span id="L374" class="LineNr">374 </span> <span class="Comment">// Update GET base_type in Check</span> -<span id="L375" class="LineNr">375 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L376" class="LineNr">376 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L375" class="LineNr">375 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L376" class="LineNr">376 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L377" class="LineNr">377 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L378" class="LineNr">378 </span> <span class="Delimiter">}</span> <span id="L379" class="LineNr">379 </span> <span class="Normal">const</span> reagent& offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L380" class="LineNr">380 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L381" class="LineNr">381 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'get' should have type 'offset', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L381" class="LineNr">381 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'get' should have type 'offset', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L382" class="LineNr">382 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L383" class="LineNr">383 </span> <span class="Delimiter">}</span> <span id="L384" class="LineNr">384 </span> <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L385" class="LineNr">385 </span> <span class="Comment">//: later layers will permit non-integer offsets</span> -<span id="L386" class="LineNr">386 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> -<span id="L387" class="LineNr">387 </span> offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<span id="L386" class="LineNr">386 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> +<span id="L387" class="LineNr">387 </span> offset_value = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span> <span id="L388" class="LineNr">388 </span> <span class="Normal">else</span> <span id="L389" class="LineNr">389 </span> offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span> -<span id="L390" class="LineNr">390 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L391" class="LineNr">391 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L390" class="LineNr">390 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L391" class="LineNr">391 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L392" class="LineNr">392 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L393" class="LineNr">393 </span> <span class="Delimiter">}</span> <span id="L394" class="LineNr">394 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L395" class="LineNr">395 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L396" class="LineNr">396 </span> <span class="Comment">// Update GET product in Check</span> <span id="L397" class="LineNr">397 </span> <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span> -<span id="L398" class="LineNr">398 </span> <span class="Normal">const</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span> +<span id="L398" class="LineNr">398 </span> <span class="Normal">const</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span> <span id="L399" class="LineNr">399 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span> element<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L400" class="LineNr">400 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L400" class="LineNr">400 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L401" class="LineNr">401 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L402" class="LineNr">402 </span> <span class="Delimiter">}</span> <span id="L403" class="LineNr">403 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -471,42 +471,42 @@ if ('onhashchange' in window) { <span id="L408" class="LineNr">408 </span> <span class="Comment">// Update GET base in Run</span> <span id="L409" class="LineNr">409 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <span id="L410" class="LineNr">410 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L411" class="LineNr">411 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L411" class="LineNr">411 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L412" class="LineNr">412 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L413" class="LineNr">413 </span> <span class="Delimiter">}</span> <span id="L414" class="LineNr">414 </span> <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span> <span id="L415" class="LineNr">415 </span> <span class="Comment">// Update GET base_type in Run</span> <span id="L416" class="LineNr">416 </span> <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L417" class="LineNr">417 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// copied from Check above</span> +<span id="L417" class="LineNr">417 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// copied from Check above</span> <span id="L418" class="LineNr">418 </span> assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span> <span id="L419" class="LineNr">419 </span> <span class="Normal">int</span> src = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span> -<span id="L420" class="LineNr">420 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << src << end<span class="Delimiter">();</span> +<span id="L420" class="LineNr">420 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << src << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L421" class="LineNr">421 </span> <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span> -<span id="L422" class="LineNr">422 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span> -<span id="L423" class="LineNr">423 </span> element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>src<span class="Delimiter">);</span> -<span id="L424" class="LineNr">424 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L422" class="LineNr">422 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span> +<span id="L423" class="LineNr">423 </span> element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>src<span class="Delimiter">);</span> +<span id="L424" class="LineNr">424 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L425" class="LineNr">425 </span> <span class="Comment">// Read element</span> <span id="L426" class="LineNr">426 </span> products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>element<span class="Delimiter">));</span> <span id="L427" class="LineNr">427 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L428" class="LineNr">428 </span><span class="Delimiter">}</span> <span id="L429" class="LineNr">429 </span> <span id="L430" class="LineNr">430 </span><span class="Delimiter">:(code)</span> -<span id="L431" class="LineNr">431 </span><span class="Normal">const</span> reagent element_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> offset_value<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L431" class="LineNr">431 </span><span class="Normal">const</span> reagent <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> offset_value<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L432" class="LineNr">432 </span> assert<span class="Delimiter">(</span>offset_value >= <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L433" class="LineNr">433 </span> <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span> <span id="L434" class="LineNr">434 </span> <span class="Comment">// Update base_type in element_type</span> <span id="L435" class="LineNr">435 </span> assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">));</span> <span id="L436" class="LineNr">436 </span> assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L437" class="LineNr">437 </span> <span class="Normal">const</span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L438" class="LineNr">438 </span> assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span> -<span id="L439" class="LineNr">439 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value >= SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Identifier">return</span> reagent<span class="Delimiter">();</span> <span class="Comment">// error handled elsewhere</span> +<span id="L438" class="LineNr">438 </span> assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">);</span> +<span id="L439" class="LineNr">439 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Identifier">return</span> reagent<span class="Delimiter">();</span> <span class="Comment">// error handled elsewhere</span> <span id="L440" class="LineNr">440 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset_value<span class="Delimiter">);</span> <span id="L441" class="LineNr">441 </span> <span class="Comment">// End element_type Special-cases</span> <span id="L442" class="LineNr">442 </span> <span class="Identifier">return</span> element<span class="Delimiter">;</span> <span id="L443" class="LineNr">443 </span><span class="Delimiter">}</span> <span id="L444" class="LineNr">444 </span> <span id="L445" class="LineNr">445 </span><span class="Delimiter">:(scenario get_handles_nested_container_elements)</span> -<span id="L446" class="LineNr">446 </span><span class="muRecipe">def</span> main [ +<span id="L446" class="LineNr">446 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L447" class="LineNr">447 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L448" class="LineNr">448 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L449" class="LineNr">449 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -516,38 +516,38 @@ if ('onhashchange' in window) { <span id="L453" class="LineNr">453 </span> <span id="L454" class="LineNr">454 </span><span class="Delimiter">:(scenario get_out_of_bounds)</span> <span id="L455" class="LineNr">455 </span><span class="Special">% Hide_errors = true;</span> -<span id="L456" class="LineNr">456 </span><span class="muRecipe">def</span> main [ +<span id="L456" class="LineNr">456 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L457" class="LineNr">457 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L458" class="LineNr">458 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L459" class="LineNr">459 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> <span id="L460" class="LineNr">460 </span> get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2:offset</span> <span class="Comment"># point-number occupies 3 locations but has only 2 fields; out of bounds</span> <span id="L461" class="LineNr">461 </span>] -<span id="L462" class="LineNr">462 </span><span class="traceContains">+error: main: invalid offset '2' for 'point-number'</span> +<span id="L462" class="LineNr">462 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid offset '2' for 'point-number'</span> <span id="L463" class="LineNr">463 </span> <span id="L464" class="LineNr">464 </span><span class="Delimiter">:(scenario get_out_of_bounds_2)</span> <span id="L465" class="LineNr">465 </span><span class="Special">% Hide_errors = true;</span> -<span id="L466" class="LineNr">466 </span><span class="muRecipe">def</span> main [ +<span id="L466" class="LineNr">466 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L467" class="LineNr">467 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L468" class="LineNr">468 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L469" class="LineNr">469 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> <span id="L470" class="LineNr">470 </span> get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">-1:offset</span> <span id="L471" class="LineNr">471 </span>] -<span id="L472" class="LineNr">472 </span><span class="traceContains">+error: main: invalid offset '-1' for 'point-number'</span> +<span id="L472" class="LineNr">472 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid offset '-1' for 'point-number'</span> <span id="L473" class="LineNr">473 </span> <span id="L474" class="LineNr">474 </span><span class="Delimiter">:(scenario get_product_type_mismatch)</span> <span id="L475" class="LineNr">475 </span><span class="Special">% Hide_errors = true;</span> -<span id="L476" class="LineNr">476 </span><span class="muRecipe">def</span> main [ +<span id="L476" class="LineNr">476 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L477" class="LineNr">477 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L478" class="LineNr">478 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L479" class="LineNr">479 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> -<span id="L480" class="LineNr">480 </span> <span class="Constant">15</span>:address:num<span class="Special"> <- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span> +<span id="L480" class="LineNr">480 </span> <span class="Constant">15</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span> <span id="L481" class="LineNr">481 </span>] -<span id="L482" class="LineNr">482 </span><span class="traceContains">+error: main: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)</span> +<span id="L482" class="LineNr">482 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)</span> <span id="L483" class="LineNr">483 </span> <span id="L484" class="LineNr">484 </span><span class="Comment">//: we might want to call 'get' without saving the results, say in a sandbox</span> <span id="L485" class="LineNr">485 </span> <span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario get_without_product)</span> -<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [ +<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L488" class="LineNr">488 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L489" class="LineNr">489 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L490" class="LineNr">490 </span> get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span> <span class="Comment"># unsafe</span> @@ -557,11 +557,11 @@ if ('onhashchange' in window) { <span id="L494" class="LineNr">494 </span><span class="SalientComment">//:: To write to elements of containers, use 'put'.</span> <span id="L495" class="LineNr">495 </span> <span id="L496" class="LineNr">496 </span><span class="Delimiter">:(scenario put)</span> -<span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> main [ +<span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L498" class="LineNr">498 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L499" class="LineNr">499 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L500" class="LineNr">500 </span> $clear-trace -<span id="L501" class="LineNr">501 </span> <span class="Constant">12</span>:point<span class="Special"> <- </span>put <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> +<span id="L501" class="LineNr">501 </span> <span class="Constant">12</span>:point<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> <span id="L502" class="LineNr">502 </span>] <span id="L503" class="LineNr">503 </span><span class="traceContains">+mem: storing 36 in location 13</span> <span id="L504" class="LineNr">504 </span><span class="traceAbsent">-mem: storing 34 in location 12</span> @@ -569,37 +569,37 @@ if ('onhashchange' in window) { <span id="L506" class="LineNr">506 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L507" class="LineNr">507 </span>PUT<span class="Delimiter">,</span> <span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L509" class="LineNr">509 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"put"</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span> +<span id="L509" class="LineNr">509 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"put"</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span> <span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L511" class="LineNr">511 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span> -<span id="L512" class="LineNr">512 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L513" class="LineNr">513 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put' expects exactly 3 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L512" class="LineNr">512 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L513" class="LineNr">513 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put' expects exactly 3 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L514" class="LineNr">514 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L515" class="LineNr">515 </span> <span class="Delimiter">}</span> <span id="L516" class="LineNr">516 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L517" class="LineNr">517 </span> <span class="Comment">// Update PUT base in Check</span> <span id="L518" class="LineNr">518 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L519" class="LineNr">519 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L519" class="LineNr">519 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L520" class="LineNr">520 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L521" class="LineNr">521 </span> <span class="Delimiter">}</span> <span id="L522" class="LineNr">522 </span> <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span> <span id="L523" class="LineNr">523 </span> <span class="Comment">// Update PUT base_type in Check</span> -<span id="L524" class="LineNr">524 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L525" class="LineNr">525 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L524" class="LineNr">524 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L525" class="LineNr">525 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L526" class="LineNr">526 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L527" class="LineNr">527 </span> <span class="Delimiter">}</span> <span id="L528" class="LineNr">528 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L529" class="LineNr">529 </span> <span class="Comment">// Update PUT offset in Check</span> <span id="L530" class="LineNr">530 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L531" class="LineNr">531 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'put' should have type 'offset', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L531" class="LineNr">531 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'put' should have type 'offset', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L532" class="LineNr">532 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L533" class="LineNr">533 </span> <span class="Delimiter">}</span> <span id="L534" class="LineNr">534 </span> <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L535" class="LineNr">535 </span> <span class="Comment">//: later layers will permit non-integer offsets</span> -<span id="L536" class="LineNr">536 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L537" class="LineNr">537 </span> offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span> -<span id="L538" class="LineNr">538 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L539" class="LineNr">539 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L536" class="LineNr">536 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L537" class="LineNr">537 </span> offset_value = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<span id="L538" class="LineNr">538 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L539" class="LineNr">539 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L540" class="LineNr">540 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L541" class="LineNr">541 </span> <span class="Delimiter">}</span> <span id="L542" class="LineNr">542 </span> <span class="Delimiter">}</span> @@ -608,14 +608,14 @@ if ('onhashchange' in window) { <span id="L545" class="LineNr">545 </span> <span class="Delimiter">}</span> <span id="L546" class="LineNr">546 </span> <span class="Normal">const</span> reagent& value = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span> <span id="L547" class="LineNr">547 </span> <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span> -<span id="L548" class="LineNr">548 </span> <span class="Normal">const</span> reagent& element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span> +<span id="L548" class="LineNr">548 </span> <span class="Normal">const</span> reagent& element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span> <span id="L549" class="LineNr">549 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L550" class="LineNr">550 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << value<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L550" class="LineNr">550 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << value<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L551" class="LineNr">551 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L552" class="LineNr">552 </span> <span class="Delimiter">}</span> <span id="L553" class="LineNr">553 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// no more checks necessary</span> <span id="L554" class="LineNr">554 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L555" class="LineNr">555 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L555" class="LineNr">555 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L556" class="LineNr">556 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L557" class="LineNr">557 </span> <span class="Delimiter">}</span> <span id="L558" class="LineNr">558 </span> <span class="Comment">// End PUT Product Checks</span> @@ -627,34 +627,34 @@ if ('onhashchange' in window) { <span id="L564" class="LineNr">564 </span> <span class="Comment">// Update PUT base in Run</span> <span id="L565" class="LineNr">565 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <span id="L566" class="LineNr">566 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L567" class="LineNr">567 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L567" class="LineNr">567 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L568" class="LineNr">568 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L569" class="LineNr">569 </span> <span class="Delimiter">}</span> <span id="L570" class="LineNr">570 </span> <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span> <span id="L571" class="LineNr">571 </span> <span class="Comment">// Update PUT base_type in Run</span> <span id="L572" class="LineNr">572 </span> <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L573" class="LineNr">573 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// copied from Check above</span> -<span id="L574" class="LineNr">574 </span> <span class="Normal">int</span> address = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span> -<span id="L575" class="LineNr">575 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy to is "</span> << address << end<span class="Delimiter">();</span> +<span id="L573" class="LineNr">573 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// copied from Check above</span> +<span id="L574" class="LineNr">574 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span> +<span id="L575" class="LineNr">575 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy to is "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L576" class="LineNr">576 </span> <span class="Comment">// optimization: directly write the element rather than updating 'product'</span> <span id="L577" class="LineNr">577 </span> <span class="Comment">// and writing the entire container</span> <span id="L578" class="LineNr">578 </span> <span class="Comment">// Write Memory in PUT in Run</span> -<span id="L579" class="LineNr">579 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L580" class="LineNr">580 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <span class="Constant">" in location "</span> << address+i << end<span class="Delimiter">();</span> -<span id="L581" class="LineNr">581 </span> put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> +<span id="L579" class="LineNr">579 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L580" class="LineNr">580 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <span class="Constant">" in location "</span> << address+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L581" class="LineNr">581 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span id="L582" class="LineNr">582 </span> <span class="Delimiter">}</span> <span id="L583" class="LineNr">583 </span> <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span> <span id="L584" class="LineNr">584 </span><span class="Delimiter">}</span> <span id="L585" class="LineNr">585 </span> <span id="L586" class="LineNr">586 </span><span class="Delimiter">:(scenario put_product_error)</span> <span id="L587" class="LineNr">587 </span><span class="Special">% Hide_errors = true;</span> -<span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> main [ +<span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L589" class="LineNr">589 </span> local-scope <span id="L590" class="LineNr">590 </span> load-ingredients <span id="L591" class="LineNr">591 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> -<span id="L592" class="LineNr">592 </span> <span class="Constant">3</span>:point<span class="Special"> <- </span>put <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> +<span id="L592" class="LineNr">592 </span> <span class="Constant">3</span>:point<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> <span id="L593" class="LineNr">593 </span>] -<span id="L594" class="LineNr">594 </span><span class="traceContains">+error: main: product of 'put' must be first ingredient '1:point', but got '3:point'</span> +<span id="L594" class="LineNr">594 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'put' must be first ingredient '1:point', but got '3:point'</span> <span id="L595" class="LineNr">595 </span> <span id="L596" class="LineNr">596 </span><span class="SalientComment">//:: Allow containers to be defined in Mu code.</span> <span id="L597" class="LineNr">597 </span> @@ -699,7 +699,7 @@ if ('onhashchange' in window) { <span id="L636" class="LineNr">636 </span><span class="muData">container</span> foo [ <span id="L637" class="LineNr">637 </span> <span class="Normal">y</span>:num <span id="L638" class="LineNr">638 </span>] -<span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> main [ +<span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L640" class="LineNr">640 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L641" class="LineNr">641 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L642" class="LineNr">642 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span> @@ -710,7 +710,7 @@ if ('onhashchange' in window) { <span id="L647" class="LineNr">647 </span> <span id="L648" class="LineNr">648 </span><span class="Delimiter">:(before "End Command Handlers")</span> <span id="L649" class="LineNr">649 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"container"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L650" class="LineNr">650 </span> insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span> +<span id="L650" class="LineNr">650 </span> <a href='030container.cc.html#L662'>insert_container</a><span class="Delimiter">(</span>command<span class="Delimiter">,</span> <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">,</span> in<span class="Delimiter">);</span> <span id="L651" class="LineNr">651 </span><span class="Delimiter">}</span> <span id="L652" class="LineNr">652 </span> <span id="L653" class="LineNr">653 </span><span class="Comment">//: Even though we allow containers to be extended, we don't allow this after</span> @@ -722,65 +722,65 @@ if ('onhashchange' in window) { <span id="L659" class="LineNr">659 </span>Num_calls_to_transform_all_at_first_definition = -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L660" class="LineNr">660 </span> <span id="L661" class="LineNr">661 </span><span class="Delimiter">:(code)</span> -<span id="L662" class="LineNr">662 </span><span class="Normal">void</span> insert_container<span class="Delimiter">(</span><span class="Normal">const</span> string& command<span class="Delimiter">,</span> kind_of_type kind<span class="Delimiter">,</span> istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L662" class="LineNr">662 </span><span class="Normal">void</span> <a href='030container.cc.html#L662'>insert_container</a><span class="Delimiter">(</span><span class="Normal">const</span> string& command<span class="Delimiter">,</span> <a href='010vm.cc.html#L172'>kind_of_type</a> kind<span class="Delimiter">,</span> istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L663" class="LineNr">663 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L664" class="LineNr">664 </span> string name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L664" class="LineNr">664 </span> string name = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L665" class="LineNr">665 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L666" class="LineNr">666 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L667" class="LineNr">667 </span> raise << <span class="Constant">"incomplete container definition at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L667" class="LineNr">667 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete container definition at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L668" class="LineNr">668 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L669" class="LineNr">669 </span> <span class="Delimiter">}</span> <span id="L670" class="LineNr">670 </span> <span class="Comment">// End container Name Refinements</span> -<span id="L671" class="LineNr">671 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"--- defining "</span> << command << <span class="Constant">' '</span> << name << end<span class="Delimiter">();</span> +<span id="L671" class="LineNr">671 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"--- defining "</span> << command << <span class="Constant">' '</span> << name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L672" class="LineNr">672 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> <span id="L673" class="LineNr">673 </span> || get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L674" class="LineNr">674 </span> put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L674" class="LineNr">674 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> <span id="L675" class="LineNr">675 </span> <span class="Delimiter">}</span> -<span id="L676" class="LineNr">676 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"type number: "</span> << get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<span id="L677" class="LineNr">677 </span> skip_bracket<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">"'"</span>+command+<span class="Constant">"' must begin with '['"</span><span class="Delimiter">);</span> -<span id="L678" class="LineNr">678 </span> type_info& info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span> +<span id="L676" class="LineNr">676 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"type number: "</span> << get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L677" class="LineNr">677 </span> <a href='030container.cc.html#L734'>skip_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">"'"</span>+command+<span class="Constant">"' must begin with '['"</span><span class="Delimiter">);</span> +<span id="L678" class="LineNr">678 </span> type_info& info = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span> <span id="L679" class="LineNr">679 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L680" class="LineNr">680 </span> <span class="Comment">// initial definition of this container</span> <span id="L681" class="LineNr">681 </span> info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition = Num_calls_to_transform_all<span class="Delimiter">;</span> <span id="L682" class="LineNr">682 </span> <span class="Delimiter">}</span> <span id="L683" class="LineNr">683 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition != Num_calls_to_transform_all<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L684" class="LineNr">684 </span> <span class="Comment">// extension after transform_all</span> -<span id="L685" class="LineNr">685 </span> raise << <span class="Constant">"there was a call to transform_all() between the definition of container '"</span> << name << <span class="Constant">"' and a subsequent extension. This is not supported, since any recipes that used '"</span> << name << <span class="Constant">"' values have already been transformed and </span><span class="cSpecial">\"</span><span class="Constant">frozen</span><span class="cSpecial">\"</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L685" class="LineNr">685 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"there was a call to transform_all() between the definition of container '"</span> << name << <span class="Constant">"' and a subsequent extension. This is not supported, since any recipes that used '"</span> << name << <span class="Constant">"' values have already been transformed and </span><span class="cSpecial">\"</span><span class="Constant">frozen</span><span class="cSpecial">\"</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L686" class="LineNr">686 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L687" class="LineNr">687 </span> <span class="Delimiter">}</span> <span id="L688" class="LineNr">688 </span> info<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span> <span id="L689" class="LineNr">689 </span> info<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span> -<span id="L690" class="LineNr">690 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L691" class="LineNr">691 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L692" class="LineNr">692 </span> string element = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L690" class="LineNr">690 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L691" class="LineNr">691 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L692" class="LineNr">692 </span> string element = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L693" class="LineNr">693 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>element<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L694" class="LineNr">694 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L695" class="LineNr">695 </span> raise << <span class="Constant">"incomplete container definition at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L695" class="LineNr">695 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete container definition at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L696" class="LineNr">696 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L697" class="LineNr">697 </span> <span class="Delimiter">}</span> <span id="L698" class="LineNr">698 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>element == <span class="Constant">"]"</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L699" class="LineNr">699 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L700" class="LineNr">700 </span> raise << command << <span class="Constant">" '"</span> << name << <span class="Constant">"' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L700" class="LineNr">700 </span> <a href='003trace.cc.html#L178'>raise</a> << command << <span class="Constant">" '"</span> << name << <span class="Constant">"' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L701" class="LineNr">701 </span> <span class="Comment">// skip rest of container declaration</span> -<span id="L702" class="LineNr">702 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L703" class="LineNr">703 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L704" class="LineNr">704 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>next_word<span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">"]"</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L702" class="LineNr">702 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L703" class="LineNr">703 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L704" class="LineNr">704 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">"]"</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L705" class="LineNr">705 </span> <span class="Delimiter">}</span> <span id="L706" class="LineNr">706 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L707" class="LineNr">707 </span> <span class="Delimiter">}</span> <span id="L708" class="LineNr">708 </span> info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>element<span class="Delimiter">));</span> <span id="L709" class="LineNr">709 </span> expand_type_abbreviations<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">);</span> <span class="Comment">// todo: use abbreviation before declaration</span> -<span id="L710" class="LineNr">710 </span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">,</span> info<span class="Delimiter">);</span> -<span id="L711" class="LineNr">711 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" element: "</span> << to_string<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> << end<span class="Delimiter">();</span> +<span id="L710" class="LineNr">710 </span> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">,</span> info<span class="Delimiter">);</span> +<span id="L711" class="LineNr">711 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" element: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L712" class="LineNr">712 </span> <span class="Comment">// End Load Container Element Definition</span> <span id="L713" class="LineNr">713 </span> <span class="Delimiter">}</span> <span id="L714" class="LineNr">714 </span><span class="Delimiter">}</span> <span id="L715" class="LineNr">715 </span> -<span id="L716" class="LineNr">716 </span><span class="Normal">void</span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& info<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L716" class="LineNr">716 </span><span class="Normal">void</span> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& info<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L717" class="LineNr">717 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L718" class="LineNr">718 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L719" class="LineNr">719 </span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span> -<span id="L720" class="LineNr">720 </span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">,</span> info<span class="Delimiter">);</span> +<span id="L719" class="LineNr">719 </span> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span> +<span id="L720" class="LineNr">720 </span> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">,</span> info<span class="Delimiter">);</span> <span id="L721" class="LineNr">721 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L722" class="LineNr">722 </span> <span class="Delimiter">}</span> <span id="L723" class="LineNr">723 </span> assert<span class="Delimiter">(</span>!type<span class="Delimiter">-></span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> @@ -789,15 +789,15 @@ if ('onhashchange' in window) { <span id="L726" class="LineNr">726 </span> <span class="Delimiter">}</span> <span id="L727" class="LineNr">727 </span> <span class="Comment">// End insert_container Special-cases</span> <span id="L728" class="LineNr">728 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>name != <span class="Constant">"->"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// used in recipe types</span> -<span id="L729" class="LineNr">729 </span> put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L729" class="LineNr">729 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> <span id="L730" class="LineNr">730 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> <span id="L731" class="LineNr">731 </span> <span class="Delimiter">}</span> <span id="L732" class="LineNr">732 </span><span class="Delimiter">}</span> <span id="L733" class="LineNr">733 </span> -<span id="L734" class="LineNr">734 </span><span class="Normal">void</span> skip_bracket<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L735" class="LineNr">735 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L734" class="LineNr">734 </span><span class="Normal">void</span> <a href='030container.cc.html#L734'>skip_bracket</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L735" class="LineNr">735 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L736" class="LineNr">736 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> -<span id="L737" class="LineNr">737 </span> raise << message << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L737" class="LineNr">737 </span> <a href='003trace.cc.html#L178'>raise</a> << message << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L738" class="LineNr">738 </span><span class="Delimiter">}</span> <span id="L739" class="LineNr">739 </span> <span id="L740" class="LineNr">740 </span><span class="Delimiter">:(scenario multi_word_line_in_container_declaration)</span> @@ -814,20 +814,20 @@ if ('onhashchange' in window) { <span id="L751" class="LineNr">751 </span><span class="muData">container</span> bar [ <span id="L752" class="LineNr">752 </span> <span class="Normal">x</span>:foo <span id="L753" class="LineNr">753 </span>] -<span id="L754" class="LineNr">754 </span><span class="muRecipe">def</span> main [ +<span id="L754" class="LineNr">754 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L755" class="LineNr">755 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L756" class="LineNr">756 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>get <span class="Constant">1</span>:bar/unsafe<span class="Delimiter">,</span> <span class="Constant">0:offset</span> <span id="L757" class="LineNr">757 </span>] <span id="L758" class="LineNr">758 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L759" class="LineNr">759 </span> <span id="L760" class="LineNr">760 </span><span class="Delimiter">:(after "Transform.push_back(expand_type_abbreviations)")</span> -<span id="L761" class="LineNr">761 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>expand_type_abbreviations_in_containers<span class="Delimiter">);</span> <span class="Comment">// idempotent</span> +<span id="L761" class="LineNr">761 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='030container.cc.html#L765'>expand_type_abbreviations_in_containers</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L762" class="LineNr">762 </span><span class="Delimiter">:(code)</span> <span id="L763" class="LineNr">763 </span><span class="Comment">// extremely inefficient; we process all types over and over again, once for every single recipe</span> <span id="L764" class="LineNr">764 </span><span class="Comment">// but it doesn't seem to cause any noticeable slowdown</span> -<span id="L765" class="LineNr">765 </span><span class="Normal">void</span> expand_type_abbreviations_in_containers<span class="Delimiter">(</span>unused <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L766" class="LineNr">766 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L767" class="LineNr">767 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L765" class="LineNr">765 </span><span class="Normal">void</span> <a href='030container.cc.html#L765'>expand_type_abbreviations_in_containers</a><span class="Delimiter">(</span><a href='001help.cc.html#L255'>unused</a> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L766" class="LineNr">766 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L767" class="LineNr">767 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L768" class="LineNr">768 </span> expand_type_abbreviations<span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span> <span id="L769" class="LineNr">769 </span> <span class="Delimiter">}</span> <span id="L770" class="LineNr">770 </span><span class="Delimiter">}</span> @@ -846,13 +846,13 @@ if ('onhashchange' in window) { <span id="L783" class="LineNr">783 </span> <span class="Constant">" a:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L784" class="LineNr">784 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L785" class="LineNr">785 </span> <span class="Comment">// try to extend the container after transform</span> -<span id="L786" class="LineNr">786 </span> transform_all<span class="Delimiter">();</span> -<span id="L787" class="LineNr">787 </span> CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span> +<span id="L786" class="LineNr">786 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> +<span id="L787" class="LineNr">787 </span> <a href='003trace.cc.html#L231'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><span class="Delimiter">();</span> <span id="L788" class="LineNr">788 </span> Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L789" class="LineNr">789 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L790" class="LineNr">790 </span> <span class="Constant">" b:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L791" class="LineNr">791 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L792" class="LineNr">792 </span> CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span> +<span id="L792" class="LineNr">792 </span> <a href='003trace.cc.html#L230'>CHECK_TRACE_CONTAINS_ERRORS</a><span class="Delimiter">();</span> <span id="L793" class="LineNr">793 </span><span class="Delimiter">}</span> <span id="L794" class="LineNr">794 </span> <span id="L795" class="LineNr">795 </span><span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but complain if you</span> @@ -860,14 +860,14 @@ if ('onhashchange' in window) { <span id="L797" class="LineNr">797 </span> <span id="L798" class="LineNr">798 </span><span class="Delimiter">:(scenario run_complains_on_unknown_types)</span> <span id="L799" class="LineNr">799 </span><span class="Special">% Hide_errors = true;</span> -<span id="L800" class="LineNr">800 </span><span class="muRecipe">def</span> main [ +<span id="L800" class="LineNr">800 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L801" class="LineNr">801 </span> <span class="Comment"># integer is not a type</span> <span id="L802" class="LineNr">802 </span> <span class="Constant">1</span>:integer<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L803" class="LineNr">803 </span>] -<span id="L804" class="LineNr">804 </span><span class="traceContains">+error: main: unknown type integer in '1:integer <- copy 0'</span> +<span id="L804" class="LineNr">804 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: unknown type integer in '1:integer <- copy 0'</span> <span id="L805" class="LineNr">805 </span> <span id="L806" class="LineNr">806 </span><span class="Delimiter">:(scenario run_allows_type_definition_after_use)</span> -<span id="L807" class="LineNr">807 </span><span class="muRecipe">def</span> main [ +<span id="L807" class="LineNr">807 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L808" class="LineNr">808 </span> <span class="Constant">1</span>:bar<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe <span id="L809" class="LineNr">809 </span>] <span id="L810" class="LineNr">810 </span><span class="muData">container</span> bar [ @@ -879,14 +879,14 @@ if ('onhashchange' in window) { <span id="L816" class="LineNr">816 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_or_set_invalid_types<span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L817" class="LineNr">817 </span> <span id="L818" class="LineNr">818 </span><span class="Delimiter">:(code)</span> -<span id="L819" class="LineNr">819 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L819" class="LineNr">819 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L820" class="LineNr">820 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L821" class="LineNr">821 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check for invalid types in recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<span id="L822" class="LineNr">822 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span> index < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L821" class="LineNr">821 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check for invalid types in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L822" class="LineNr">822 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span> index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L823" class="LineNr">823 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> -<span id="L824" class="LineNr">824 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L824" class="LineNr">824 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L825" class="LineNr">825 </span> check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span> -<span id="L826" class="LineNr">826 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L826" class="LineNr">826 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L827" class="LineNr">827 </span> check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span> <span id="L828" class="LineNr">828 </span> <span class="Delimiter">}</span> <span id="L829" class="LineNr">829 </span> <span class="Comment">// End check_or_set_invalid_types</span> @@ -894,7 +894,7 @@ if ('onhashchange' in window) { <span id="L831" class="LineNr">831 </span> <span id="L832" class="LineNr">832 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L833" class="LineNr">833 </span> <span class="Comment">// Begin check_or_set_invalid_types(r)</span> -<span id="L834" class="LineNr">834 </span> check_or_set_invalid_types<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">"'"</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">"'"</span><span class="Delimiter">);</span> +<span id="L834" class="LineNr">834 </span> check_or_set_invalid_types<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">"'"</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">"'"</span><span class="Delimiter">);</span> <span id="L835" class="LineNr">835 </span><span class="Delimiter">}</span> <span id="L836" class="LineNr">836 </span> <span id="L837" class="LineNr">837 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string& name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -911,7 +911,7 @@ if ('onhashchange' in window) { <span id="L848" class="LineNr">848 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span id="L849" class="LineNr">849 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> <span id="L850" class="LineNr">850 </span> <span class="Normal">else</span> -<span id="L851" class="LineNr">851 </span> raise << location_for_error_messages << <span class="Constant">"unknown type "</span> << type<span class="Delimiter">-></span>name << <span class="Constant">" in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L851" class="LineNr">851 </span> <a href='003trace.cc.html#L178'>raise</a> << location_for_error_messages << <span class="Constant">"unknown type "</span> << type<span class="Delimiter">-></span>name << <span class="Constant">" in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L852" class="LineNr">852 </span> <span class="Delimiter">}</span> <span id="L853" class="LineNr">853 </span><span class="Delimiter">}</span> <span id="L854" class="LineNr">854 </span> @@ -935,7 +935,7 @@ if ('onhashchange' in window) { <span id="L872" class="LineNr">872 </span> <span id="L873" class="LineNr">873 </span><span class="Delimiter">:(scenario container_with_compound_field_type)</span> <span id="L874" class="LineNr">874 </span><span class="muData">container</span> foo [ -<span id="L875" class="LineNr">875 </span> <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>address array <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span> +<span id="L875" class="LineNr">875 </span> <span class="Delimiter">{</span>x: <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> array <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> array character<span class="Delimiter">))}</span> <span id="L876" class="LineNr">876 </span>] <span id="L877" class="LineNr">877 </span>$error: <span class="Constant">0</span> <span id="L878" class="LineNr">878 </span> @@ -944,11 +944,11 @@ if ('onhashchange' in window) { <span id="L881" class="LineNr">881 </span> <span id="L882" class="LineNr">882 </span><span class="Delimiter">:(code)</span> <span id="L883" class="LineNr">883 </span><span class="Normal">void</span> check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L884" class="LineNr">884 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L884" class="LineNr">884 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L885" class="LineNr">885 </span> <span class="Normal">const</span> type_info& info = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <span id="L886" class="LineNr">886 </span> <span class="Comment">// Check Container Field Types(info)</span> -<span id="L887" class="LineNr">887 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<span id="L888" class="LineNr">888 </span> check_invalid_types<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>info<span class="Delimiter">.</span>name<span class="Delimiter">),</span> info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span> +<span id="L887" class="LineNr">887 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L888" class="LineNr">888 </span> check_invalid_types<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>name<span class="Delimiter">),</span> info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span> <span id="L889" class="LineNr">889 </span> <span class="Delimiter">}</span> <span id="L890" class="LineNr">890 </span><span class="Delimiter">}</span> <span id="L891" class="LineNr">891 </span> @@ -961,7 +961,7 @@ if ('onhashchange' in window) { <span id="L898" class="LineNr">898 </span> <span class="Delimiter">}</span> <span id="L899" class="LineNr">899 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>value != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// value 0 = compound types (layer parse_tree) or type ingredients (layer shape_shifting_container)</span> <span id="L900" class="LineNr">900 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">))</span> -<span id="L901" class="LineNr">901 </span> raise << location_for_error_messages << <span class="Constant">"unknown type in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L901" class="LineNr">901 </span> <a href='003trace.cc.html#L178'>raise</a> << location_for_error_messages << <span class="Constant">"unknown type in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L902" class="LineNr">902 </span> <span class="Delimiter">}</span> <span id="L903" class="LineNr">903 </span><span class="Delimiter">}</span> </pre> diff --git a/html/031merge.cc.html b/html/031merge.cc.html index 52ebad06..208fd6f1 100644 --- a/html/031merge.cc.html +++ b/html/031merge.cc.html @@ -66,7 +66,7 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span> <span class="Normal">x</span>:num <span id="L6" class="LineNr"> 6 </span> <span class="Normal">y</span>:num <span id="L7" class="LineNr"> 7 </span>] -<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> main [ +<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L9" class="LineNr"> 9 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L10" class="LineNr"> 10 </span>] <span id="L11" class="LineNr"> 11 </span><span class="traceContains">+mem: storing 3 in location 1</span> @@ -75,7 +75,7 @@ if ('onhashchange' in window) { <span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L15" class="LineNr"> 15 </span>MERGE<span class="Delimiter">,</span> <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L17" class="LineNr"> 17 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"merge"</span><span class="Delimiter">,</span> MERGE<span class="Delimiter">);</span> +<span id="L17" class="LineNr"> 17 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"merge"</span><span class="Delimiter">,</span> MERGE<span class="Delimiter">);</span> <span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L19" class="LineNr"> 19 </span><span class="Normal">case</span> MERGE: <span class="Delimiter">{</span> <span id="L20" class="LineNr"> 20 </span> <span class="Comment">// type-checking in a separate transform below</span> @@ -84,8 +84,8 @@ if ('onhashchange' in window) { <span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L24" class="LineNr"> 24 </span><span class="Normal">case</span> MERGE: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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 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> <span id="L29" class="LineNr"> 29 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">}</span> @@ -93,24 +93,24 @@ if ('onhashchange' in window) { <span id="L32" class="LineNr"> 32 </span><span class="Comment">//: type-check 'merge' to avoid interpreting numbers as addresses</span> <span id="L33" class="LineNr"> 33 </span> <span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(scenario merge_check)</span> -<span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> main [ +<span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L36" class="LineNr"> 36 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L37" class="LineNr"> 37 </span>] <span id="L38" class="LineNr"> 38 </span>$error: <span class="Constant">0</span> <span id="L39" class="LineNr"> 39 </span> <span id="L40" class="LineNr"> 40 </span><span class="Delimiter">:(scenario merge_check_missing_element)</span> <span id="L41" class="LineNr"> 41 </span><span class="Special">% Hide_errors = true;</span> -<span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> main [ +<span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L43" class="LineNr"> 43 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>merge <span class="Constant">3</span> <span id="L44" class="LineNr"> 44 </span>] -<span id="L45" class="LineNr"> 45 </span><span class="traceContains">+error: main: too few ingredients in '1:point <- merge 3'</span> +<span id="L45" class="LineNr"> 45 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too few ingredients in '1:point <- merge 3'</span> <span id="L46" class="LineNr"> 46 </span> <span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(scenario merge_check_extra_element)</span> <span id="L48" class="LineNr"> 48 </span><span class="Special">% Hide_errors = true;</span> -<span id="L49" class="LineNr"> 49 </span><span class="muRecipe">def</span> main [ +<span id="L49" class="LineNr"> 49 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L50" class="LineNr"> 50 </span> <span class="Constant">1</span>:point<span class="Special"> <- </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 id="L51" class="LineNr"> 51 </span>] -<span id="L52" class="LineNr"> 52 </span><span class="traceContains">+error: main: too many ingredients in '1:point <- merge 3, 4, 5'</span> +<span id="L52" class="LineNr"> 52 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too many ingredients in '1:point <- merge 3, 4, 5'</span> <span id="L53" class="LineNr"> 53 </span> <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> <span id="L55" class="LineNr"> 55 </span><span class="Comment">//: be flexible in how we construct containers of containers. It should be</span> @@ -118,7 +118,7 @@ if ('onhashchange' in window) { <span id="L57" class="LineNr"> 57 </span><span class="Comment">//: container fields.</span> <span id="L58" class="LineNr"> 58 </span> <span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(scenario merge_check_recursive_containers)</span> -<span id="L60" class="LineNr"> 60 </span><span class="muRecipe">def</span> main [ +<span id="L60" class="LineNr"> 60 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L61" class="LineNr"> 61 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L62" class="LineNr"> 62 </span> <span class="Constant">1</span>:point-number<span class="Special"> <- </span>merge <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L63" class="LineNr"> 63 </span>] @@ -126,28 +126,28 @@ if ('onhashchange' in window) { <span id="L65" class="LineNr"> 65 </span> <span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(scenario merge_check_recursive_containers_2)</span> <span id="L67" class="LineNr"> 67 </span><span class="Special">% Hide_errors = true;</span> -<span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> main [ +<span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L69" class="LineNr"> 69 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L70" class="LineNr"> 70 </span> <span class="Constant">2</span>:point-number<span class="Special"> <- </span>merge <span class="Constant">1</span>:point <span id="L71" class="LineNr"> 71 </span>] -<span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: main: too few ingredients in '2:point-number <- merge 1:point'</span> +<span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too few ingredients in '2:point-number <- merge 1:point'</span> <span id="L73" class="LineNr"> 73 </span> <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario merge_check_recursive_containers_3)</span> -<span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> main [ +<span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L76" class="LineNr"> 76 </span> <span class="Constant">1</span>:point-number<span class="Special"> <- </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 id="L77" class="LineNr"> 77 </span>] <span id="L78" class="LineNr"> 78 </span>$error: <span class="Constant">0</span> <span id="L79" class="LineNr"> 79 </span> <span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(scenario merge_check_recursive_containers_4)</span> <span id="L81" class="LineNr"> 81 </span><span class="Special">% Hide_errors = true;</span> -<span id="L82" class="LineNr"> 82 </span><span class="muRecipe">def</span> main [ +<span id="L82" class="LineNr"> 82 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L83" class="LineNr"> 83 </span> <span class="Constant">1</span>:point-number<span class="Special"> <- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L84" class="LineNr"> 84 </span>] -<span id="L85" class="LineNr"> 85 </span><span class="traceContains">+error: main: too few ingredients in '1:point-number <- merge 3, 4'</span> +<span id="L85" class="LineNr"> 85 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too few ingredients in '1:point-number <- merge 3, 4'</span> <span id="L86" class="LineNr"> 86 </span> <span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(scenario merge_check_reflexive)</span> <span id="L88" class="LineNr"> 88 </span><span class="Special">% Hide_errors = true;</span> -<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> main [ +<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L90" class="LineNr"> 90 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>merge <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L91" class="LineNr"> 91 </span> <span class="Constant">2</span>:point<span class="Special"> <- </span>merge <span class="Constant">1</span>:point <span id="L92" class="LineNr"> 92 </span>] @@ -166,21 +166,21 @@ if ('onhashchange' in window) { <span id="L105" class="LineNr">105 </span> merge_check_point<span class="Delimiter">(</span><span class="Normal">const</span> reagent& 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 id="L106" class="LineNr">106 </span><span class="Delimiter">};</span> <span id="L107" class="LineNr">107 </span> -<span id="L108" class="LineNr">108 </span><span class="Normal">struct</span> merge_check_state <span class="Delimiter">{</span> +<span id="L108" class="LineNr">108 </span><span class="Normal">struct</span> <a href='031merge.cc.html#L108'>merge_check_state</a> <span class="Delimiter">{</span> <span id="L109" class="LineNr">109 </span> stack<merge_check_point> data<span class="Delimiter">;</span> <span id="L110" class="LineNr">110 </span><span class="Delimiter">};</span> <span id="L111" class="LineNr">111 </span> <span id="L112" class="LineNr">112 </span><span class="Delimiter">:(before "End Checks")</span> -<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> +<span id="L113" class="LineNr">113 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='031merge.cc.html#L115'>check_merge_calls</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L114" class="LineNr">114 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L115" class="LineNr">115 </span><span class="Normal">void</span> <a href='031merge.cc.html#L115'>check_merge_calls</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L116" class="LineNr">116 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L117" class="LineNr">117 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- type-check merge instructions in recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L117" class="LineNr">117 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- type-check merge instructions in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L119" class="LineNr">119 </span> <span class="Normal">const</span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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">"merge"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<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> -<span id="L122" class="LineNr">122 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'merge' should yield a single product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L121" class="LineNr">121 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L122" class="LineNr">122 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'merge' should yield a single product in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L123" class="LineNr">123 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L124" class="LineNr">124 </span> <span class="Delimiter">}</span> <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> @@ -188,27 +188,27 @@ if ('onhashchange' in window) { <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">-></span>atom ? product<span class="Delimiter">.</span>type : product<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">;</span> <span id="L128" class="LineNr">128 </span> assert<span class="Delimiter">(</span>product_base_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <span id="L129" class="LineNr">129 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>product_base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> product_base_type<span class="Delimiter">-></span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L130" class="LineNr">130 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'merge' should yield a container in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L130" class="LineNr">130 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'merge' should yield a container in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L131" class="LineNr">131 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L132" class="LineNr">132 </span> <span class="Delimiter">}</span> <span id="L133" class="LineNr">133 </span> <span class="Normal">const</span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> product_base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind != CONTAINER && info<span class="Delimiter">.</span>kind != EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L135" class="LineNr">135 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'merge' should yield a container in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind != <a href='010vm.cc.html#L174'>CONTAINER</a> && info<span class="Delimiter">.</span>kind != <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L135" class="LineNr">135 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'merge' should yield a container in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L136" class="LineNr">136 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L137" class="LineNr">137 </span> <span class="Delimiter">}</span> -<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> +<span id="L138" class="LineNr">138 </span> <a href='031merge.cc.html#L142'>check_merge_call</a><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 id="L139" class="LineNr">139 </span> <span class="Delimiter">}</span> <span id="L140" class="LineNr">140 </span><span class="Delimiter">}</span> <span id="L141" class="LineNr">141 </span> -<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> check_merge_call<span class="Delimiter">(</span><span class="Normal">const</span> vector<reagent>& ingredients<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& product<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L142" class="LineNr">142 </span><span class="Normal">void</span> <a href='031merge.cc.html#L142'>check_merge_call</a><span class="Delimiter">(</span><span class="Normal">const</span> vector<reagent>& ingredients<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& product<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L143" class="LineNr">143 </span> <span class="Normal">int</span> ingredient_index = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L144" class="LineNr">144 </span> merge_check_state state<span class="Delimiter">;</span> +<span id="L144" class="LineNr">144 </span> <a href='031merge.cc.html#L108'>merge_check_state</a> state<span class="Delimiter">;</span> <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> <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> <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> -<span id="L148" class="LineNr">148 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << ingredient_index << <span class="Constant">" vs "</span> << SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<span id="L149" class="LineNr">149 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index >= SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L150" class="LineNr">150 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too few ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L148" class="LineNr">148 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << ingredient_index << <span class="Constant">" vs "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L149" class="LineNr">149 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L150" class="LineNr">150 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too few ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L151" class="LineNr">151 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L152" class="LineNr">152 </span> <span class="Delimiter">}</span> <span id="L153" class="LineNr">153 </span> reagent& container = state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container<span class="Delimiter">;</span> @@ -217,21 +217,21 @@ if ('onhashchange' in window) { <span id="L156" class="LineNr">156 </span> assert<span class="Delimiter">(</span>top_root_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <span id="L157" class="LineNr">157 </span> type_info& container_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> top_root_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> <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> -<span id="L159" class="LineNr">159 </span> <span class="Normal">case</span> CONTAINER: <span class="Delimiter">{</span> +<span id="L159" class="LineNr">159 </span> <span class="Normal">case</span> <a href='010vm.cc.html#L174'>CONTAINER</a>: <span class="Delimiter">{</span> <span id="L160" class="LineNr">160 </span> <span class="Comment">// degenerate case: merge with the same type always succeeds</span> -<span id="L161" class="LineNr">161 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index == <span class="Constant">0</span> && 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 id="L161" class="LineNr">161 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index == <span class="Constant">0</span> && <a href='021check_instruction.cc.html#L100'>types_coercible</a><span class="Delimiter">(</span>container<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span id="L162" class="LineNr">162 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> reagent& expected_ingredient = 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> -<span id="L164" class="LineNr">164 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking container "</span> << to_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> << <span class="Constant">" || "</span> << to_string<span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">)</span> << <span class="Constant">" vs ingredient "</span> << ingredient_index << end<span class="Delimiter">();</span> +<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> reagent& expected_ingredient = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>container<span class="Delimiter">.</span>type<span class="Delimiter">,</span> state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index<span class="Delimiter">);</span> +<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking container "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>container<span class="Delimiter">)</span> << <span class="Constant">" || "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">)</span> << <span class="Constant">" vs ingredient "</span> << ingredient_index << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L165" class="LineNr">165 </span> <span class="Comment">// if the current element is the ingredient we expect, move on to the next element/ingredient</span> -<span id="L166" class="LineNr">166 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>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> +<span id="L166" class="LineNr">166 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='021check_instruction.cc.html#L100'>types_coercible</a><span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span class="Delimiter">{</span> <span id="L167" class="LineNr">167 </span> ++ingredient_index<span class="Delimiter">;</span> <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> -<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 >= 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">)-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<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 >= <a href='001help.cc.html#L138'>SIZE</a><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">)-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L170" class="LineNr">170 </span> state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span> <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> -<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> -<span id="L173" class="LineNr">173 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too many ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> +<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too many ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L174" class="LineNr">174 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span> <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> @@ -247,9 +247,9 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr">186 </span> <span class="Comment">// End check_merge_call Special-cases</span> <span id="L187" class="LineNr">187 </span> <span class="Normal">default</span>: <span class="Delimiter">{</span> <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> -<span id="L189" class="LineNr">189 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"incorrect type of ingredient "</span> << ingredient_index << <span class="Constant">" in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L190" class="LineNr">190 </span> raise << <span class="Constant">" (expected '"</span> << debug_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L191" class="LineNr">191 </span> raise << <span class="Constant">" (got '"</span> << debug_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">))</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L189" class="LineNr">189 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"incorrect type of ingredient "</span> << ingredient_index << <span class="Constant">" in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L190" class="LineNr">190 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" (expected '"</span> << debug_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L191" class="LineNr">191 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" (got '"</span> << debug_string<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">))</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L192" class="LineNr">192 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L193" class="LineNr">193 </span> <span class="Delimiter">}</span> <span id="L194" class="LineNr">194 </span> ++ingredient_index<span class="Delimiter">;</span> @@ -257,12 +257,12 @@ if ('onhashchange' in window) { <span id="L196" class="LineNr">196 </span> <span class="Normal">do</span> <span class="Delimiter">{</span> <span id="L197" class="LineNr">197 </span> state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span> <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> -<span id="L199" class="LineNr">199 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index < SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> -<span id="L200" class="LineNr">200 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too many ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L199" class="LineNr">199 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">))</span> +<span id="L200" class="LineNr">200 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"too many ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L201" class="LineNr">201 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L202" class="LineNr">202 </span> <span class="Delimiter">}</span> <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> -<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 >= 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">)-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">));</span> +<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 >= <a href='001help.cc.html#L138'>SIZE</a><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">)-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">));</span> <span id="L205" class="LineNr">205 </span> <span class="Delimiter">}</span> <span id="L206" class="LineNr">206 </span> <span class="Delimiter">}</span> <span id="L207" class="LineNr">207 </span> <span class="Delimiter">}</span> @@ -278,10 +278,10 @@ if ('onhashchange' in window) { <span id="L217" class="LineNr">217 </span> <span id="L218" class="LineNr">218 </span><span class="Delimiter">:(scenario merge_check_product)</span> <span id="L219" class="LineNr">219 </span><span class="Special">% Hide_errors = true;</span> -<span id="L220" class="LineNr">220 </span><span class="muRecipe">def</span> main [ +<span id="L220" class="LineNr">220 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L221" class="LineNr">221 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>merge <span class="Constant">3</span> <span id="L222" class="LineNr">222 </span>] -<span id="L223" class="LineNr">223 </span><span class="traceContains">+error: main: 'merge' should yield a container in '1:num <- merge 3'</span> +<span id="L223" class="LineNr">223 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'merge' should yield a container in '1:num <- merge 3'</span> <span id="L224" class="LineNr">224 </span> <span id="L225" class="LineNr">225 </span><span class="Delimiter">:(before "End Includes")</span> <span id="L226" class="LineNr">226 </span><span class="PreProc">#include </span><span class="Constant"><stack></span> diff --git a/html/032array.cc.html b/html/032array.cc.html index 60a7e606..b87cd3f0 100644 --- a/html/032array.cc.html +++ b/html/032array.cc.html @@ -68,7 +68,7 @@ if ('onhashchange' in window) { <span id="L7" class="LineNr"> 7 </span> <span id="L8" class="LineNr"> 8 </span><span class="Comment">//: You can create arrays using 'create-array'.</span> <span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(scenario create_array)</span> -<span id="L10" class="LineNr"> 10 </span><span class="muRecipe">def</span> main [ +<span id="L10" class="LineNr"> 10 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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> <span id="L12" class="LineNr"> 12 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L13" class="LineNr"> 13 </span>] @@ -77,33 +77,33 @@ if ('onhashchange' in window) { <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L17" class="LineNr"> 17 </span>CREATE_ARRAY<span class="Delimiter">,</span> <span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L19" class="LineNr"> 19 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"create-array"</span><span class="Delimiter">,</span> CREATE_ARRAY<span class="Delimiter">);</span> +<span id="L19" class="LineNr"> 19 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"create-array"</span><span class="Delimiter">,</span> CREATE_ARRAY<span class="Delimiter">);</span> <span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L21" class="LineNr"> 21 </span><span class="Normal">case</span> CREATE_ARRAY: <span class="Delimiter">{</span> <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> -<span id="L23" class="LineNr"> 23 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'create-array' needs one product and no ingredients but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L23" class="LineNr"> 23 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'create-array' needs one product and no ingredients but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span id="L24" class="LineNr"> 24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L25" class="LineNr"> 25 </span> <span class="Delimiter">}</span> <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> <span id="L27" class="LineNr"> 27 </span> <span class="Comment">// Update CREATE_ARRAY product in Check</span> <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> -<span id="L29" class="LineNr"> 29 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'create-array' cannot create non-array '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L29" class="LineNr"> 29 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'create-array' cannot create non-array '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L30" class="LineNr"> 30 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L31" class="LineNr"> 31 </span> <span class="Delimiter">}</span> <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">-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L33" class="LineNr"> 33 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"create array of what? '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L33" class="LineNr"> 33 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"create array of what? '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L34" class="LineNr"> 34 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">}</span> <span id="L36" class="LineNr"> 36 </span> <span class="Comment">// 'create-array' will need to check properties rather than types</span> <span id="L37" class="LineNr"> 37 </span> type_tree* array_length_from_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">;</span> <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> -<span id="L39" class="LineNr"> 39 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"create array of what size? '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L39" class="LineNr"> 39 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"create array of what size? '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L40" class="LineNr"> 40 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L41" class="LineNr"> 41 </span> <span class="Delimiter">}</span> <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">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span id="L43" class="LineNr"> 43 </span> array_length_from_type = array_length_from_type<span class="Delimiter">-></span>left<span class="Delimiter">;</span> <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">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L45" class="LineNr"> 45 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'create-array' product should specify size of array after its element type, but got '"</span> << product<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'create-array' product should specify size of array after its element type, but got '"</span> << product<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L46" class="LineNr"> 46 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L47" class="LineNr"> 47 </span> <span class="Delimiter">}</span> <span id="L48" class="LineNr"> 48 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -116,15 +116,15 @@ if ('onhashchange' in window) { <span id="L55" class="LineNr"> 55 </span> type_tree* array_length_from_type = product<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">;</span> <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">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span id="L57" class="LineNr"> 57 </span> array_length_from_type = array_length_from_type<span class="Delimiter">-></span>left<span class="Delimiter">;</span> -<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">-></span>name<span class="Delimiter">);</span> +<span id="L58" class="LineNr"> 58 </span> <span class="Normal">int</span> <a href='032array.cc.html#L386'>array_length</a> = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>array_length_from_type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> <span id="L59" class="LineNr"> 59 </span> <span class="Comment">// initialize array length, so that size_of will work</span> -<span id="L60" class="LineNr"> 60 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << array_length << <span class="Constant">" in location "</span> << base_address << end<span class="Delimiter">();</span> -<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> +<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << <a href='032array.cc.html#L386'>array_length</a> << <span class="Constant">" in location "</span> << base_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L61" class="LineNr"> 61 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">,</span> <a href='032array.cc.html#L386'>array_length</a><span class="Delimiter">);</span> <span class="Comment">// in array elements</span> <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> -<span id="L63" class="LineNr"> 63 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"creating array of size "</span> << size << end<span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"creating array of size "</span> << size << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L64" class="LineNr"> 64 </span> <span class="Comment">// initialize array</span> <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 <= size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L66" class="LineNr"> 66 </span> <a href='001help.cc.html#L218'>put</a><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 id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span> <span id="L68" class="LineNr"> 68 </span> <span class="Comment">// no need to update product</span> <span id="L69" class="LineNr"> 69 </span> <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span> @@ -137,7 +137,7 @@ if ('onhashchange' in window) { <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> <span id="L77" class="LineNr"> 77 </span><span class="Comment"># 'static' array, and one without a 'dynamic' array since it can contain</span> <span id="L78" class="LineNr"> 78 </span><span class="Comment"># arrays of many different sizes.</span> -<span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> main [ +<span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L80" class="LineNr"> 80 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L81" class="LineNr"> 81 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L82" class="LineNr"> 82 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -150,7 +150,7 @@ if ('onhashchange' in window) { <span id="L89" class="LineNr"> 89 </span><span class="traceContains">+mem: storing 16 in location 8</span> <span id="L90" class="LineNr"> 90 </span> <span id="L91" class="LineNr"> 91 </span><span class="Delimiter">:(scenario stash_array)</span> -<span id="L92" class="LineNr"> 92 </span><span class="muRecipe">def</span> main [ +<span id="L92" class="LineNr"> 92 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L93" class="LineNr"> 93 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L94" class="LineNr"> 94 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L95" class="LineNr"> 95 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -159,29 +159,29 @@ if ('onhashchange' in window) { <span id="L98" class="LineNr"> 98 </span>] <span id="L99" class="LineNr"> 99 </span><span class="traceContains">+app: foo: 3 14 15 16</span> <span id="L100" class="LineNr">100 </span> -<span id="L101" class="LineNr">101 </span><span class="Delimiter">:(before "End types_coercible Special-cases")</span> +<span id="L101" class="LineNr">101 </span><span class="Delimiter">:(before "End <a href='021check_instruction.cc.html#L100'>types_coercible</a> Special-cases")</span> <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> && is_mu_array<span class="Delimiter">(</span>to<span class="Delimiter">))</span> -<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> +<span id="L103" class="LineNr">103 </span> <span class="Identifier">return</span> types_strictly_match<span class="Delimiter">(</span><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>from<span class="Delimiter">.</span>type<span class="Delimiter">),</span> <a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L104" class="LineNr">104 </span> <span id="L105" class="LineNr">105 </span><span class="Delimiter">:(before "End size_of(reagent r) Special-cases")</span> <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">-></span>atom && r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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">-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L108" class="LineNr">108 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"'"</span> << r<span class="Delimiter">.</span>original_string << <span class="Constant">"' is an array of what?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L108" class="LineNr">108 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"'"</span> << r<span class="Delimiter">.</span>original_string << <span class="Constant">"' is an array of what?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L109" class="LineNr">109 </span> <span class="Identifier">return</span> <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L110" class="LineNr">110 </span> <span class="Delimiter">}</span> -<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> +<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> + <a href='032array.cc.html#L386'>array_length</a><span class="Delimiter">(</span>r<span class="Delimiter">)</span>*size_of<span class="Delimiter">(</span><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L112" class="LineNr">112 </span><span class="Delimiter">}</span> <span id="L113" class="LineNr">113 </span> <span id="L114" class="LineNr">114 </span><span class="Delimiter">:(before "End size_of(type) Non-atom Special-cases")</span> -<span id="L115" class="LineNr">115 </span><span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">))</span> <span class="Identifier">return</span> static_array_length<span class="Delimiter">(</span>type<span class="Delimiter">);</span> +<span id="L115" class="LineNr">115 </span><span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <a href='032array.cc.html#L117'>static_array_length</a><span class="Delimiter">(</span>type<span class="Delimiter">);</span> <span id="L116" class="LineNr">116 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L117" class="LineNr">117 </span><span class="Normal">int</span> <a href='032array.cc.html#L117'>static_array_length</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L118" class="LineNr">118 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom && type<span class="Delimiter">-></span>right && !type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom && type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right && !type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom && !type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right <span class="Comment">// exactly 3 types</span> -<span id="L119" class="LineNr">119 </span> && type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left && type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// third 'type' is a number</span> +<span id="L119" class="LineNr">119 </span> && type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left && type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && <a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// third 'type' is a number</span> <span id="L120" class="LineNr">120 </span> <span class="Comment">// get size from type</span> -<span id="L121" class="LineNr">121 </span> <span class="Identifier">return</span> to_integer<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">);</span> +<span id="L121" class="LineNr">121 </span> <span class="Identifier">return</span> <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">);</span> <span id="L122" class="LineNr">122 </span> <span class="Delimiter">}</span> -<span id="L123" class="LineNr">123 </span> cerr << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L123" class="LineNr">123 </span> cerr << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L124" class="LineNr">124 </span> assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">}</span> <span id="L126" class="LineNr">126 </span> @@ -200,8 +200,8 @@ if ('onhashchange' in window) { <span id="L139" class="LineNr">139 </span>] <span id="L140" class="LineNr">140 </span>$error: <span class="Constant">0</span> <span id="L141" class="LineNr">141 </span> -<span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before "End insert_container Special-cases")</span> -<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">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// sometimes types will contain non-type tags, like numbers for the size of an array</span> +<span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L662'>insert_container</a> Special-cases")</span> +<span id="L143" class="LineNr">143 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// sometimes types will contain non-type tags, like numbers for the size of an array</span> <span id="L144" class="LineNr">144 </span> type<span class="Delimiter">-></span>value = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span><span class="Delimiter">}</span> <span id="L146" class="LineNr">146 </span> @@ -216,16 +216,16 @@ if ('onhashchange' in window) { <span id="L155" class="LineNr">155 </span><span class="Delimiter">{</span> <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> <span id="L157" class="LineNr">157 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type && type<span class="Delimiter">-></span>atom && type<span class="Delimiter">-></span>name == <span class="Constant">"array"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L158" class="LineNr">158 </span> raise << <span class="Constant">"container '"</span> << name << <span class="Constant">"' doesn't specify type of array elements for '"</span> << info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L158" class="LineNr">158 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"container '"</span> << name << <span class="Constant">"' doesn't specify type of array elements for '"</span> << info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L159" class="LineNr">159 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L160" class="LineNr">160 </span> <span class="Delimiter">}</span> <span id="L161" class="LineNr">161 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type && !type<span class="Delimiter">-></span>atom && type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name == <span class="Constant">"array"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L162" class="LineNr">162 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L163" class="LineNr">163 </span> raise << <span class="Constant">"container '"</span> << name << <span class="Constant">"' doesn't specify type of array elements for '"</span> << info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L163" class="LineNr">163 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"container '"</span> << name << <span class="Constant">"' doesn't specify type of array elements for '"</span> << info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L164" class="LineNr">164 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L165" class="LineNr">165 </span> <span class="Delimiter">}</span> <span id="L166" class="LineNr">166 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right || !is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// array has no length</span> -<span id="L167" class="LineNr">167 </span> raise << <span class="Constant">"container '"</span> << name << <span class="Constant">"' cannot determine size of element '"</span> << info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L167" class="LineNr">167 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"container '"</span> << name << <span class="Constant">"' cannot determine size of element '"</span> << info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L168" class="LineNr">168 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L169" class="LineNr">169 </span> <span class="Delimiter">}</span> <span id="L170" class="LineNr">170 </span> <span class="Delimiter">}</span> @@ -234,7 +234,7 @@ if ('onhashchange' in window) { <span id="L173" class="LineNr">173 </span><span class="Comment">//: disable the size mismatch check for 'merge' instructions since containers</span> <span id="L174" class="LineNr">174 </span><span class="Comment">//: can contain arrays, and since we already do plenty of checking for them</span> <span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before "End size_mismatch(x) Special-cases")</span> -<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 < 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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> <span id="L177" class="LineNr">177 </span> && current_instruction<span class="Delimiter">().</span>operation == MERGE<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L178" class="LineNr">178 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L179" class="LineNr">179 </span><span class="Delimiter">}</span> @@ -244,7 +244,7 @@ if ('onhashchange' in window) { <span id="L183" class="LineNr">183 </span> <span class="Normal">x</span>:num <span id="L184" class="LineNr">184 </span> <span class="Normal">y</span>:array:num:<span class="Constant">3</span> <span id="L185" class="LineNr">185 </span>] -<span id="L186" class="LineNr">186 </span><span class="muRecipe">def</span> main [ +<span id="L186" class="LineNr">186 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L187" class="LineNr">187 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L188" class="LineNr">188 </span> <span class="Constant">10</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span> <span id="L189" class="LineNr">189 </span>] @@ -266,74 +266,74 @@ if ('onhashchange' in window) { <span id="L205" class="LineNr">205 </span> <span id="L206" class="LineNr">206 </span><span class="Delimiter">:(before "End compute_container_sizes Non-atom Special-cases")</span> <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">-></span>left<span class="Delimiter">-></span>name == <span class="Constant">"array"</span><span class="Delimiter">)</span> -<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> +<span id="L208" class="LineNr">208 </span> compute_container_sizes<span class="Delimiter">(</span><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L209" class="LineNr">209 </span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before "End Unit Tests")</span> -<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> +<span id="L211" class="LineNr">211 </span><span class="Normal">void</span> <a href='032array.cc.html#L211'>test_container_sizes_from_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L212" class="LineNr">212 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L213" class="LineNr">213 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<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> +<span id="L214" class="LineNr">214 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L215" class="LineNr">215 </span> <span class="Comment">// scanning an array of the container precomputes the size of the container</span> <span id="L216" class="LineNr">216 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:array:point"</span><span class="Delimiter">);</span> <span id="L217" class="LineNr">217 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L218" class="LineNr">218 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L219" class="LineNr">219 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span> <span id="L221" class="LineNr">221 </span> -<span id="L222" class="LineNr">222 </span><span class="Normal">void</span> test_container_sizes_from_address_to_array<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L222" class="LineNr">222 </span><span class="Normal">void</span> <a href='032array.cc.html#L222'>test_container_sizes_from_address_to_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L223" class="LineNr">223 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L224" class="LineNr">224 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<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> +<span id="L225" class="LineNr">225 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> <span id="L226" class="LineNr">226 </span> <span class="Comment">// scanning an address to an array of the container precomputes the size of the container</span> -<span id="L227" class="LineNr">227 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:array:point"</span><span class="Delimiter">);</span> +<span id="L227" class="LineNr">227 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:array:point"</span><span class="Delimiter">);</span> <span id="L228" class="LineNr">228 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L229" class="LineNr">229 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L230" class="LineNr">230 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L231" class="LineNr">231 </span><span class="Delimiter">}</span> <span id="L232" class="LineNr">232 </span> -<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> +<span id="L233" class="LineNr">233 </span><span class="Normal">void</span> <a href='032array.cc.html#L233'>test_container_sizes_from_static_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L234" class="LineNr">234 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L235" class="LineNr">235 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<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> +<span id="L236" class="LineNr">236 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <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> <span id="L238" class="LineNr">238 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:array:point:10"</span><span class="Delimiter">);</span> <span id="L239" class="LineNr">239 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L240" class="LineNr">240 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L241" class="LineNr">241 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L242" class="LineNr">242 </span> <span class="Comment">// no non-container types precomputed</span> -<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> +<span id="L243" class="LineNr">243 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L244" class="LineNr">244 </span><span class="Delimiter">}</span> <span id="L245" class="LineNr">245 </span> -<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> +<span id="L246" class="LineNr">246 </span><span class="Normal">void</span> <a href='032array.cc.html#L246'>test_container_sizes_from_address_to_static_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L247" class="LineNr">247 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L248" class="LineNr">248 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<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> +<span id="L249" class="LineNr">249 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <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> -<span id="L251" class="LineNr">251 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:array:point:10"</span><span class="Delimiter">);</span> +<span id="L251" class="LineNr">251 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:array:point:10"</span><span class="Delimiter">);</span> <span id="L252" class="LineNr">252 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L253" class="LineNr">253 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L254" class="LineNr">254 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L255" class="LineNr">255 </span> <span class="Comment">// no non-container types precomputed</span> -<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> +<span id="L256" class="LineNr">256 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L257" class="LineNr">257 </span><span class="Delimiter">}</span> <span id="L258" class="LineNr">258 </span> -<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> +<span id="L259" class="LineNr">259 </span><span class="Normal">void</span> <a href='032array.cc.html#L259'>test_container_sizes_from_repeated_address_and_array_types</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L260" class="LineNr">260 </span> <span class="Comment">// a container we don't have the size for</span> <span id="L261" class="LineNr">261 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<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> +<span id="L262" class="LineNr">262 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <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> -<span id="L264" class="LineNr">264 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:array:address:array:point:10"</span><span class="Delimiter">);</span> +<span id="L264" class="LineNr">264 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:array:point:10"</span><span class="Delimiter">);</span> <span id="L265" class="LineNr">265 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L266" class="LineNr">266 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L267" class="LineNr">267 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L268" class="LineNr">268 </span> <span class="Comment">// no non-container types precomputed</span> -<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> +<span id="L269" class="LineNr">269 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L270" class="LineNr">270 </span><span class="Delimiter">}</span> <span id="L271" class="LineNr">271 </span> <span id="L272" class="LineNr">272 </span><span class="SalientComment">//:: To access elements of an array, use 'index'</span> <span id="L273" class="LineNr">273 </span> <span id="L274" class="LineNr">274 </span><span class="Delimiter">:(scenario index)</span> -<span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> main [ +<span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L276" class="LineNr">276 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L277" class="LineNr">277 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L278" class="LineNr">278 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -343,17 +343,17 @@ if ('onhashchange' in window) { <span id="L282" class="LineNr">282 </span><span class="traceContains">+mem: storing 14 in location 5</span> <span id="L283" class="LineNr">283 </span> <span id="L284" class="LineNr">284 </span><span class="Delimiter">:(scenario index_compound_element)</span> -<span id="L285" class="LineNr">285 </span><span class="muRecipe">def</span> main [ -<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"> <- </span>create-array +<span id="L285" class="LineNr">285 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> <- </span>create-array <span id="L287" class="LineNr">287 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L288" class="LineNr">288 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> <span id="L289" class="LineNr">289 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> -<span id="L290" class="LineNr">290 </span> <span class="Constant">5</span>:address:num<span class="Special"> <- </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 id="L290" class="LineNr">290 </span> <span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>index <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)},</span> <span class="Constant">0</span> <span id="L291" class="LineNr">291 </span>] <span id="L292" class="LineNr">292 </span><span class="traceContains">+mem: storing 14 in location 5</span> <span id="L293" class="LineNr">293 </span> <span id="L294" class="LineNr">294 </span><span class="Delimiter">:(scenario index_direct_offset)</span> -<span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> main [ +<span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L296" class="LineNr">296 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L297" class="LineNr">297 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L298" class="LineNr">298 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -366,32 +366,32 @@ if ('onhashchange' in window) { <span id="L305" class="LineNr">305 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L306" class="LineNr">306 </span>INDEX<span class="Delimiter">,</span> <span id="L307" class="LineNr">307 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L308" class="LineNr">308 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"index"</span><span class="Delimiter">,</span> INDEX<span class="Delimiter">);</span> +<span id="L308" class="LineNr">308 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"index"</span><span class="Delimiter">,</span> INDEX<span class="Delimiter">);</span> <span id="L309" class="LineNr">309 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L310" class="LineNr">310 </span><span class="Normal">case</span> INDEX: <span class="Delimiter">{</span> -<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> -<span id="L312" class="LineNr">312 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'index' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L311" class="LineNr">311 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L312" class="LineNr">312 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'index' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L313" class="LineNr">313 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L314" class="LineNr">314 </span> <span class="Delimiter">}</span> <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> <span id="L316" class="LineNr">316 </span> <span class="Comment">// Update INDEX base in Check</span> <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> -<span id="L318" class="LineNr">318 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'index' on a non-array '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L318" class="LineNr">318 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'index' on a non-array '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L319" class="LineNr">319 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L320" class="LineNr">320 </span> <span class="Delimiter">}</span> <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> <span id="L322" class="LineNr">322 </span> <span class="Comment">// Update INDEX index in Check</span> <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> -<span id="L324" class="LineNr">324 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'index' should be a number, but got '"</span> << index<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L324" class="LineNr">324 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'index' should be a number, but got '"</span> << index<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L325" class="LineNr">325 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L326" class="LineNr">326 </span> <span class="Delimiter">}</span> <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> <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> <span id="L329" class="LineNr">329 </span> <span class="Comment">// Update INDEX product in Check</span> <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> -<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> +<span id="L331" class="LineNr">331 </span> element<span class="Delimiter">.</span>type = <a href='032array.cc.html#L366'>copy_array_element</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <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> -<span id="L333" class="LineNr">333 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'index' on '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"' can't be saved in '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'; type should be '"</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L333" class="LineNr">333 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'index' on '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"' can't be saved in '"</span> << product<span class="Delimiter">.</span>original_string << <span class="Constant">"'; type should be '"</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L334" class="LineNr">334 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L335" class="LineNr">335 </span> <span class="Delimiter">}</span> <span id="L336" class="LineNr">336 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -401,34 +401,34 @@ if ('onhashchange' in window) { <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> <span id="L341" class="LineNr">341 </span> <span class="Comment">// Update INDEX base in Run</span> <span id="L342" class="LineNr">342 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> -<span id="L343" class="LineNr">343 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"base address is "</span> << base_address << end<span class="Delimiter">();</span> +<span id="L343" class="LineNr">343 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"base <a href='043space.cc.html#L76'>address</a> is "</span> << base_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<span id="L345" class="LineNr">345 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L345" class="LineNr">345 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L346" class="LineNr">346 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L347" class="LineNr">347 </span> <span class="Delimiter">}</span> <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> <span id="L349" class="LineNr">349 </span> <span class="Comment">// Update INDEX index in Run</span> <span id="L350" class="LineNr">350 </span> vector<<span class="Normal">double</span>> index_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>index<span class="Delimiter">));</span> -<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> < <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> >= get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L352" class="LineNr">352 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"invalid index "</span> << 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> << <span class="Constant">" in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<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> < <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> >= <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L352" class="LineNr">352 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"invalid index "</span> << 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> << <span class="Constant">" in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L353" class="LineNr">353 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L354" class="LineNr">354 </span> <span class="Delimiter">}</span> <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> -<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> -<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> -<span id="L358" class="LineNr">358 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << element<span class="Delimiter">.</span>value << end<span class="Delimiter">();</span> -<span id="L359" class="LineNr">359 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L356" class="LineNr">356 </span> element<span class="Delimiter">.</span>type = <a href='032array.cc.html#L366'>copy_array_element</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L357" class="LineNr">357 </span> element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><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> +<span id="L358" class="LineNr">358 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << element<span class="Delimiter">.</span>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L359" class="LineNr">359 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L360" class="LineNr">360 </span> <span class="Comment">// Read element</span> <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> <span id="L362" class="LineNr">362 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span> <span id="L364" class="LineNr">364 </span> <span id="L365" class="LineNr">365 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L366" class="LineNr">366 </span>type_tree* <a href='032array.cc.html#L366'>copy_array_element</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L368" class="LineNr">368 </span><span class="Delimiter">}</span> <span id="L369" class="LineNr">369 </span> -<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> +<span id="L370" class="LineNr">370 </span>type_tree* <a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L371" class="LineNr">371 </span> assert<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L372" class="LineNr">372 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L373" class="LineNr">373 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>right<span class="Delimiter">;</span> @@ -437,43 +437,43 @@ if ('onhashchange' in window) { <span id="L376" class="LineNr">376 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">;</span> <span id="L377" class="LineNr">377 </span> <span class="Delimiter">}</span> <span id="L378" class="LineNr">378 </span> <span class="Comment">// hack: support array:num:3 without requiring extra parens</span> -<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">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left && type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && is_integer<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<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">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left && type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && <a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L380" class="LineNr">380 </span> assert<span class="Delimiter">(</span>!type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L381" class="LineNr">381 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">;</span> <span id="L382" class="LineNr">382 </span> <span class="Delimiter">}</span> <span id="L383" class="LineNr">383 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>right<span class="Delimiter">;</span> <span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span> <span id="L385" class="LineNr">385 </span> -<span id="L386" class="LineNr">386 </span><span class="Normal">int</span> array_length<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L386" class="LineNr">386 </span><span class="Normal">int</span> <a href='032array.cc.html#L386'>array_length</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L387" class="LineNr">387 </span> <span class="Comment">// x should already be canonized.</span> <span id="L388" class="LineNr">388 </span> <span class="Comment">// hack: look for length in type</span> <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">-></span>atom && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right && !x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right && !x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>atom && !x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right <span class="Comment">// exactly 3 types</span> -<span id="L390" class="LineNr">390 </span> && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// third 'type' is a number</span> +<span id="L390" class="LineNr">390 </span> && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom && <a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// third 'type' is a number</span> <span id="L391" class="LineNr">391 </span> <span class="Comment">// get size from type</span> -<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">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">);</span> +<span id="L392" class="LineNr">392 </span> <span class="Identifier">return</span> <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name<span class="Delimiter">);</span> <span id="L393" class="LineNr">393 </span> <span class="Delimiter">}</span> <span id="L394" class="LineNr">394 </span> <span class="Comment">// this should never happen at transform time</span> -<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> +<span id="L395" class="LineNr">395 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">);</span> <span id="L396" class="LineNr">396 </span><span class="Delimiter">}</span> <span id="L397" class="LineNr">397 </span> <span id="L398" class="LineNr">398 </span><span class="Delimiter">:(before "End Unit Tests")</span> -<span id="L399" class="LineNr">399 </span><span class="Normal">void</span> test_array_length_compound<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> -<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> -<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> -<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> -<span id="L404" class="LineNr">404 </span> reagent x<span class="Delimiter">(</span><span class="Constant">"1:array:address:num"</span><span class="Delimiter">);</span> <span class="Comment">// 3 types, but not a static array</span> -<span id="L405" class="LineNr">405 </span> populate_value<span class="Delimiter">(</span>x<span class="Delimiter">);</span> -<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> +<span id="L399" class="LineNr">399 </span><span class="Normal">void</span> <a href='032array.cc.html#L399'>test_array_length_compound</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L400" class="LineNr">400 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L401" class="LineNr">401 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L402" class="LineNr">402 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L403" class="LineNr">403 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L404" class="LineNr">404 </span> reagent x<span class="Delimiter">(</span><span class="Constant">"1:array:<a href='043space.cc.html#L76'>address</a>:num"</span><span class="Delimiter">);</span> <span class="Comment">// 3 types, but not a static array</span> +<span id="L405" class="LineNr">405 </span> <a href='012transform.cc.html#L90'>populate_value</a><span class="Delimiter">(</span>x<span class="Delimiter">);</span> +<span id="L406" class="LineNr">406 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='032array.cc.html#L386'>array_length</a><span class="Delimiter">(</span>x<span class="Delimiter">),</span> <span class="Constant">3</span><span class="Delimiter">);</span> <span id="L407" class="LineNr">407 </span><span class="Delimiter">}</span> <span id="L408" class="LineNr">408 </span> -<span id="L409" class="LineNr">409 </span><span class="Normal">void</span> test_array_length_static<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L409" class="LineNr">409 </span><span class="Normal">void</span> <a href='032array.cc.html#L409'>test_array_length_static</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L410" class="LineNr">410 </span> reagent x<span class="Delimiter">(</span><span class="Constant">"1:array:num:3"</span><span class="Delimiter">);</span> -<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> +<span id="L411" class="LineNr">411 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='032array.cc.html#L386'>array_length</a><span class="Delimiter">(</span>x<span class="Delimiter">),</span> <span class="Constant">3</span><span class="Delimiter">);</span> <span id="L412" class="LineNr">412 </span><span class="Delimiter">}</span> <span id="L413" class="LineNr">413 </span> <span id="L414" class="LineNr">414 </span><span class="Delimiter">:(scenario index_truncates)</span> -<span id="L415" class="LineNr">415 </span><span class="muRecipe">def</span> main [ +<span id="L415" class="LineNr">415 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L416" class="LineNr">416 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L417" class="LineNr">417 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L418" class="LineNr">418 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -485,7 +485,7 @@ if ('onhashchange' in window) { <span id="L424" class="LineNr">424 </span> <span id="L425" class="LineNr">425 </span><span class="Delimiter">:(scenario index_out_of_bounds)</span> <span id="L426" class="LineNr">426 </span><span class="Special">% Hide_errors = true;</span> -<span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> main [ +<span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L428" class="LineNr">428 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L429" class="LineNr">429 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L430" class="LineNr">430 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -495,11 +495,11 @@ if ('onhashchange' in window) { <span id="L434" class="LineNr">434 </span> <span class="Constant">7</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> <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> <span id="L436" class="LineNr">436 </span>] -<span id="L437" class="LineNr">437 </span><span class="traceContains">+error: main: invalid index 4 in 'index 1:array:num:3, 4'</span> +<span id="L437" class="LineNr">437 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid index 4 in 'index 1:array:num:3, 4'</span> <span id="L438" class="LineNr">438 </span> <span id="L439" class="LineNr">439 </span><span class="Delimiter">:(scenario index_out_of_bounds_2)</span> <span id="L440" class="LineNr">440 </span><span class="Special">% Hide_errors = true;</span> -<span id="L441" class="LineNr">441 </span><span class="muRecipe">def</span> main [ +<span id="L441" class="LineNr">441 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L442" class="LineNr">442 </span> <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L443" class="LineNr">443 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L444" class="LineNr">444 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -509,11 +509,11 @@ if ('onhashchange' in window) { <span id="L448" class="LineNr">448 </span> <span class="Constant">7</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> <span id="L449" class="LineNr">449 </span> index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> -<span class="Constant">1</span> <span id="L450" class="LineNr">450 </span>] -<span id="L451" class="LineNr">451 </span><span class="traceContains">+error: main: invalid index -1 in 'index 1:array:point, -1'</span> +<span id="L451" class="LineNr">451 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid index -1 in 'index 1:array:point, -1'</span> <span id="L452" class="LineNr">452 </span> <span id="L453" class="LineNr">453 </span><span class="Delimiter">:(scenario index_product_type_mismatch)</span> <span id="L454" class="LineNr">454 </span><span class="Special">% Hide_errors = true;</span> -<span id="L455" class="LineNr">455 </span><span class="muRecipe">def</span> main [ +<span id="L455" class="LineNr">455 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L456" class="LineNr">456 </span> <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L457" class="LineNr">457 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L458" class="LineNr">458 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -523,12 +523,12 @@ if ('onhashchange' in window) { <span id="L462" class="LineNr">462 </span> <span class="Constant">7</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> <span id="L463" class="LineNr">463 </span> <span class="Constant">9</span>:num<span class="Special"> <- </span>index <span class="Constant">1</span>:array:point<span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L464" class="LineNr">464 </span>] -<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> +<span id="L465" class="LineNr">465 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'index' on '1:array:point' can't be saved in '9:num'; type should be 'point'</span> <span id="L466" class="LineNr">466 </span> <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> <span id="L468" class="LineNr">468 </span> <span id="L469" class="LineNr">469 </span><span class="Delimiter">:(scenario index_without_product)</span> -<span id="L470" class="LineNr">470 </span><span class="muRecipe">def</span> main [ +<span id="L470" class="LineNr">470 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L471" class="LineNr">471 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L472" class="LineNr">472 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L473" class="LineNr">473 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -540,7 +540,7 @@ if ('onhashchange' in window) { <span id="L479" class="LineNr">479 </span><span class="SalientComment">//:: To write to elements of arrays, use 'put'.</span> <span id="L480" class="LineNr">480 </span> <span id="L481" class="LineNr">481 </span><span class="Delimiter">:(scenario put_index)</span> -<span id="L482" class="LineNr">482 </span><span class="muRecipe">def</span> main [ +<span id="L482" class="LineNr">482 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L483" class="LineNr">483 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L484" class="LineNr">484 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L485" class="LineNr">485 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -552,36 +552,36 @@ if ('onhashchange' in window) { <span id="L491" class="LineNr">491 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L492" class="LineNr">492 </span>PUT_INDEX<span class="Delimiter">,</span> <span id="L493" class="LineNr">493 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L494" class="LineNr">494 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"put-index"</span><span class="Delimiter">,</span> PUT_INDEX<span class="Delimiter">);</span> +<span id="L494" class="LineNr">494 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"put-index"</span><span class="Delimiter">,</span> PUT_INDEX<span class="Delimiter">);</span> <span id="L495" class="LineNr">495 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L496" class="LineNr">496 </span><span class="Normal">case</span> PUT_INDEX: <span class="Delimiter">{</span> -<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> -<span id="L498" class="LineNr">498 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put-index' expects exactly 3 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L497" class="LineNr">497 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L498" class="LineNr">498 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put-index' expects exactly 3 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L499" class="LineNr">499 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L500" class="LineNr">500 </span> <span class="Delimiter">}</span> <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> <span id="L502" class="LineNr">502 </span> <span class="Comment">// Update PUT_INDEX base in Check</span> <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> -<span id="L504" class="LineNr">504 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put-index' on a non-array '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L504" class="LineNr">504 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put-index' on a non-array '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L505" class="LineNr">505 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L506" class="LineNr">506 </span> <span class="Delimiter">}</span> <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> <span id="L508" class="LineNr">508 </span> <span class="Comment">// Update PUT_INDEX index in Check</span> <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> -<span id="L510" class="LineNr">510 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'put-index' should have type 'number', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L510" class="LineNr">510 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'put-index' should have type 'number', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L511" class="LineNr">511 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L512" class="LineNr">512 </span> <span class="Delimiter">}</span> <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> <span id="L514" class="LineNr">514 </span> <span class="Comment">// Update PUT_INDEX value in Check</span> <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> -<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> +<span id="L516" class="LineNr">516 </span> element<span class="Delimiter">.</span>type = <a href='032array.cc.html#L366'>copy_array_element</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <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> -<span id="L518" class="LineNr">518 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put-index "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"' should store "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << value<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L518" class="LineNr">518 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put-index "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"' should store "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << value<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L519" class="LineNr">519 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L520" class="LineNr">520 </span> <span class="Delimiter">}</span> <span id="L521" class="LineNr">521 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// no more checks necessary</span> <span id="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> -<span id="L523" class="LineNr">523 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put-index' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L523" class="LineNr">523 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put-index' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L524" class="LineNr">524 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L525" class="LineNr">525 </span> <span class="Delimiter">}</span> <span id="L526" class="LineNr">526 </span> <span class="Comment">// End PUT_INDEX Product Checks</span> @@ -593,32 +593,32 @@ if ('onhashchange' in window) { <span id="L532" class="LineNr">532 </span> <span class="Comment">// Update PUT_INDEX base in Run</span> <span id="L533" class="LineNr">533 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <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> -<span id="L535" class="LineNr">535 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L535" class="LineNr">535 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L536" class="LineNr">536 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L537" class="LineNr">537 </span> <span class="Delimiter">}</span> <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> <span id="L539" class="LineNr">539 </span> <span class="Comment">// Update PUT_INDEX index in Run</span> <span id="L540" class="LineNr">540 </span> vector<<span class="Normal">double</span>> index_val<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>index<span class="Delimiter">));</span> -<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> < <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> >= get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L542" class="LineNr">542 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"invalid index "</span> << 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> << <span class="Constant">" in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<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> < <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> >= <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L542" class="LineNr">542 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"invalid index "</span> << 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> << <span class="Constant">" in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L543" class="LineNr">543 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L544" class="LineNr">544 </span> <span class="Delimiter">}</span> -<span id="L545" class="LineNr">545 </span> <span class="Normal">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> -<span id="L546" class="LineNr">546 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy to is "</span> << address << end<span class="Delimiter">();</span> +<span id="L545" class="LineNr">545 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = 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><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L546" class="LineNr">546 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy to is "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L547" class="LineNr">547 </span> <span class="Comment">// optimization: directly write the element rather than updating 'product'</span> <span id="L548" class="LineNr">548 </span> <span class="Comment">// and writing the entire array</span> <span id="L549" class="LineNr">549 </span> vector<<span class="Normal">double</span>> 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 id="L550" class="LineNr">550 </span> <span class="Comment">// Write Memory in PUT_INDEX in Run</span> -<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 < SIZE<span class="Delimiter">(</span>value<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L552" class="LineNr">552 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <span class="Constant">" in location "</span> << address+i << end<span class="Delimiter">();</span> -<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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>value<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L552" class="LineNr">552 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <span class="Constant">" in location "</span> << address+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L553" class="LineNr">553 </span> <a href='001help.cc.html#L218'>put</a><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 id="L554" class="LineNr">554 </span> <span class="Delimiter">}</span> <span id="L555" class="LineNr">555 </span> <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span> <span id="L556" class="LineNr">556 </span><span class="Delimiter">}</span> <span id="L557" class="LineNr">557 </span> <span id="L558" class="LineNr">558 </span><span class="Delimiter">:(scenario put_index_out_of_bounds)</span> <span id="L559" class="LineNr">559 </span><span class="Special">% Hide_errors = true;</span> -<span id="L560" class="LineNr">560 </span><span class="muRecipe">def</span> main [ +<span id="L560" class="LineNr">560 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L561" class="LineNr">561 </span> <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L562" class="LineNr">562 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L563" class="LineNr">563 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -629,11 +629,11 @@ if ('onhashchange' in window) { <span id="L568" class="LineNr">568 </span> <span class="Constant">8</span>:point<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L569" class="LineNr">569 </span> <span class="Constant">1</span>:array:point<span class="Special"> <- </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 id="L570" class="LineNr">570 </span>] -<span id="L571" class="LineNr">571 </span><span class="traceContains">+error: main: invalid index 4 in '1:array:point <- put-index 1:array:point, 4, 8:point'</span> +<span id="L571" class="LineNr">571 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid index 4 in '1:array:point <- put-index 1:array:point, 4, 8:point'</span> <span id="L572" class="LineNr">572 </span> <span id="L573" class="LineNr">573 </span><span class="Delimiter">:(scenario put_index_out_of_bounds_2)</span> <span id="L574" class="LineNr">574 </span><span class="Special">% Hide_errors = true;</span> -<span id="L575" class="LineNr">575 </span><span class="muRecipe">def</span> main [ +<span id="L575" class="LineNr">575 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L576" class="LineNr">576 </span> <span class="Constant">1</span>:array:point:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L577" class="LineNr">577 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L578" class="LineNr">578 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -644,22 +644,22 @@ if ('onhashchange' in window) { <span id="L583" class="LineNr">583 </span> <span class="Constant">8</span>:point<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L584" class="LineNr">584 </span> <span class="Constant">1</span>:array:point<span class="Special"> <- </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 id="L585" class="LineNr">585 </span>] -<span id="L586" class="LineNr">586 </span><span class="traceContains">+error: main: invalid index -1 in '1:array:point <- put-index 1:array:point, -1, 8:point'</span> +<span id="L586" class="LineNr">586 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid index -1 in '1:array:point <- put-index 1:array:point, -1, 8:point'</span> <span id="L587" class="LineNr">587 </span> <span id="L588" class="LineNr">588 </span><span class="Delimiter">:(scenario put_index_product_error)</span> <span id="L589" class="LineNr">589 </span><span class="Special">% Hide_errors = true;</span> -<span id="L590" class="LineNr">590 </span><span class="muRecipe">def</span> main [ +<span id="L590" class="LineNr">590 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L591" class="LineNr">591 </span> local-scope <span id="L592" class="LineNr">592 </span> load-ingredients <span id="L593" class="LineNr">593 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L594" class="LineNr">594 </span> <span class="Constant">4</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </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 id="L595" class="LineNr">595 </span>] -<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> +<span id="L596" class="LineNr">596 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'put-index' must be first ingredient '1:array:num:3', but got '4:array:num:3'</span> <span id="L597" class="LineNr">597 </span> <span id="L598" class="LineNr">598 </span><span class="SalientComment">//:: compute the length of an array</span> <span id="L599" class="LineNr">599 </span> <span id="L600" class="LineNr">600 </span><span class="Delimiter">:(scenario array_length)</span> -<span id="L601" class="LineNr">601 </span><span class="muRecipe">def</span> main [ +<span id="L601" class="LineNr">601 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L602" class="LineNr">602 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L603" class="LineNr">603 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L604" class="LineNr">604 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> @@ -671,17 +671,17 @@ if ('onhashchange' in window) { <span id="L610" class="LineNr">610 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L611" class="LineNr">611 </span>LENGTH<span class="Delimiter">,</span> <span id="L612" class="LineNr">612 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L613" class="LineNr">613 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"length"</span><span class="Delimiter">,</span> LENGTH<span class="Delimiter">);</span> +<span id="L613" class="LineNr">613 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"length"</span><span class="Delimiter">,</span> LENGTH<span class="Delimiter">);</span> <span id="L614" class="LineNr">614 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L615" class="LineNr">615 </span><span class="Normal">case</span> LENGTH: <span class="Delimiter">{</span> -<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> -<span id="L617" class="LineNr">617 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'length' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L616" class="LineNr">616 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L617" class="LineNr">617 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'length' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L618" class="LineNr">618 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L619" class="LineNr">619 </span> <span class="Delimiter">}</span> <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> <span id="L621" class="LineNr">621 </span> <span class="Comment">// Update LENGTH array in Check</span> <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> -<span id="L623" class="LineNr">623 </span> raise << <span class="Constant">"tried to calculate length of non-array '"</span> << array<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L623" class="LineNr">623 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"tried to calculate length of non-array '"</span> << array<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L624" class="LineNr">624 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L625" class="LineNr">625 </span> <span class="Delimiter">}</span> <span id="L626" class="LineNr">626 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -691,18 +691,18 @@ if ('onhashchange' in window) { <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> <span id="L631" class="LineNr">631 </span> <span class="Comment">// Update LENGTH array in Run</span> <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> -<span id="L633" class="LineNr">633 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L633" class="LineNr">633 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L634" class="LineNr">634 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L635" class="LineNr">635 </span> <span class="Delimiter">}</span> <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> -<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> +<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><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> array<span class="Delimiter">.</span>value<span class="Delimiter">));</span> <span id="L638" class="LineNr">638 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L639" class="LineNr">639 </span><span class="Delimiter">}</span> <span id="L640" class="LineNr">640 </span> <span id="L641" class="LineNr">641 </span><span class="Comment">//: optimization: none of the instructions in this layer use 'ingredients' so</span> <span id="L642" class="LineNr">642 </span><span class="Comment">//: stop copying potentially huge arrays into it.</span> <span id="L643" class="LineNr">643 </span><span class="Delimiter">:(before "End should_copy_ingredients Special-cases")</span> -<span id="L644" class="LineNr">644 </span>recipe_ordinal r = current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">;</span> +<span id="L644" class="LineNr">644 </span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r = current_instruction<span class="Delimiter">().</span>operation<span class="Delimiter">;</span> <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> <span id="L646" class="LineNr">646 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> </pre> diff --git a/html/033exclusive_container.cc.html b/html/033exclusive_container.cc.html index 5f32f852..3ee83490 100644 --- a/html/033exclusive_container.cc.html +++ b/html/033exclusive_container.cc.html @@ -68,9 +68,9 @@ if ('onhashchange' in window) { <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> <span id="L8" class="LineNr"> 8 </span><span class="Comment">//: We'll use this container as a running example, with two number elements.</span> <span id="L9" class="LineNr"> 9 </span><span class="Delimiter">{</span> -<span id="L10" class="LineNr"> 10 </span>type_ordinal tmp = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"number-or-point"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<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> -<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> +<span id="L10" class="LineNr"> 10 </span><a href='010vm.cc.html#L124'>type_ordinal</a> tmp = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"number-or-point"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L11" class="LineNr"> 11 </span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> <span class="Comment">// initialize</span> +<span id="L12" class="LineNr"> 12 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> tmp<span class="Delimiter">).</span>kind = <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">;</span> <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">"number-or-point"</span><span class="Delimiter">;</span> <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">"i:number"</span><span class="Delimiter">));</span> <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">"p:point"</span><span class="Delimiter">));</span> @@ -81,7 +81,7 @@ if ('onhashchange' in window) { <span id="L20" class="LineNr"> 20 </span><span class="Comment">//: checks in future layers from flagging them.</span> <span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(scenario copy_exclusive_container)</span> <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> -<span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> main [ +<span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L24" class="LineNr"> 24 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span class="Comment"># 'point' variant</span> <span id="L25" class="LineNr"> 25 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L26" class="LineNr"> 26 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> @@ -92,22 +92,22 @@ if ('onhashchange' in window) { <span id="L31" class="LineNr"> 31 </span><span class="traceContains">+mem: storing 35 in location 6</span> <span id="L32" class="LineNr"> 32 </span> <span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(before "End size_of(type) Special-cases")</span> -<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> +<span id="L34" class="LineNr"> 34 </span><span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L35" class="LineNr"> 35 </span> <span class="Comment">// Compute size_of Exclusive Container</span> <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> <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">}</span> <span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(before "End compute_container_sizes Atom Special-cases")</span> -<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> -<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> +<span id="L39" class="LineNr"> 39 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L40" class="LineNr"> 40 </span> <a href='033exclusive_container.cc.html#L44'>compute_exclusive_container_sizes</a><span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">}</span> <span id="L42" class="LineNr"> 42 </span> <span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(code)</span> -<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& exclusive_container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set<type_tree>& pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L44" class="LineNr"> 44 </span><span class="Normal">void</span> <a href='033exclusive_container.cc.html#L44'>compute_exclusive_container_sizes</a><span class="Delimiter">(</span><span class="Normal">const</span> type_info& exclusive_container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set<type_tree>& pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L45" class="LineNr"> 45 </span> <span class="Comment">// size of an exclusive container is the size of its largest variant</span> <span id="L46" class="LineNr"> 46 </span> <span class="Comment">// (So, like containers, it can only contain arrays if they're static and</span> <span id="L47" class="LineNr"> 47 </span> <span class="Comment">// include their length in the type.)</span> <span id="L48" class="LineNr"> 48 </span> container_metadata metadata<span class="Delimiter">;</span> -<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 < 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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> <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> <span id="L51" class="LineNr"> 51 </span> <span class="Comment">// Compute Exclusive Container Size(element, full_type)</span> <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> @@ -127,10 +127,10 @@ if ('onhashchange' in window) { <span id="L66" class="LineNr"> 66 </span><span class="Comment">//: 'maybe-convert' requires a literal in ingredient 1. We'll use a synonym</span> <span id="L67" class="LineNr"> 67 </span><span class="Comment">//: called 'variant'.</span> <span id="L68" class="LineNr"> 68 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L69" class="LineNr"> 69 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"variant"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L69" class="LineNr"> 69 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"variant"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L70" class="LineNr"> 70 </span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario maybe_convert)</span> -<span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [ +<span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L73" class="LineNr"> 73 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L74" class="LineNr"> 74 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L75" class="LineNr"> 75 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -143,7 +143,7 @@ if ('onhashchange' in window) { <span id="L82" class="LineNr"> 82 </span><span class="traceContains">+mem: storing 36 in location 21</span> <span id="L83" class="LineNr"> 83 </span> <span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(scenario maybe_convert_fail)</span> -<span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> main [ +<span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L86" class="LineNr"> 86 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L87" class="LineNr"> 87 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L88" class="LineNr"> 88 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -156,52 +156,52 @@ if ('onhashchange' in window) { <span id="L95" class="LineNr"> 95 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L96" class="LineNr"> 96 </span>MAYBE_CONVERT<span class="Delimiter">,</span> <span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L98" class="LineNr"> 98 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"maybe-convert"</span><span class="Delimiter">,</span> MAYBE_CONVERT<span class="Delimiter">);</span> +<span id="L98" class="LineNr"> 98 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"maybe-convert"</span><span class="Delimiter">,</span> MAYBE_CONVERT<span class="Delimiter">);</span> <span id="L99" class="LineNr"> 99 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L100" class="LineNr">100 </span><span class="Normal">case</span> MAYBE_CONVERT: <span class="Delimiter">{</span> <span id="L101" class="LineNr">101 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<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> -<span id="L103" class="LineNr">103 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'maybe-convert' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L102" class="LineNr">102 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L103" class="LineNr">103 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'maybe-convert' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L104" class="LineNr">104 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span> <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> <span id="L107" class="LineNr">107 </span> <span class="Comment">// Update MAYBE_CONVERT base in Check</span> <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> -<span id="L109" class="LineNr">109 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'maybe-convert' should be an exclusive-container, but got '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L109" class="LineNr">109 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'maybe-convert' should be an exclusive-container, but got '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L110" class="LineNr">110 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L111" class="LineNr">111 </span> <span class="Delimiter">}</span> <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> <span id="L113" class="LineNr">113 </span> <span class="Comment">// Update MAYBE_CONVERT base_type in Check</span> -<span id="L114" class="LineNr">114 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L115" class="LineNr">115 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'maybe-convert' should be an exclusive-container, but got '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L115" class="LineNr">115 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'maybe-convert' should be an exclusive-container, but got '"</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L116" class="LineNr">116 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L117" class="LineNr">117 </span> <span class="Delimiter">}</span> <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> -<span id="L119" class="LineNr">119 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'maybe-convert' should have type 'variant', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'maybe-convert' should have type 'variant', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L120" class="LineNr">120 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L121" class="LineNr">121 </span> <span class="Delimiter">}</span> <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> -<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> -<span id="L124" class="LineNr">124 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'maybe-convert' expects exactly 2 products in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L123" class="LineNr">123 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L124" class="LineNr">124 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'maybe-convert' expects exactly 2 products in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L125" class="LineNr">125 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L126" class="LineNr">126 </span> <span class="Delimiter">}</span> <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> <span id="L128" class="LineNr">128 </span> <span class="Comment">// Update MAYBE_CONVERT product in Check</span> <span id="L129" class="LineNr">129 </span> reagent& offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> -<span id="L130" class="LineNr">130 </span> populate_value<span class="Delimiter">(</span>offset<span class="Delimiter">);</span> -<span id="L131" class="LineNr">131 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset<span class="Delimiter">.</span>value >= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L132" class="LineNr">132 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid tag "</span> << offset<span class="Delimiter">.</span>value << <span class="Constant">" in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L130" class="LineNr">130 </span> <a href='012transform.cc.html#L90'>populate_value</a><span class="Delimiter">(</span>offset<span class="Delimiter">);</span> +<span id="L131" class="LineNr">131 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset<span class="Delimiter">.</span>value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L132" class="LineNr">132 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid tag "</span> << offset<span class="Delimiter">.</span>value << <span class="Constant">" in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span id="L133" class="LineNr">133 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L134" class="LineNr">134 </span> <span class="Delimiter">}</span> <span id="L135" class="LineNr">135 </span> <span class="Normal">const</span> reagent& variant = variant_type<span class="Delimiter">(</span>base<span class="Delimiter">,</span> offset<span class="Delimiter">.</span>value<span class="Delimiter">);</span> <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> -<span id="L137" class="LineNr">137 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'maybe-convert "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"' should write to "</span> << to_string<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << to_string<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L137" class="LineNr">137 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'maybe-convert "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"' should write to "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L138" class="LineNr">138 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L139" class="LineNr">139 </span> <span class="Delimiter">}</span> <span id="L140" class="LineNr">140 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> 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 id="L141" class="LineNr">141 </span> <span class="Comment">// Update MAYBE_CONVERT status in Check</span> <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> -<span id="L143" class="LineNr">143 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second product yielded by 'maybe-convert' should be a boolean, but tried to write to '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L143" class="LineNr">143 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second product yielded by 'maybe-convert' should be a boolean, but tried to write to '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L144" class="LineNr">144 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span> <span id="L146" class="LineNr">146 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -212,7 +212,7 @@ if ('onhashchange' in window) { <span id="L151" class="LineNr">151 </span> <span class="Comment">// Update MAYBE_CONVERT base in Run</span> <span id="L152" class="LineNr">152 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <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> -<span id="L154" class="LineNr">154 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L154" class="LineNr">154 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L155" class="LineNr">155 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L156" class="LineNr">156 </span> <span class="Delimiter">}</span> <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> @@ -221,22 +221,22 @@ if ('onhashchange' in window) { <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> <span id="L161" class="LineNr">161 </span> <span class="Comment">// Update MAYBE_CONVERT status in Run</span> <span id="L162" class="LineNr">162 </span> <span class="Comment">// optimization: directly write results to only update first product when necessary</span> -<span id="L163" class="LineNr">163 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>tag == <span class="Normal">static_cast</span><<span class="Normal">int</span>><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 id="L163" class="LineNr">163 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>tag == <span class="Normal">static_cast</span><<span class="Normal">int</span>><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base_address<span class="Delimiter">)))</span> <span class="Delimiter">{</span> <span id="L164" class="LineNr">164 </span> <span class="Normal">const</span> reagent& variant = variant_type<span class="Delimiter">(</span>base<span class="Delimiter">,</span> tag<span class="Delimiter">);</span> -<span id="L165" class="LineNr">165 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 1 in location "</span> << status<span class="Delimiter">.</span>value << end<span class="Delimiter">();</span> -<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> +<span id="L165" class="LineNr">165 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 1 in location "</span> << status<span class="Delimiter">.</span>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L166" class="LineNr">166 </span> <a href='001help.cc.html#L218'>put</a><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 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> <span id="L168" class="LineNr">168 </span> <span class="Comment">// Write Memory in Successful MAYBE_CONVERT in Run</span> <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 < size_of<span class="Delimiter">(</span>variant<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<span id="L171" class="LineNr">171 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << product<span class="Delimiter">.</span>value+i << end<span class="Delimiter">();</span> -<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> +<span id="L170" class="LineNr">170 </span> <span class="Normal">double</span> val = <a href='001help.cc.html#L225'>get_or_insert</a><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> +<span id="L171" class="LineNr">171 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << no_scientific<span class="Delimiter">(</span>val<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << product<span class="Delimiter">.</span>value+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L172" class="LineNr">172 </span> <a href='001help.cc.html#L218'>put</a><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 id="L173" class="LineNr">173 </span> <span class="Delimiter">}</span> <span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span> <span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span> <span id="L176" class="LineNr">176 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L177" class="LineNr">177 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 0 in location "</span> << status<span class="Delimiter">.</span>value << end<span class="Delimiter">();</span> -<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> +<span id="L177" class="LineNr">177 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 0 in location "</span> << status<span class="Delimiter">.</span>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L178" class="LineNr">178 </span> <a href='001help.cc.html#L218'>put</a><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 id="L179" class="LineNr">179 </span> <span class="Delimiter">}</span> <span id="L180" class="LineNr">180 </span> <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span> <span id="L181" class="LineNr">181 </span><span class="Delimiter">}</span> @@ -252,7 +252,7 @@ if ('onhashchange' in window) { <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">-></span>value<span class="Delimiter">));</span> <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">-></span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L193" class="LineNr">193 </span> <span class="Normal">const</span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L194" class="LineNr">194 </span> assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">);</span> +<span id="L194" class="LineNr">194 </span> assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">);</span> <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> <span id="L196" class="LineNr">196 </span> <span class="Comment">// End variant_type Special-cases</span> <span id="L197" class="LineNr">197 </span> <span class="Identifier">return</span> element<span class="Delimiter">;</span> @@ -260,16 +260,16 @@ if ('onhashchange' in window) { <span id="L199" class="LineNr">199 </span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario maybe_convert_product_type_mismatch)</span> <span id="L201" class="LineNr">201 </span><span class="Special">% Hide_errors = true;</span> -<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> main [ +<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L203" class="LineNr">203 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L204" class="LineNr">204 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L205" class="LineNr">205 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> <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"> <- </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 id="L207" class="LineNr">207 </span>] -<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> +<span id="L208" class="LineNr">208 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'maybe-convert 12:number-or-point/unsafe, 1:variant' should write to point but '20' has type number</span> <span id="L209" class="LineNr">209 </span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(scenario maybe_convert_dummy_product)</span> -<span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> main [ +<span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L212" class="LineNr">212 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L213" class="LineNr">213 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L214" class="LineNr">214 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -290,7 +290,7 @@ if ('onhashchange' in window) { <span id="L229" class="LineNr">229 </span> <span id="L230" class="LineNr">230 </span><span class="Delimiter">:(before "End Command Handlers")</span> <span id="L231" class="LineNr">231 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"exclusive-container"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L232" class="LineNr">232 </span> insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> EXCLUSIVE_CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span> +<span id="L232" class="LineNr">232 </span> <a href='030container.cc.html#L662'>insert_container</a><span class="Delimiter">(</span>command<span class="Delimiter">,</span> <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">,</span> in<span class="Delimiter">);</span> <span id="L233" class="LineNr">233 </span><span class="Delimiter">}</span> <span id="L234" class="LineNr">234 </span> <span id="L235" class="LineNr">235 </span><span class="Comment">//: arrays are disallowed inside exclusive containers unless their length is</span> @@ -315,7 +315,7 @@ if ('onhashchange' in window) { <span id="L254" class="LineNr">254 </span> <span class="Normal">x</span>:num <span id="L255" class="LineNr">255 </span> <span class="Normal">y</span>:num <span id="L256" class="LineNr">256 </span>] -<span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> main [ +<span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L258" class="LineNr">258 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L259" class="LineNr">259 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </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 id="L260" class="LineNr">260 </span> <span class="Constant">4</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:num @@ -335,7 +335,7 @@ if ('onhashchange' in window) { <span id="L274" class="LineNr">274 </span><span class="muData">container</span> bar [ <span id="L275" class="LineNr">275 </span> <span class="Normal">z</span>:num <span id="L276" class="LineNr">276 </span>] -<span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> main [ +<span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L278" class="LineNr">278 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L279" class="LineNr">279 </span>] <span id="L280" class="LineNr">280 </span><span class="traceContains">+mem: storing 0 in location 1</span> @@ -351,11 +351,11 @@ if ('onhashchange' in window) { <span id="L290" class="LineNr">290 </span><span class="muData">container</span> bar [ <span id="L291" class="LineNr">291 </span> <span class="Normal">z</span>:num <span id="L292" class="LineNr">292 </span>] -<span id="L293" class="LineNr">293 </span><span class="muRecipe">def</span> main [ +<span id="L293" class="LineNr">293 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L294" class="LineNr">294 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L295" class="LineNr">295 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L296" class="LineNr">296 </span>] -<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 <- merge 1:num, 34'</span> +<span id="L297" class="LineNr">297 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: ingredient 0 of 'merge' should be a literal, for the tag of exclusive-container 'foo' in '2:foo <- merge 1:num, 34'</span> <span id="L298" class="LineNr">298 </span> <span id="L299" class="LineNr">299 </span><span class="Delimiter">:(scenario merge_handles_exclusive_container_inside_exclusive_container)</span> <span id="L300" class="LineNr">300 </span><span class="muData">exclusive-container</span> foo [ @@ -366,7 +366,7 @@ if ('onhashchange' in window) { <span id="L305" class="LineNr">305 </span> <span class="Normal">a</span>:num <span id="L306" class="LineNr">306 </span> <span class="Normal">b</span>:num <span id="L307" class="LineNr">307 </span>] -<span id="L308" class="LineNr">308 </span><span class="muRecipe">def</span> main [ +<span id="L308" class="LineNr">308 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L309" class="LineNr">309 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L310" class="LineNr">310 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L311" class="LineNr">311 </span> <span class="Constant">4</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">2</span>:bar @@ -375,25 +375,25 @@ if ('onhashchange' in window) { <span id="L314" class="LineNr">314 </span><span class="traceContains">+mem: storing 34 in location 6</span> <span id="L315" class="LineNr">315 </span>$error: <span class="Constant">0</span> <span id="L316" class="LineNr">316 </span> -<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before "End check_merge_call Special-cases")</span> -<span id="L318" class="LineNr">318 </span><span class="Normal">case</span> EXCLUSIVE_CONTAINER: <span class="Delimiter">{</span> +<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before "End <a href='031merge.cc.html#L142'>check_merge_call</a> Special-cases")</span> +<span id="L318" class="LineNr">318 </span><span class="Normal">case</span> <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a>: <span class="Delimiter">{</span> <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> -<span id="L320" class="LineNr">320 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking exclusive container "</span> << to_string<span class="Delimiter">(</span>container<span class="Delimiter">)</span> << <span class="Constant">" vs ingredient "</span> << ingredient_index << end<span class="Delimiter">();</span> +<span id="L320" class="LineNr">320 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking exclusive container "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>container<span class="Delimiter">)</span> << <span class="Constant">" vs ingredient "</span> << ingredient_index << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L321" class="LineNr">321 </span> <span class="Comment">// easy case: exact match</span> <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> <span id="L323" class="LineNr">323 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <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> -<span id="L325" class="LineNr">325 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient "</span> << ingredient_index << <span class="Constant">" of 'merge' should be a literal, for the tag of exclusive-container '"</span> << container_info<span class="Delimiter">.</span>name << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L325" class="LineNr">325 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient "</span> << ingredient_index << <span class="Constant">" of 'merge' should be a literal, for the tag of exclusive-container '"</span> << container_info<span class="Delimiter">.</span>name << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L326" class="LineNr">326 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L327" class="LineNr">327 </span> <span class="Delimiter">}</span> <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> -<span id="L329" class="LineNr">329 </span> populate_value<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span> -<span id="L330" class="LineNr">330 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient<span class="Delimiter">.</span>value >= SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L331" class="LineNr">331 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid tag at "</span> << ingredient_index << <span class="Constant">" for '"</span> << container_info<span class="Delimiter">.</span>name << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L329" class="LineNr">329 </span> <a href='012transform.cc.html#L90'>populate_value</a><span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span> +<span id="L330" class="LineNr">330 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient<span class="Delimiter">.</span>value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L331" class="LineNr">331 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid tag at "</span> << ingredient_index << <span class="Constant">" for '"</span> << container_info<span class="Delimiter">.</span>name << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L332" class="LineNr">332 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L333" class="LineNr">333 </span> <span class="Delimiter">}</span> <span id="L334" class="LineNr">334 </span> <span class="Normal">const</span> reagent& variant = variant_type<span class="Delimiter">(</span>container<span class="Delimiter">,</span> ingredient<span class="Delimiter">.</span>value<span class="Delimiter">);</span> -<span id="L335" class="LineNr">335 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"tag: "</span> << ingredient<span class="Delimiter">.</span>value << end<span class="Delimiter">();</span> +<span id="L335" class="LineNr">335 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"tag: "</span> << ingredient<span class="Delimiter">.</span>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L336" class="LineNr">336 </span> <span class="Comment">// replace union with its variant</span> <span id="L337" class="LineNr">337 </span> state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>pop<span class="Delimiter">();</span> <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> @@ -410,7 +410,7 @@ if ('onhashchange' in window) { <span id="L349" class="LineNr">349 </span> <span class="Normal">x</span>:num <span id="L350" class="LineNr">350 </span> <span class="Normal">y</span>:num <span id="L351" class="LineNr">351 </span>] -<span id="L352" class="LineNr">352 </span><span class="muRecipe">def</span> main [ +<span id="L352" class="LineNr">352 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L353" class="LineNr">353 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </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 id="L354" class="LineNr">354 </span>] <span id="L355" class="LineNr">355 </span><span class="traceContains">+mem: storing 23 in location 1</span> @@ -428,10 +428,10 @@ if ('onhashchange' in window) { <span id="L367" class="LineNr">367 </span> <span class="Normal">x</span>:num <span id="L368" class="LineNr">368 </span> <span class="Normal">y</span>:num <span id="L369" class="LineNr">369 </span>] -<span id="L370" class="LineNr">370 </span><span class="muRecipe">def</span> main [ +<span id="L370" class="LineNr">370 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L371" class="LineNr">371 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </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 id="L372" class="LineNr">372 </span>] -<span id="L373" class="LineNr">373 </span><span class="traceContains">+error: main: too many ingredients in '1:foo <- merge 23, 1/y, 34, 35'</span> +<span id="L373" class="LineNr">373 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too many ingredients in '1:foo <- merge 23, 1/y, 34, 35'</span> <span id="L374" class="LineNr">374 </span> <span id="L375" class="LineNr">375 </span><span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container)</span> <span id="L376" class="LineNr">376 </span><span class="muData">exclusive-container</span> foo [ @@ -442,7 +442,7 @@ if ('onhashchange' in window) { <span id="L381" class="LineNr">381 </span> <span class="Normal">x</span>:num <span id="L382" class="LineNr">382 </span> <span class="Normal">y</span>:num <span id="L383" class="LineNr">383 </span>] -<span id="L384" class="LineNr">384 </span><span class="muRecipe">def</span> main [ +<span id="L384" class="LineNr">384 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L385" class="LineNr">385 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </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 id="L386" class="LineNr">386 </span>] <span id="L387" class="LineNr">387 </span><span class="traceContains">+mem: storing 1 in location 1</span> @@ -459,7 +459,7 @@ if ('onhashchange' in window) { <span id="L398" class="LineNr">398 </span> <span class="Normal">x</span>:num <span id="L399" class="LineNr">399 </span> <span class="Normal">y</span>:num <span id="L400" class="LineNr">400 </span>] -<span id="L401" class="LineNr">401 </span><span class="muRecipe">def</span> main [ +<span id="L401" class="LineNr">401 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L402" class="LineNr">402 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">23</span> <span id="L403" class="LineNr">403 </span>] <span id="L404" class="LineNr">404 </span>$error: <span class="Constant">0</span> @@ -474,10 +474,10 @@ if ('onhashchange' in window) { <span id="L413" class="LineNr">413 </span> <span class="Normal">x</span>:num <span id="L414" class="LineNr">414 </span> <span class="Normal">y</span>:num <span id="L415" class="LineNr">415 </span>] -<span id="L416" class="LineNr">416 </span><span class="muRecipe">def</span> main [ +<span id="L416" class="LineNr">416 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L417" class="LineNr">417 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span> <span id="L418" class="LineNr">418 </span>] -<span id="L419" class="LineNr">419 </span><span class="traceContains">+error: main: too few ingredients in '1:foo <- merge 1/y, 23'</span> +<span id="L419" class="LineNr">419 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too few ingredients in '1:foo <- merge 1/y, 23'</span> <span id="L420" class="LineNr">420 </span> <span id="L421" class="LineNr">421 </span><span class="Delimiter">:(scenario merge_check_exclusive_container_containing_container_4)</span> <span id="L422" class="LineNr">422 </span><span class="muData">exclusive-container</span> foo [ @@ -488,7 +488,7 @@ if ('onhashchange' in window) { <span id="L427" class="LineNr">427 </span> <span class="Normal">a</span>:num <span id="L428" class="LineNr">428 </span> <span class="Normal">b</span>:num <span id="L429" class="LineNr">429 </span>] -<span id="L430" class="LineNr">430 </span><span class="muRecipe">def</span> main [ +<span id="L430" class="LineNr">430 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L431" class="LineNr">431 </span> <span class="Constant">1</span>:bar<span class="Special"> <- </span>merge <span class="Constant">23</span><span class="Delimiter">,</span> <span class="Constant">24</span> <span id="L432" class="LineNr">432 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">1</span>:bar <span id="L433" class="LineNr">433 </span>] @@ -497,7 +497,7 @@ if ('onhashchange' in window) { <span id="L436" class="LineNr">436 </span><span class="Comment">//: Since the different variants of an exclusive-container might have</span> <span id="L437" class="LineNr">437 </span><span class="Comment">//: different sizes, relax the size mismatch check for 'merge' instructions.</span> <span id="L438" class="LineNr">438 </span><span class="Delimiter">:(before "End size_mismatch(x) Special-cases")</span> -<span id="L439" class="LineNr">439 </span><span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> < SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>steps<span class="Delimiter">())</span> +<span id="L439" class="LineNr">439 </span><span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>steps<span class="Delimiter">())</span> <span id="L440" class="LineNr">440 </span> && current_instruction<span class="Delimiter">().</span>operation == MERGE <span id="L441" class="LineNr">441 </span> && !current_instruction<span class="Delimiter">().</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> <span id="L442" class="LineNr">442 </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>type<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -505,8 +505,8 @@ if ('onhashchange' in window) { <span id="L444" class="LineNr">444 </span> <span class="Comment">// Update size_mismatch Check for MERGE(x)</span> <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">-></span>atom ? x<span class="Delimiter">.</span>type : x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">;</span> <span id="L446" class="LineNr">446 </span> assert<span class="Delimiter">(</span>root_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<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">-></span>value<span class="Delimiter">).</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">)</span> -<span id="L448" class="LineNr">448 </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 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">-></span>value<span class="Delimiter">).</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> +<span id="L448" class="LineNr">448 </span> <span class="Identifier">return</span> size_of<span class="Delimiter">(</span>x<span class="Delimiter">)</span> < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>data<span class="Delimiter">);</span> <span id="L449" class="LineNr">449 </span><span class="Delimiter">}</span> <span id="L450" class="LineNr">450 </span> <span id="L451" class="LineNr">451 </span><span class="Delimiter">:(scenario merge_exclusive_container_with_mismatched_sizes)</span> @@ -518,7 +518,7 @@ if ('onhashchange' in window) { <span id="L457" class="LineNr">457 </span> <span class="Normal">x</span>:num <span id="L458" class="LineNr">458 </span> <span class="Normal">y</span>:foo <span id="L459" class="LineNr">459 </span>] -<span id="L460" class="LineNr">460 </span><span class="muRecipe">def</span> main [ +<span id="L460" class="LineNr">460 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L461" class="LineNr">461 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L462" class="LineNr">462 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L463" class="LineNr">463 </span> <span class="Constant">3</span>:bar<span class="Special"> <- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:num diff --git a/html/034address.cc.html b/html/034address.cc.html index 98475a13..b98e8286 100644 --- a/html/034address.cc.html +++ b/html/034address.cc.html @@ -182,19 +182,19 @@ if ('onhashchange' in window) { <span id="L122" class="LineNr">122 </span><span class="Delimiter">:(scenario new)</span> <span id="L123" class="LineNr">123 </span><span class="Comment"># call 'new' two times with identical types without modifying the results; you</span> <span id="L124" class="LineNr">124 </span><span class="Comment"># should get back different results</span> -<span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> main [ -<span id="L126" class="LineNr">126 </span> <span class="Constant">1</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L127" class="LineNr">127 </span> <span class="Constant">2</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L128" class="LineNr">128 </span> <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw <- </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 id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L126" class="LineNr">126 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L127" class="LineNr">127 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L128" class="LineNr">128 </span> <span class="Constant">3</span>:<span class="Normal">bool</span>/<span class="Special">raw <- </span>equal <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw</span> <span id="L129" class="LineNr">129 </span>] <span id="L130" class="LineNr">130 </span><span class="traceContains">+mem: storing 0 in location 3</span> <span id="L131" class="LineNr">131 </span> <span id="L132" class="LineNr">132 </span><span class="Delimiter">:(scenario new_array)</span> <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> -<span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> main [ -<span id="L135" class="LineNr">135 </span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span> -<span id="L136" class="LineNr">136 </span> <span class="Constant">2</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L137" class="LineNr">137 </span> <span class="Constant">3</span>:num/<span class="Special">raw <- </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 id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L135" class="LineNr">135 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span> +<span id="L136" class="LineNr">136 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L137" class="LineNr">137 </span> <span class="Constant">3</span>:num/<span class="Special">raw <- </span>subtract <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/<span class="Special">raw</span> <span id="L138" class="LineNr">138 </span>] <span id="L139" class="LineNr">139 </span><span class="traceContains">+run: {1: ("address" "array" "number"), "raw": ()} <- new {number: "type"}, {5: "literal"}</span> <span id="L140" class="LineNr">140 </span><span class="traceContains">+mem: array length is 5</span> @@ -202,14 +202,14 @@ if ('onhashchange' in window) { <span id="L142" class="LineNr">142 </span><span class="traceContains">+mem: storing 7 in location 3</span> <span id="L143" class="LineNr">143 </span> <span id="L144" class="LineNr">144 </span><span class="Delimiter">:(scenario dilated_reagent_with_new)</span> -<span id="L145" class="LineNr">145 </span><span class="muRecipe">def</span> main [ -<span id="L146" class="LineNr">146 </span> <span class="Constant">1</span>:address:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>address number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> +<span id="L145" class="LineNr">145 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L146" class="LineNr">146 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> <span id="L147" class="LineNr">147 </span>] <span id="L148" class="LineNr">148 </span><span class="traceContains">+new: size of '(address number)' is 1</span> <span id="L149" class="LineNr">149 </span> <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> <span id="L151" class="LineNr">151 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L152" class="LineNr">152 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"type"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L152" class="LineNr">152 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"type"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L153" class="LineNr">153 </span><span class="Delimiter">:(code)</span> <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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L155" class="LineNr">155 </span> <span class="Identifier">return</span> is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> && r<span class="Delimiter">.</span>type && r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name == <span class="Constant">"type"</span><span class="Delimiter">;</span> @@ -218,30 +218,30 @@ if ('onhashchange' in window) { <span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L159" class="LineNr">159 </span>NEW<span class="Delimiter">,</span> <span id="L160" class="LineNr">160 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L161" class="LineNr">161 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">,</span> NEW<span class="Delimiter">);</span> +<span id="L161" class="LineNr">161 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">,</span> NEW<span class="Delimiter">);</span> <span id="L162" class="LineNr">162 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L163" class="LineNr">163 </span><span class="Normal">case</span> NEW: <span class="Delimiter">{</span> <span id="L164" class="LineNr">164 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<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> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L166" class="LineNr">166 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'new' requires one or two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<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> || <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L166" class="LineNr">166 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'new' requires one or two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L167" class="LineNr">167 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L168" class="LineNr">168 </span> <span class="Delimiter">}</span> <span id="L169" class="LineNr">169 </span> <span class="Comment">// End NEW Check Special-cases</span> <span id="L170" class="LineNr">170 </span> <span class="Normal">const</span> reagent& 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 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> -<span id="L172" class="LineNr">172 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'new' should be a type, but got '"</span> << type<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L172" class="LineNr">172 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'new' should be a type, but got '"</span> << type<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L173" class="LineNr">173 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</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> -<span id="L176" class="LineNr">176 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'new' should be a number (array length), but got '"</span> << type<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L175" class="LineNr">175 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</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> +<span id="L176" class="LineNr">176 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'new' should be a number (array length), but got '"</span> << type<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L177" class="LineNr">177 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L178" class="LineNr">178 </span> <span class="Delimiter">}</span> <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> -<span id="L180" class="LineNr">180 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"result of 'new' should never be ignored</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L180" class="LineNr">180 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"result of 'new' should never be ignored</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L181" class="LineNr">181 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L182" class="LineNr">182 </span> <span class="Delimiter">}</span> <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> -<span id="L184" class="LineNr">184 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'new' has incorrect type: '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L184" class="LineNr">184 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'new' has incorrect type: '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L185" class="LineNr">185 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L186" class="LineNr">186 </span> <span class="Delimiter">}</span> <span id="L187" class="LineNr">187 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -253,21 +253,21 @@ if ('onhashchange' in window) { <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">-></span>atom || product<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">))</span> <span id="L194" class="LineNr">194 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L195" class="LineNr">195 </span> drop_from_type<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">);</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L196" class="LineNr">196 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L197" class="LineNr">197 </span> <span class="Comment">// array allocation</span> <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">-></span>atom || product<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">))</span> <span id="L199" class="LineNr">199 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L200" class="LineNr">200 </span> drop_from_type<span class="Delimiter">(</span>product<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">);</span> <span id="L201" class="LineNr">201 </span> <span class="Delimiter">}</span> <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> -<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> +<span id="L203" class="LineNr">203 </span> expected_product<span class="Delimiter">.</span>type = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span> <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> <span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span> <span id="L206" class="LineNr">206 </span> <span id="L207" class="LineNr">207 </span><span class="Normal">void</span> drop_from_type<span class="Delimiter">(</span>reagent& r<span class="Delimiter">,</span> string expected_type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L208" class="LineNr">208 </span> assert<span class="Delimiter">(</span>!r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <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>left<span class="Delimiter">-></span>name != expected_type<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L210" class="LineNr">210 </span> raise << <span class="Constant">"can't drop2 "</span> << expected_type << <span class="Constant">" from '"</span> << to_string<span class="Delimiter">(</span>r<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L210" class="LineNr">210 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't drop2 "</span> << expected_type << <span class="Constant">" from '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>r<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L211" class="LineNr">211 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L212" class="LineNr">212 </span> <span class="Delimiter">}</span> <span id="L213" class="LineNr">213 </span> <span class="Comment">// r.type = r.type->right</span> @@ -286,27 +286,27 @@ if ('onhashchange' in window) { <span id="L226" class="LineNr">226 </span> <span id="L227" class="LineNr">227 </span><span class="Delimiter">:(scenario new_returns_incorrect_type)</span> <span id="L228" class="LineNr">228 </span><span class="Special">% Hide_errors = true;</span> -<span id="L229" class="LineNr">229 </span><span class="muRecipe">def</span> main [ +<span id="L229" class="LineNr">229 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L230" class="LineNr">230 </span> <span class="Constant">1</span>:<span class="Normal">bool</span><span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">num:type</span> <span id="L231" class="LineNr">231 </span>] -<span id="L232" class="LineNr">232 </span><span class="traceContains">+error: main: product of 'new' has incorrect type: '1:bool <- new num:type'</span> +<span id="L232" class="LineNr">232 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'new' has incorrect type: '1:bool <- new num:type'</span> <span id="L233" class="LineNr">233 </span> <span id="L234" class="LineNr">234 </span><span class="Delimiter">:(scenario new_discerns_singleton_list_from_atom_container)</span> <span id="L235" class="LineNr">235 </span><span class="Special">% Hide_errors = true;</span> -<span id="L236" class="LineNr">236 </span><span class="muRecipe">def</span> main [ -<span id="L237" class="LineNr">237 </span> <span class="Constant">1</span>:address:num/<span class="Special">raw <- </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 id="L236" class="LineNr">236 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L237" class="LineNr">237 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </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 id="L238" class="LineNr">238 </span>] -<span id="L239" class="LineNr">239 </span><span class="traceContains">+error: main: product of 'new' has incorrect type: '1:address:num/raw <- new {(num): type}'</span> +<span id="L239" class="LineNr">239 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'new' has incorrect type: '1:address:num/raw <- new {(num): type}'</span> <span id="L240" class="LineNr">240 </span> <span id="L241" class="LineNr">241 </span><span class="Delimiter">:(scenario new_with_type_abbreviation)</span> -<span id="L242" class="LineNr">242 </span><span class="muRecipe">def</span> main [ -<span id="L243" class="LineNr">243 </span> <span class="Constant">1</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">num:type</span> +<span id="L242" class="LineNr">242 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L243" class="LineNr">243 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">num:type</span> <span id="L244" class="LineNr">244 </span>] <span id="L245" class="LineNr">245 </span>$error: <span class="Constant">0</span> <span id="L246" class="LineNr">246 </span> <span id="L247" class="LineNr">247 </span><span class="Delimiter">:(scenario new_with_type_abbreviation_inside_compound)</span> -<span id="L248" class="LineNr">248 </span><span class="muRecipe">def</span> main [ -<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"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>& num<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> +<span id="L248" class="LineNr">248 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L249" class="LineNr">249 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> <a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">),</span> <span class="Special">raw</span>: <span class="Delimiter">()}</span><span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>& num<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> <span id="L250" class="LineNr">250 </span>] <span id="L251" class="LineNr">251 </span>$error: <span class="Constant">0</span> <span id="L252" class="LineNr">252 </span> @@ -318,12 +318,12 @@ if ('onhashchange' in window) { <span id="L258" class="LineNr">258 </span><span class="Comment">//: instructions left after the transforms have run.</span> <span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L260" class="LineNr">260 </span><span class="Normal">case</span> ALLOCATE: <span class="Delimiter">{</span> -<span id="L261" class="LineNr">261 </span> raise << <span class="Constant">"never call 'allocate' directly'; always use 'new'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L261" class="LineNr">261 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"never call 'allocate' directly'; always use 'new'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L262" class="LineNr">262 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L263" class="LineNr">263 </span><span class="Delimiter">}</span> <span id="L264" class="LineNr">264 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L265" class="LineNr">265 </span><span class="Normal">case</span> NEW: <span class="Delimiter">{</span> -<span id="L266" class="LineNr">266 </span> raise << <span class="Constant">"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">"</span> << end<span class="Delimiter">();</span> +<span id="L266" class="LineNr">266 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"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">"</span> << end<span class="Delimiter">();</span> <span id="L267" class="LineNr">267 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L268" class="LineNr">268 </span><span class="Delimiter">}</span> <span id="L269" class="LineNr">269 </span> @@ -331,16 +331,16 @@ if ('onhashchange' in window) { <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> <span id="L272" class="LineNr">272 </span> <span id="L273" class="LineNr">273 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L275" class="LineNr">275 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- convert 'new' to 'allocate' for recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> -<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 < 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 id="L274" class="LineNr">274 </span><span class="Normal">void</span> transform_new_to_allocate<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L275" class="LineNr">275 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- convert 'new' to 'allocate' for <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L277" class="LineNr">277 </span> instruction& 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 id="L278" class="LineNr">278 </span> <span class="Comment">// Convert 'new' To 'allocate'</span> <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">"new"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L280" class="LineNr">280 </span> inst<span class="Delimiter">.</span>operation = ALLOCATE<span class="Delimiter">;</span> -<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> -<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> -<span id="L283" class="LineNr">283 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">)</span> << <span class="Constant">"size of '"</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="Constant">"' is "</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>value << end<span class="Delimiter">();</span> +<span id="L281" class="LineNr">281 </span> type_tree* type = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span> +<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><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>size_of<span class="Delimiter">(</span>type<span class="Delimiter">));</span> +<span id="L283" class="LineNr">283 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">)</span> << <span class="Constant">"size of '"</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="Constant">"' is "</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>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L284" class="LineNr">284 </span> <span class="Normal">delete</span> type<span class="Delimiter">;</span> <span id="L285" class="LineNr">285 </span> <span class="Delimiter">}</span> <span id="L286" class="LineNr">286 </span> <span class="Delimiter">}</span> @@ -361,26 +361,26 @@ if ('onhashchange' in window) { <span id="L301" class="LineNr">301 </span>alloc = Memory_allocated_until<span class="Delimiter">;</span> <span id="L302" class="LineNr">302 </span>Memory_allocated_until += Initial_memory_per_routine<span class="Delimiter">;</span> <span id="L303" class="LineNr">303 </span>alloc_max = Memory_allocated_until<span class="Delimiter">;</span> -<span id="L304" class="LineNr">304 </span>trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">)</span> << <span class="Constant">"routine allocated memory from "</span> << alloc << <span class="Constant">" to "</span> << alloc_max << end<span class="Delimiter">();</span> +<span id="L304" class="LineNr">304 </span><a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">)</span> << <span class="Constant">"routine allocated memory from "</span> << alloc << <span class="Constant">" to "</span> << alloc_max << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L305" class="LineNr">305 </span> <span id="L306" class="LineNr">306 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L307" class="LineNr">307 </span>ALLOCATE<span class="Delimiter">,</span> <span id="L308" class="LineNr">308 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L309" class="LineNr">309 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"allocate"</span><span class="Delimiter">,</span> ALLOCATE<span class="Delimiter">);</span> +<span id="L309" class="LineNr">309 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"allocate"</span><span class="Delimiter">,</span> ALLOCATE<span class="Delimiter">);</span> <span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L311" class="LineNr">311 </span><span class="Normal">case</span> ALLOCATE: <span class="Delimiter">{</span> <span id="L312" class="LineNr">312 </span> <span class="Comment">// compute the space we need</span> <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> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L314" class="LineNr">314 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L315" class="LineNr">315 </span> <span class="Comment">// array allocation</span> -<span id="L316" class="LineNr">316 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"array length is "</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> << end<span class="Delimiter">();</span> +<span id="L316" class="LineNr">316 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"array length is "</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 href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L318" class="LineNr">318 </span> <span class="Delimiter">}</span> <span id="L319" class="LineNr">319 </span> <span class="Normal">int</span> result = allocate<span class="Delimiter">(</span>size<span class="Delimiter">);</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L320" class="LineNr">320 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L321" class="LineNr">321 </span> <span class="Comment">// initialize array length</span> -<span id="L322" class="LineNr">322 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << 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">" in location "</span> << result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span> << end<span class="Delimiter">();</span> -<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> +<span id="L322" class="LineNr">322 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << 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">" in location "</span> << result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L323" class="LineNr">323 </span> <a href='001help.cc.html#L218'>put</a><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 id="L324" class="LineNr">324 </span> <span class="Delimiter">}</span> <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> <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> @@ -390,7 +390,7 @@ if ('onhashchange' in window) { <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> <span id="L331" class="LineNr">331 </span> <span class="Comment">// include space for refcount</span> <span id="L332" class="LineNr">332 </span> ++size<span class="Delimiter">;</span> -<span id="L333" class="LineNr">333 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"allocating size "</span> << size << end<span class="Delimiter">();</span> +<span id="L333" class="LineNr">333 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"allocating size "</span> << size << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L334" class="LineNr">334 </span><span class="CommentedCode">//? Total_alloc += size;</span> <span id="L335" class="LineNr">335 </span><span class="CommentedCode">//? ++Num_alloc;</span> <span id="L336" class="LineNr">336 </span> <span class="Comment">// Allocate Special-cases</span> @@ -398,11 +398,11 @@ if ('onhashchange' in window) { <span id="L338" class="LineNr">338 </span> <span class="Comment">// really crappy at the moment</span> <span id="L339" class="LineNr">339 </span> ensure_space<span class="Delimiter">(</span>size<span class="Delimiter">);</span> <span id="L340" class="LineNr">340 </span> <span class="Normal">const</span> <span class="Normal">int</span> result = Current_routine<span class="Delimiter">-></span>alloc<span class="Delimiter">;</span> -<span id="L341" class="LineNr">341 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"new alloc: "</span> << result << end<span class="Delimiter">();</span> +<span id="L341" class="LineNr">341 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"new alloc: "</span> << result << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L342" class="LineNr">342 </span> <span class="Comment">// initialize allocated space</span> -<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 < result+size<span class="Delimiter">;</span> ++address<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L344" class="LineNr">344 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 0 in location "</span> << address << end<span class="Delimiter">();</span> -<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> +<span id="L343" class="LineNr">343 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = result<span class="Delimiter">;</span> <a href='043space.cc.html#L76'>address</a> < result+size<span class="Delimiter">;</span> ++address<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L344" class="LineNr">344 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 0 in location "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L345" class="LineNr">345 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L346" class="LineNr">346 </span> <span class="Delimiter">}</span> <span id="L347" class="LineNr">347 </span> Current_routine<span class="Delimiter">-></span>alloc += size<span class="Delimiter">;</span> <span id="L348" class="LineNr">348 </span> <span class="Comment">// no support yet for reclaiming memory between routines</span> @@ -435,41 +435,41 @@ if ('onhashchange' in window) { <span id="L375" class="LineNr">375 </span> Current_routine<span class="Delimiter">-></span>alloc = Memory_allocated_until<span class="Delimiter">;</span> <span id="L376" class="LineNr">376 </span> Memory_allocated_until += Initial_memory_per_routine<span class="Delimiter">;</span> <span id="L377" class="LineNr">377 </span> Current_routine<span class="Delimiter">-></span>alloc_max = Memory_allocated_until<span class="Delimiter">;</span> -<span id="L378" class="LineNr">378 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">)</span> << <span class="Constant">"routine allocated memory from "</span> << Current_routine<span class="Delimiter">-></span>alloc << <span class="Constant">" to "</span> << Current_routine<span class="Delimiter">-></span>alloc_max << end<span class="Delimiter">();</span> +<span id="L378" class="LineNr">378 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"new"</span><span class="Delimiter">)</span> << <span class="Constant">"routine allocated memory from "</span> << Current_routine<span class="Delimiter">-></span>alloc << <span class="Constant">" to "</span> << Current_routine<span class="Delimiter">-></span>alloc_max << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L379" class="LineNr">379 </span> <span class="Delimiter">}</span> <span id="L380" class="LineNr">380 </span><span class="Delimiter">}</span> <span id="L381" class="LineNr">381 </span> <span id="L382" class="LineNr">382 </span><span class="Delimiter">:(scenario new_initializes)</span> <span id="L383" class="LineNr">383 </span><span class="Special">% Memory_allocated_until = 10;</span> <span id="L384" class="LineNr">384 </span><span class="Special">% put(Memory, Memory_allocated_until, 1);</span> -<span id="L385" class="LineNr">385 </span><span class="muRecipe">def</span> main [ -<span id="L386" class="LineNr">386 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L385" class="LineNr">385 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L386" class="LineNr">386 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L387" class="LineNr">387 </span>] <span id="L388" class="LineNr">388 </span><span class="traceContains">+mem: storing 0 in location 10</span> <span id="L389" class="LineNr">389 </span> <span id="L390" class="LineNr">390 </span><span class="Delimiter">:(scenario new_size)</span> -<span id="L391" class="LineNr">391 </span><span class="muRecipe">def</span> main [ -<span id="L392" class="LineNr">392 </span> <span class="Constant">11</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L393" class="LineNr">393 </span> <span class="Constant">12</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L394" class="LineNr">394 </span> <span class="Constant">13</span>:num/<span class="Special">raw <- </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 id="L391" class="LineNr">391 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L392" class="LineNr">392 </span> <span class="Constant">11</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L393" class="LineNr">393 </span> <span class="Constant">12</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L394" class="LineNr">394 </span> <span class="Constant">13</span>:num/<span class="Special">raw <- </span>subtract <span class="Constant">12</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">11</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw</span> <span id="L395" class="LineNr">395 </span>] <span id="L396" class="LineNr">396 </span><span class="Comment"># size of number + refcount</span> <span id="L397" class="LineNr">397 </span><span class="traceContains">+mem: storing 2 in location 13</span> <span id="L398" class="LineNr">398 </span> <span id="L399" class="LineNr">399 </span><span class="Delimiter">:(scenario new_array_size)</span> -<span id="L400" class="LineNr">400 </span><span class="muRecipe">def</span> main [ -<span id="L401" class="LineNr">401 </span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span> -<span id="L402" class="LineNr">402 </span> <span class="Constant">2</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L403" class="LineNr">403 </span> <span class="Constant">3</span>:num/<span class="Special">raw <- </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 id="L400" class="LineNr">400 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L401" class="LineNr">401 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span> +<span id="L402" class="LineNr">402 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L403" class="LineNr">403 </span> <span class="Constant">3</span>:num/<span class="Special">raw <- </span>subtract <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/<span class="Special">raw</span> <span id="L404" class="LineNr">404 </span>] <span id="L405" class="LineNr">405 </span><span class="Comment"># 5 locations for array contents + array length + refcount</span> <span id="L406" class="LineNr">406 </span><span class="traceContains">+mem: storing 7 in location 3</span> <span id="L407" class="LineNr">407 </span> <span id="L408" class="LineNr">408 </span><span class="Delimiter">:(scenario new_empty_array)</span> -<span id="L409" class="LineNr">409 </span><span class="muRecipe">def</span> main [ -<span id="L410" class="LineNr">410 </span> <span class="Constant">1</span>:address:array:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">0</span> -<span id="L411" class="LineNr">411 </span> <span class="Constant">2</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L412" class="LineNr">412 </span> <span class="Constant">3</span>:num/<span class="Special">raw <- </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 id="L409" class="LineNr">409 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L410" class="LineNr">410 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">0</span> +<span id="L411" class="LineNr">411 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L412" class="LineNr">412 </span> <span class="Constant">3</span>:num/<span class="Special">raw <- </span>subtract <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/<span class="Special">raw</span> <span id="L413" class="LineNr">413 </span>] <span id="L414" class="LineNr">414 </span><span class="traceContains">+run: {1: ("address" "array" "number"), "raw": ()} <- new {number: "type"}, {0: "literal"}</span> <span id="L415" class="LineNr">415 </span><span class="traceContains">+mem: array length is 0</span> @@ -479,9 +479,9 @@ if ('onhashchange' in window) { <span id="L419" class="LineNr">419 </span><span class="Comment">//: If a routine runs out of its initial allocation, it should allocate more.</span> <span id="L420" class="LineNr">420 </span><span class="Delimiter">:(scenario new_overflow)</span> <span id="L421" class="LineNr">421 </span><span class="Special">% Initial_memory_per_routine = 3; // barely enough room for point allocation below</span> -<span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> main [ -<span id="L423" class="LineNr">423 </span> <span class="Constant">1</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L424" class="LineNr">424 </span> <span class="Constant">2</span>:address:point/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span class="Comment"># not enough room in initial page</span> +<span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L423" class="LineNr">423 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L424" class="LineNr">424 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:point/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span class="Comment"># not enough room in initial page</span> <span id="L425" class="LineNr">425 </span>] <span id="L426" class="LineNr">426 </span><span class="traceContains">+new: routine allocated memory from 1000 to 1003</span> <span id="L427" class="LineNr">427 </span><span class="traceContains">+new: routine allocated memory from 1003 to 1006</span> diff --git a/html/035lookup.cc.html b/html/035lookup.cc.html index 01077bee..b8cf1c35 100644 --- a/html/035lookup.cc.html +++ b/html/035lookup.cc.html @@ -94,11 +94,11 @@ if ('onhashchange' in window) { <span id="L33" class="LineNr"> 33 </span><span class="Comment">//: 'new'.</span> <span id="L34" class="LineNr"> 34 </span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(scenario copy_indirect)</span> -<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> main [ -<span id="L37" class="LineNr"> 37 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L37" class="LineNr"> 37 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L38" class="LineNr"> 38 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L39" class="LineNr"> 39 </span> <span class="Comment"># This loads location 1 as an address and looks up *that* location.</span> -<span id="L40" class="LineNr"> 40 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:num/lookup +<span id="L40" class="LineNr"> 40 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/lookup <span id="L41" class="LineNr"> 41 </span>] <span id="L42" class="LineNr"> 42 </span><span class="Comment"># 1 contains 10. Skip refcount and lookup location 11.</span> <span id="L43" class="LineNr"> 43 </span><span class="traceContains">+mem: storing 34 in location 2</span> @@ -109,9 +109,9 @@ if ('onhashchange' in window) { <span id="L48" class="LineNr"> 48 </span><span class="Comment">//: similarly, write to addresses pointing at other locations using the</span> <span id="L49" class="LineNr"> 49 </span><span class="Comment">//: 'lookup' property</span> <span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(scenario store_indirect)</span> -<span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> main [ -<span id="L52" class="LineNr"> 52 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L53" class="LineNr"> 53 </span> <span class="Constant">1</span>:address:num/lookup<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L52" class="LineNr"> 52 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L53" class="LineNr"> 53 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/lookup<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L54" class="LineNr"> 54 </span>] <span id="L55" class="LineNr"> 55 </span><span class="traceContains">+mem: storing 34 in location 11</span> <span id="L56" class="LineNr"> 56 </span> @@ -121,19 +121,19 @@ if ('onhashchange' in window) { <span id="L60" class="LineNr"> 60 </span><span class="Comment">//: writes to address 0 always loudly fail</span> <span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(scenario store_to_0_fails)</span> <span id="L62" class="LineNr"> 62 </span><span class="Special">% Hide_errors = true;</span> -<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> main [ -<span id="L64" class="LineNr"> 64 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L65" class="LineNr"> 65 </span> <span class="Constant">1</span>:address:num/lookup<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L64" class="LineNr"> 64 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L65" class="LineNr"> 65 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/lookup<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L66" class="LineNr"> 66 </span>] <span id="L67" class="LineNr"> 67 </span><span class="traceAbsent">-mem: storing 34 in location 0</span> -<span id="L68" class="LineNr"> 68 </span><span class="traceContains">+error: can't write to location 0 in '1:address:num/lookup <- copy 34'</span> +<span id="L68" class="LineNr"> 68 </span><span class="traceContains">+error: can't write to location 0 in '1:<a href='043space.cc.html#L76'>address</a>:num/lookup <- copy 34'</span> <span id="L69" class="LineNr"> 69 </span> <span id="L70" class="LineNr"> 70 </span><span class="Comment">//: attempts to /lookup address 0 always loudly fail</span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario lookup_0_fails)</span> <span id="L72" class="LineNr"> 72 </span><span class="Special">% Hide_errors = true;</span> -<span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> main [ -<span id="L74" class="LineNr"> 74 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L75" class="LineNr"> 75 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:num/lookup +<span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L74" class="LineNr"> 74 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L75" class="LineNr"> 75 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/lookup <span id="L76" class="LineNr"> 76 </span>] <span id="L77" class="LineNr"> 77 </span><span class="traceContains">+error: tried to /lookup 0 in '2:num <- copy 1:address:num/lookup'</span> <span id="L78" class="LineNr"> 78 </span> @@ -147,12 +147,12 @@ if ('onhashchange' in window) { <span id="L86" class="LineNr"> 86 </span> <span id="L87" class="LineNr"> 87 </span><span class="Normal">void</span> lookup_memory<span class="Delimiter">(</span>reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">-></span>atom || x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L89" class="LineNr"> 89 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to /lookup '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"' but it isn't an address</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L89" class="LineNr"> 89 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to /lookup '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"' but it isn't an address</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L90" class="LineNr"> 90 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> <span id="L92" class="LineNr"> 92 </span> <span class="Comment">// compute value</span> <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> -<span id="L94" class="LineNr"> 94 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L94" class="LineNr"> 94 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L95" class="LineNr"> 95 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> <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> @@ -160,39 +160,39 @@ if ('onhashchange' in window) { <span id="L99" class="LineNr"> 99 </span> <span id="L100" class="LineNr">100 </span><span class="Normal">void</span> lookup_memory_core<span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> <span class="Normal">bool</span> check_for_null<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L102" class="LineNr">102 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << x<span class="Delimiter">.</span>value << <span class="Constant">" is "</span> << 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> << end<span class="Delimiter">();</span> -<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> +<span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << x<span class="Delimiter">.</span>value << <span class="Constant">" is "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">))</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L103" class="LineNr">103 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> x<span class="Delimiter">.</span>value<span class="Delimiter">));</span> <span id="L104" class="LineNr">104 </span> drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">);</span> <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> -<span id="L106" class="LineNr">106 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"skipping refcount at "</span> << x<span class="Delimiter">.</span>value << end<span class="Delimiter">();</span> -<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> +<span id="L106" class="LineNr">106 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"skipping refcount at "</span> << x<span class="Delimiter">.</span>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L107" class="LineNr">107 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><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 id="L108" class="LineNr">108 </span> <span class="Delimiter">}</span> <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> <span id="L110" class="LineNr">110 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">)</span> -<span id="L111" class="LineNr">111 </span> raise << <span class="Constant">"tried to /lookup 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L111" class="LineNr">111 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"tried to /lookup 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L112" class="LineNr">112 </span> <span class="Normal">else</span> -<span id="L113" class="LineNr">113 </span> raise << <span class="Constant">"tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"tried to /lookup 0</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L114" class="LineNr">114 </span> <span class="Delimiter">}</span> <span id="L115" class="LineNr">115 </span> drop_one_lookup<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L116" class="LineNr">116 </span><span class="Delimiter">}</span> <span id="L117" class="LineNr">117 </span> <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> -<span id="L119" class="LineNr">119 </span> reagent x<span class="Delimiter">(</span><span class="Constant">"*x:address:num"</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L119" class="LineNr">119 </span> reagent x<span class="Delimiter">(</span><span class="Constant">"*x:<a href='043space.cc.html#L76'>address</a>:num"</span><span class="Delimiter">);</span> +<span id="L120" class="LineNr">120 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span> <span class="Comment">// unsafe</span> +<span id="L121" class="LineNr">121 </span> <a href='001help.cc.html#L218'>put</a><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> <span id="L122" class="LineNr">122 </span> lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span> -<span id="L123" class="LineNr">123 </span> CHECK_TRACE_CONTENTS<span class="Delimiter">(</span><span class="Constant">"mem: skipping refcount at 1000"</span><span class="Delimiter">);</span> -<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> +<span id="L123" class="LineNr">123 </span> <a href='003trace.cc.html#L228'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span><span class="Constant">"mem: skipping refcount at 1000"</span><span class="Delimiter">);</span> +<span id="L124" class="LineNr">124 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">1001</span><span class="Delimiter">);</span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">}</span> <span id="L126" class="LineNr">126 </span> <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> <span id="L128" class="LineNr">128 </span> Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L129" class="LineNr">129 </span> reagent x<span class="Delimiter">(</span><span class="Constant">"*x:address:num"</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L129" class="LineNr">129 </span> reagent x<span class="Delimiter">(</span><span class="Constant">"*x:<a href='043space.cc.html#L76'>address</a>:num"</span><span class="Delimiter">);</span> +<span id="L130" class="LineNr">130 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><span class="Constant">34</span><span class="Delimiter">);</span> <span class="Comment">// unsafe</span> +<span id="L131" class="LineNr">131 </span> <a href='001help.cc.html#L218'>put</a><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> <span id="L132" class="LineNr">132 </span> lookup_memory<span class="Delimiter">(</span>x<span class="Delimiter">);</span> -<span id="L133" class="LineNr">133 </span> CHECK_TRACE_DOESNT_CONTAIN<span class="Delimiter">(</span><span class="Constant">"mem: skipping refcount at 0"</span><span class="Delimiter">);</span> -<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> +<span id="L133" class="LineNr">133 </span> <a href='003trace.cc.html#L248'>CHECK_TRACE_DOESNT_CONTAIN</a><span class="Delimiter">(</span><span class="Constant">"mem: skipping refcount at 0"</span><span class="Delimiter">);</span> +<span id="L134" class="LineNr">134 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span> <span id="L136" class="LineNr">136 </span> <span id="L137" class="LineNr">137 </span><span class="Delimiter">:(before "End Preprocess types_strictly_match(reagent to, reagent from)")</span> @@ -235,7 +235,7 @@ if ('onhashchange' in window) { <span id="L174" class="LineNr">174 </span><span class="Normal">bool</span> canonize_type<span class="Delimiter">(</span>reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"lookup"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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">-></span>atom || !r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left || !r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom || r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value != get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L177" class="LineNr">177 </span> raise << <span class="Constant">"can't lookup non-address: '"</span> << to_string<span class="Delimiter">(</span>r<span class="Delimiter">)</span> << <span class="Constant">"': '"</span> << to_string<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L177" class="LineNr">177 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't lookup non-address: '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>r<span class="Delimiter">)</span> << <span class="Constant">"': '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L178" class="LineNr">178 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L179" class="LineNr">179 </span> <span class="Delimiter">}</span> <span id="L180" class="LineNr">180 </span> drop_from_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">);</span> @@ -245,7 +245,7 @@ if ('onhashchange' in window) { <span id="L184" class="LineNr">184 </span><span class="Delimiter">}</span> <span id="L185" class="LineNr">185 </span> <span id="L186" class="LineNr">186 </span><span class="Normal">void</span> drop_one_lookup<span class="Delimiter">(</span>reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L187" class="LineNr">187 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<pair<string<span class="Delimiter">,</span> string_tree*> >::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 id="L187" class="LineNr">187 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<pair<string<span class="Delimiter">,</span> string_tree*> >::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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L188" class="LineNr">188 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>first == <span class="Constant">"lookup"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L190" class="LineNr">190 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> @@ -259,33 +259,33 @@ if ('onhashchange' in window) { <span id="L198" class="LineNr">198 </span><span class="Comment">//: 'products' variables in run_current_routine().</span> <span id="L199" class="LineNr">199 </span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario get_indirect)</span> -<span id="L201" class="LineNr">201 </span><span class="muRecipe">def</span> main [ -<span id="L202" class="LineNr">202 </span> <span class="Constant">1</span>:address:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L201" class="LineNr">201 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L202" class="LineNr">202 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L203" class="LineNr">203 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L204" class="LineNr">204 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L205" class="LineNr">205 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L206" class="LineNr">206 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span> +<span id="L206" class="LineNr">206 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span> <span id="L207" class="LineNr">207 </span>] <span id="L208" class="LineNr">208 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L209" class="LineNr">209 </span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(scenario get_indirect2)</span> -<span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> main [ -<span id="L212" class="LineNr">212 </span> <span class="Constant">1</span>:address:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L212" class="LineNr">212 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L213" class="LineNr">213 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L214" class="LineNr">214 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L215" class="LineNr">215 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L216" class="LineNr">216 </span> <span class="Constant">2</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">20</span>/unsafe -<span id="L217" class="LineNr">217 </span> <span class="Constant">2</span>:address:num/lookup<span class="Special"> <- </span>get <span class="Constant">1</span>:address:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span> +<span id="L216" class="LineNr">216 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">20</span>/unsafe +<span id="L217" class="LineNr">217 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/lookup<span class="Special"> <- </span>get <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span> <span id="L218" class="LineNr">218 </span>] <span id="L219" class="LineNr">219 </span><span class="traceContains">+mem: storing 34 in location 21</span> <span id="L220" class="LineNr">220 </span> <span id="L221" class="LineNr">221 </span><span class="Delimiter">:(scenario include_nonlookup_properties)</span> -<span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> main [ -<span id="L223" class="LineNr">223 </span> <span class="Constant">1</span>:address:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L223" class="LineNr">223 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L224" class="LineNr">224 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L225" class="LineNr">225 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L226" class="LineNr">226 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L227" class="LineNr">227 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:address:point/lookup/foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span> +<span id="L227" class="LineNr">227 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point/lookup/foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span> <span id="L228" class="LineNr">228 </span>] <span id="L229" class="LineNr">229 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L230" class="LineNr">230 </span> @@ -297,12 +297,12 @@ if ('onhashchange' in window) { <span id="L236" class="LineNr">236 </span>canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span> <span id="L237" class="LineNr">237 </span> <span id="L238" class="LineNr">238 </span><span class="Delimiter">:(scenario put_indirect)</span> -<span id="L239" class="LineNr">239 </span><span class="muRecipe">def</span> main [ -<span id="L240" class="LineNr">240 </span> <span class="Constant">1</span>:address:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L239" class="LineNr">239 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L240" class="LineNr">240 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L241" class="LineNr">241 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L242" class="LineNr">242 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L243" class="LineNr">243 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L244" class="LineNr">244 </span> <span class="Constant">1</span>:address:point/lookup<span class="Special"> <- </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 id="L244" class="LineNr">244 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point/lookup<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">0:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> <span id="L245" class="LineNr">245 </span>] <span id="L246" class="LineNr">246 </span><span class="traceContains">+mem: storing 36 in location 11</span> <span id="L247" class="LineNr">247 </span> @@ -315,14 +315,14 @@ if ('onhashchange' in window) { <span id="L254" class="LineNr">254 </span> <span id="L255" class="LineNr">255 </span><span class="Delimiter">:(scenario put_product_error_with_lookup)</span> <span id="L256" class="LineNr">256 </span><span class="Special">% Hide_errors = true;</span> -<span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> main [ -<span id="L258" class="LineNr">258 </span> <span class="Constant">1</span>:address:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L258" class="LineNr">258 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L259" class="LineNr">259 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L260" class="LineNr">260 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L261" class="LineNr">261 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L262" class="LineNr">262 </span> <span class="Constant">1</span>:address:point<span class="Special"> <- </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 id="L262" class="LineNr">262 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:point/lookup<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span> <span id="L263" class="LineNr">263 </span>] -<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> +<span id="L264" class="LineNr">264 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'put' must be first ingredient '1:address:point/lookup', but got '1:address:point'</span> <span id="L265" class="LineNr">265 </span> <span id="L266" class="LineNr">266 </span><span class="Delimiter">:(before "End PUT Product Checks")</span> <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> @@ -330,29 +330,29 @@ if ('onhashchange' in window) { <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> <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> <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> -<span id="L272" class="LineNr">272 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L272" class="LineNr">272 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L273" class="LineNr">273 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L274" class="LineNr">274 </span><span class="Delimiter">}</span> <span id="L275" class="LineNr">275 </span> <span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario new_error)</span> <span id="L277" class="LineNr">277 </span><span class="Special">% Hide_errors = true;</span> -<span id="L278" class="LineNr">278 </span><span class="muRecipe">def</span> main [ +<span id="L278" class="LineNr">278 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L279" class="LineNr">279 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L280" class="LineNr">280 </span>] -<span id="L281" class="LineNr">281 </span><span class="traceContains">+error: main: product of 'new' has incorrect type: '1:num/raw <- new number:type'</span> +<span id="L281" class="LineNr">281 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'new' has incorrect type: '1:num/raw <- new number:type'</span> <span id="L282" class="LineNr">282 </span> <span id="L283" class="LineNr">283 </span><span class="Delimiter">:(after "Update NEW product in Check")</span> <span id="L284" class="LineNr">284 </span>canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L285" class="LineNr">285 </span> <span id="L286" class="LineNr">286 </span><span class="Delimiter">:(scenario copy_array_indirect)</span> -<span id="L287" class="LineNr">287 </span><span class="muRecipe">def</span> main [ +<span id="L287" class="LineNr">287 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L288" class="LineNr">288 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L289" class="LineNr">289 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L290" class="LineNr">290 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L291" class="LineNr">291 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> <span id="L292" class="LineNr">292 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> -<span id="L293" class="LineNr">293 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L294" class="LineNr">294 </span> <span class="Constant">2</span>:array:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:array:num/lookup +<span id="L293" class="LineNr">293 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L294" class="LineNr">294 </span> <span class="Constant">2</span>:array:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/lookup <span id="L295" class="LineNr">295 </span>] <span id="L296" class="LineNr">296 </span><span class="traceContains">+mem: storing 3 in location 2</span> <span id="L297" class="LineNr">297 </span><span class="traceContains">+mem: storing 14 in location 3</span> @@ -360,10 +360,10 @@ if ('onhashchange' in window) { <span id="L299" class="LineNr">299 </span><span class="traceContains">+mem: storing 16 in location 5</span> <span id="L300" class="LineNr">300 </span> <span id="L301" class="LineNr">301 </span><span class="Delimiter">:(scenario create_array_indirect)</span> -<span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> main [ +<span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L303" class="LineNr">303 </span> <span class="Constant">1000</span>:num/<span class="Special">raw <- </span>copy <span class="Constant">1</span> <span class="Comment"># pretend refcount</span> -<span id="L304" class="LineNr">304 </span> <span class="Constant">1</span>:address:array:num:<span class="Constant">3</span><span class="Special"> <- </span>copy <span class="Constant">1000</span>/unsafe <span class="Comment"># pretend allocation</span> -<span id="L305" class="LineNr">305 </span> <span class="Constant">1</span>:address:array:num:<span class="Constant">3</span>/lookup<span class="Special"> <- </span>create-array +<span id="L304" class="LineNr">304 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>copy <span class="Constant">1000</span>/unsafe <span class="Comment"># pretend allocation</span> +<span id="L305" class="LineNr">305 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num:<span class="Constant">3</span>/lookup<span class="Special"> <- </span>create-array <span id="L306" class="LineNr">306 </span>] <span id="L307" class="LineNr">307 </span><span class="traceContains">+mem: storing 3 in location 1001</span> <span id="L308" class="LineNr">308 </span> @@ -373,14 +373,14 @@ if ('onhashchange' in window) { <span id="L312" class="LineNr">312 </span>canonize<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L313" class="LineNr">313 </span> <span id="L314" class="LineNr">314 </span><span class="Delimiter">:(scenario index_indirect)</span> -<span id="L315" class="LineNr">315 </span><span class="muRecipe">def</span> main [ +<span id="L315" class="LineNr">315 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L316" class="LineNr">316 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L317" class="LineNr">317 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L318" class="LineNr">318 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L319" class="LineNr">319 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> <span id="L320" class="LineNr">320 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> -<span id="L321" class="LineNr">321 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L322" class="LineNr">322 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>index <span class="Constant">1</span>:address:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span> +<span id="L321" class="LineNr">321 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L322" class="LineNr">322 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>index <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L323" class="LineNr">323 </span>] <span id="L324" class="LineNr">324 </span><span class="traceContains">+mem: storing 15 in location 2</span> <span id="L325" class="LineNr">325 </span> @@ -397,42 +397,42 @@ if ('onhashchange' in window) { <span id="L336" class="LineNr">336 </span>canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L337" class="LineNr">337 </span> <span id="L338" class="LineNr">338 </span><span class="Delimiter">:(scenario put_index_indirect)</span> -<span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> main [ +<span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L340" class="LineNr">340 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L341" class="LineNr">341 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L342" class="LineNr">342 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L343" class="LineNr">343 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> <span id="L344" class="LineNr">344 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> -<span id="L345" class="LineNr">345 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L346" class="LineNr">346 </span> <span class="Constant">1</span>:address:array:num/lookup<span class="Special"> <- </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 id="L345" class="LineNr">345 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L346" class="LineNr">346 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/lookup<span class="Special"> <- </span>put-index <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L347" class="LineNr">347 </span>] <span id="L348" class="LineNr">348 </span><span class="traceContains">+mem: storing 34 in location 13</span> <span id="L349" class="LineNr">349 </span> <span id="L350" class="LineNr">350 </span><span class="Delimiter">:(scenario put_index_indirect_2)</span> -<span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> main [ +<span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L352" class="LineNr">352 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L353" class="LineNr">353 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L354" class="LineNr">354 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> <span id="L355" class="LineNr">355 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> -<span id="L356" class="LineNr">356 </span> <span class="Constant">5</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L356" class="LineNr">356 </span> <span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L357" class="LineNr">357 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L358" class="LineNr">358 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> -<span id="L359" class="LineNr">359 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </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 id="L359" class="LineNr">359 </span> <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>put-index <span class="Constant">1</span>:array:num:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num/lookup<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L360" class="LineNr">360 </span>] <span id="L361" class="LineNr">361 </span><span class="traceContains">+mem: storing 34 in location 3</span> <span id="L362" class="LineNr">362 </span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">:(scenario put_index_product_error_with_lookup)</span> <span id="L364" class="LineNr">364 </span><span class="Special">% Hide_errors = true;</span> -<span id="L365" class="LineNr">365 </span><span class="muRecipe">def</span> main [ +<span id="L365" class="LineNr">365 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L366" class="LineNr">366 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L367" class="LineNr">367 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L368" class="LineNr">368 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L369" class="LineNr">369 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> <span id="L370" class="LineNr">370 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> -<span id="L371" class="LineNr">371 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L372" class="LineNr">372 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </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 id="L371" class="LineNr">371 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L372" class="LineNr">372 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>put-index <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/lookup<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L373" class="LineNr">373 </span>] -<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> +<span id="L374" class="LineNr">374 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'put-index' must be first ingredient '1:address:array:num/lookup', but got '1:address:array:num'</span> <span id="L375" class="LineNr">375 </span> <span id="L376" class="LineNr">376 </span><span class="Delimiter">:(before "End PUT_INDEX Product Checks")</span> <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> @@ -440,17 +440,17 @@ if ('onhashchange' in window) { <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> <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> <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> -<span id="L382" class="LineNr">382 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put-index' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L382" class="LineNr">382 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put-index' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L383" class="LineNr">383 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L384" class="LineNr">384 </span><span class="Delimiter">}</span> <span id="L385" class="LineNr">385 </span> <span id="L386" class="LineNr">386 </span><span class="Delimiter">:(scenario dilated_reagent_in_static_array)</span> -<span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> main [ -<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"> <- </span>create-array -<span id="L389" class="LineNr">389 </span> <span class="Constant">5</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<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"> <- </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 id="L391" class="LineNr">391 </span> *<span class="Constant">5</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L392" class="LineNr">392 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>copy *<span class="Constant">5</span>:address:num +<span id="L387" class="LineNr">387 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> <- </span>create-array +<span id="L389" class="LineNr">389 </span> <span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<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><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span> <span class="Constant">3</span><span class="Delimiter">)}</span><span class="Special"> <- </span>put-index <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>array <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> 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>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L391" class="LineNr">391 </span> *<span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L392" class="LineNr">392 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>copy *<span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L393" class="LineNr">393 </span>] <span id="L394" class="LineNr">394 </span><span class="traceContains">+run: creating array of size 4</span> <span id="L395" class="LineNr">395 </span><span class="traceContains">+mem: storing 34 in location 6</span> @@ -468,14 +468,14 @@ if ('onhashchange' in window) { <span id="L407" class="LineNr">407 </span>canonize<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L408" class="LineNr">408 </span> <span id="L409" class="LineNr">409 </span><span class="Delimiter">:(scenario length_indirect)</span> -<span id="L410" class="LineNr">410 </span><span class="muRecipe">def</span> main [ +<span id="L410" class="LineNr">410 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L411" class="LineNr">411 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L412" class="LineNr">412 </span> <span class="Constant">11</span>:array:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L413" class="LineNr">413 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">14</span> <span id="L414" class="LineNr">414 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">15</span> <span id="L415" class="LineNr">415 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">16</span> -<span id="L416" class="LineNr">416 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L417" class="LineNr">417 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>length <span class="Constant">1</span>:address:array:num/lookup +<span id="L416" class="LineNr">416 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L417" class="LineNr">417 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>length <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num/lookup <span id="L418" class="LineNr">418 </span>] <span id="L419" class="LineNr">419 </span><span class="traceContains">+mem: storing 3 in location 2</span> <span id="L420" class="LineNr">420 </span> @@ -485,33 +485,33 @@ if ('onhashchange' in window) { <span id="L424" class="LineNr">424 </span>canonize<span class="Delimiter">(</span>array<span class="Delimiter">);</span> <span id="L425" class="LineNr">425 </span> <span id="L426" class="LineNr">426 </span><span class="Delimiter">:(scenario maybe_convert_indirect)</span> -<span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> main [ +<span id="L427" class="LineNr">427 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L428" class="LineNr">428 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L429" class="LineNr">429 </span> <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> -<span id="L430" class="LineNr">430 </span> <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<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"> <- </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 id="L430" class="LineNr">430 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<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"> <- </span>maybe-convert <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span> <span id="L432" class="LineNr">432 </span>] <span id="L433" class="LineNr">433 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L434" class="LineNr">434 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L435" class="LineNr">435 </span> <span id="L436" class="LineNr">436 </span><span class="Delimiter">:(scenario maybe_convert_indirect_2)</span> -<span id="L437" class="LineNr">437 </span><span class="muRecipe">def</span> main [ +<span id="L437" class="LineNr">437 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L438" class="LineNr">438 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L439" class="LineNr">439 </span> <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> -<span id="L440" class="LineNr">440 </span> <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L441" class="LineNr">441 </span> <span class="Constant">2</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">20</span>/unsafe -<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"> <- </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 id="L440" class="LineNr">440 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L441" class="LineNr">441 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">20</span>/unsafe +<span id="L442" class="LineNr">442 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num/lookup<span class="Delimiter">,</span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>maybe-convert <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span> <span id="L443" class="LineNr">443 </span>] <span id="L444" class="LineNr">444 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L445" class="LineNr">445 </span><span class="traceContains">+mem: storing 34 in location 21</span> <span id="L446" class="LineNr">446 </span> <span id="L447" class="LineNr">447 </span><span class="Delimiter">:(scenario maybe_convert_indirect_3)</span> -<span id="L448" class="LineNr">448 </span><span class="muRecipe">def</span> main [ +<span id="L448" class="LineNr">448 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L449" class="LineNr">449 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L450" class="LineNr">450 </span> <span class="Constant">11</span>:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> -<span id="L451" class="LineNr">451 </span> <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L452" class="LineNr">452 </span> <span class="Constant">2</span>:address:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">20</span>/unsafe -<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"> <- </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 id="L451" class="LineNr">451 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L452" class="LineNr">452 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">20</span>/unsafe +<span id="L453" class="LineNr">453 </span> <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:<span class="Normal">bool</span>/lookup<span class="Special"> <- </span>maybe-convert <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Delimiter">,</span> <span class="Constant">i:variant</span> <span id="L454" class="LineNr">454 </span>] <span id="L455" class="LineNr">455 </span><span class="traceContains">+mem: storing 1 in location 21</span> <span id="L456" class="LineNr">456 </span><span class="traceContains">+mem: storing 34 in location 3</span> @@ -531,9 +531,9 @@ if ('onhashchange' in window) { <span id="L470" class="LineNr">470 </span>canonize<span class="Delimiter">(</span>status<span class="Delimiter">);</span> <span id="L471" class="LineNr">471 </span> <span id="L472" class="LineNr">472 </span><span class="Delimiter">:(scenario merge_exclusive_container_indirect)</span> -<span id="L473" class="LineNr">473 </span><span class="muRecipe">def</span> main [ -<span id="L474" class="LineNr">474 </span> <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe -<span id="L475" class="LineNr">475 </span> <span class="Constant">1</span>:address:number-<span class="Normal">or</span>-point/lookup<span class="Special"> <- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L473" class="LineNr">473 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L474" class="LineNr">474 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L475" class="LineNr">475 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number-<span class="Normal">or</span>-point/lookup<span class="Special"> <- </span>merge <span class="Constant">0</span>/number<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L476" class="LineNr">476 </span>] <span id="L477" class="LineNr">477 </span><span class="Comment"># skip 10 for refcount</span> <span id="L478" class="LineNr">478 </span><span class="traceContains">+mem: storing 0 in location 11</span> @@ -545,23 +545,23 @@ if ('onhashchange' in window) { <span id="L484" class="LineNr">484 </span><span class="Comment">//: abbreviation for '/lookup': a prefix '*'</span> <span id="L485" class="LineNr">485 </span> <span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario lookup_abbreviation)</span> -<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [ -<span id="L488" class="LineNr">488 </span> <span class="Constant">1</span>:address:number<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe +<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L488" class="LineNr">488 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L489" class="LineNr">489 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L490" class="LineNr">490 </span> <span class="Constant">11</span>:number<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L491" class="LineNr">491 </span> <span class="Constant">3</span>:number<span class="Special"> <- </span>copy *<span class="Constant">1</span>:address:number +<span id="L491" class="LineNr">491 </span> <span class="Constant">3</span>:number<span class="Special"> <- </span>copy *<span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:number <span id="L492" class="LineNr">492 </span>] <span id="L493" class="LineNr">493 </span><span class="traceContains">+parse: ingredient: {1: ("address" "number"), "lookup": ()}</span> <span id="L494" class="LineNr">494 </span><span class="traceContains">+mem: storing 34 in location 3</span> <span id="L495" class="LineNr">495 </span> <span id="L496" class="LineNr">496 </span><span class="Delimiter">:(before "End Parsing reagent")</span> <span id="L497" class="LineNr">497 </span><span class="Delimiter">{</span> -<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">"*"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L498" class="LineNr">498 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>name<span class="Delimiter">,</span> <span class="Constant">"*"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> <span id="L500" class="LineNr">500 </span> properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"lookup"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> <span id="L501" class="LineNr">501 </span> <span class="Delimiter">}</span> <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> -<span id="L503" class="LineNr">503 </span> raise << <span class="Constant">"illegal name '"</span> << original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L503" class="LineNr">503 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"illegal name '"</span> << original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span> <span id="L505" class="LineNr">505 </span> <span id="L506" class="LineNr">506 </span><span class="SalientComment">//:: helpers for debugging</span> @@ -569,12 +569,12 @@ if ('onhashchange' in window) { <span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L509" class="LineNr">509 </span>_DUMP<span class="Delimiter">,</span> <span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L511" class="LineNr">511 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump"</span><span class="Delimiter">,</span> _DUMP<span class="Delimiter">);</span> +<span id="L511" class="LineNr">511 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump"</span><span class="Delimiter">,</span> _DUMP<span class="Delimiter">);</span> <span id="L512" class="LineNr">512 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L513" class="LineNr">513 </span><span class="Normal">case</span> _DUMP: <span class="Delimiter">{</span> <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> <span id="L515" class="LineNr">515 </span> canonize<span class="Delimiter">(</span>after_canonize<span class="Delimiter">);</span> -<span id="L516" class="LineNr">516 </span> cerr << maybe<span class="Delimiter">(</span>current_recipe_name<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="Constant">' '</span> << 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> << <span class="Constant">" => "</span> << no_scientific<span class="Delimiter">(</span>after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">)</span> << <span class="Constant">" => "</span> << 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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L516" class="LineNr">516 </span> cerr << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<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="Constant">' '</span> << 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> << <span class="Constant">" => "</span> << no_scientific<span class="Delimiter">(</span>after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">)</span> << <span class="Constant">" => "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> after_canonize<span class="Delimiter">.</span>value<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L517" class="LineNr">517 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L518" class="LineNr">518 </span><span class="Delimiter">}</span> <span id="L519" class="LineNr">519 </span> @@ -585,11 +585,11 @@ if ('onhashchange' in window) { <span id="L524" class="LineNr">524 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L525" class="LineNr">525 </span>_BAR<span class="Delimiter">,</span> <span id="L526" class="LineNr">526 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L527" class="LineNr">527 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$bar"</span><span class="Delimiter">,</span> _BAR<span class="Delimiter">);</span> +<span id="L527" class="LineNr">527 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$bar"</span><span class="Delimiter">,</span> _BAR<span class="Delimiter">);</span> <span id="L528" class="LineNr">528 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L529" class="LineNr">529 </span><span class="Normal">case</span> _BAR: <span class="Delimiter">{</span> <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> -<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 << Bar << <span class="Constant">": "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> Bar<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<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 << Bar << <span class="Constant">": "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> Bar<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L532" class="LineNr">532 </span> <span class="Normal">else</span> cerr << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L533" class="LineNr">533 </span> <span class="Delimiter">}</span> <span id="L534" class="LineNr">534 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> diff --git a/html/036refcount.cc.html b/html/036refcount.cc.html index 44ea40d6..3d098b2d 100644 --- a/html/036refcount.cc.html +++ b/html/036refcount.cc.html @@ -63,11 +63,11 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span><span class="Comment">//: The top of the address layer has more on refcounts.</span> <span id="L3" class="LineNr"> 3 </span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario refcounts)</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ -<span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">1000</span>/unsafe -<span id="L7" class="LineNr"> 7 </span> <span class="Constant">2</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:num -<span id="L8" class="LineNr"> 8 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L9" class="LineNr"> 9 </span> <span class="Constant">2</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">1000</span>/unsafe +<span id="L7" class="LineNr"> 7 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L8" class="LineNr"> 8 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L9" class="LineNr"> 9 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L10" class="LineNr"> 10 </span>] <span id="L11" class="LineNr"> 11 </span><span class="traceContains">+run: {1: ("address" "number")} <- copy {1000: "literal", "unsafe": ()}</span> <span id="L12" class="LineNr"> 12 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -84,54 +84,54 @@ if ('onhashchange' in window) { <span id="L23" class="LineNr"> 23 </span> <span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before "End write_memory(x) Special-cases")</span> <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> -<span id="L26" class="LineNr"> 26 </span> update_any_refcounts<span class="Delimiter">(</span>x<span class="Delimiter">,</span> data<span class="Delimiter">);</span> +<span id="L26" class="LineNr"> 26 </span> <a href='036refcount.cc.html#L29'>update_any_refcounts</a><span class="Delimiter">(</span>x<span class="Delimiter">,</span> data<span class="Delimiter">);</span> <span id="L27" class="LineNr"> 27 </span> <span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(code)</span> -<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& canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector<<span class="Normal">double</span>>& data<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 <- copy x</span> -<span id="L31" class="LineNr"> 31 </span> decrement_any_refcounts<span class="Delimiter">(</span>canonized_x<span class="Delimiter">);</span> +<span id="L29" class="LineNr"> 29 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L29'>update_any_refcounts</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector<<span class="Normal">double</span>>& data<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L30" class="LineNr"> 30 </span> <a href='036refcount.cc.html#L34'>increment_any_refcounts</a><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 <- copy x</span> +<span id="L31" class="LineNr"> 31 </span> <a href='036refcount.cc.html#L51'>decrement_any_refcounts</a><span class="Delimiter">(</span>canonized_x<span class="Delimiter">);</span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">}</span> <span id="L33" class="LineNr"> 33 </span> -<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& canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector<<span class="Normal">double</span>>& data<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L34" class="LineNr"> 34 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L34'>increment_any_refcounts</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& canonized_x<span class="Delimiter">,</span> <span class="Normal">const</span> vector<<span class="Normal">double</span>>& data<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L36" class="LineNr"> 36 </span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>data<span class="Delimiter">));</span> <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> -<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> +<span id="L38" class="LineNr"> 38 </span> <a href='036refcount.cc.html#L43'>increment_refcount</a><span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <span id="L39" class="LineNr"> 39 </span> <span class="Delimiter">}</span> <span id="L40" class="LineNr"> 40 </span> <span class="Comment">// End Increment Refcounts(canonized_x)</span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">}</span> <span id="L42" class="LineNr"> 42 </span> -<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> +<span id="L43" class="LineNr"> 43 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L43'>increment_refcount</a><span class="Delimiter">(</span><span class="Normal">int</span> new_address<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L44" class="LineNr"> 44 </span> assert<span class="Delimiter">(</span>new_address >= <span class="Constant">0</span><span class="Delimiter">);</span> <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> -<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> -<span id="L47" class="LineNr"> 47 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"incrementing refcount of "</span> << new_address << <span class="Constant">": "</span> << new_refcount << <span class="Constant">" -> "</span> << new_refcount+<span class="Constant">1</span> << end<span class="Delimiter">();</span> -<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> +<span id="L46" class="LineNr"> 46 </span> <span class="Normal">int</span> new_refcount = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> new_address<span class="Delimiter">);</span> +<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"incrementing refcount of "</span> << new_address << <span class="Constant">": "</span> << new_refcount << <span class="Constant">" -> "</span> << new_refcount+<span class="Constant">1</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L48" class="LineNr"> 48 </span> <a href='001help.cc.html#L218'>put</a><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 id="L49" class="LineNr"> 49 </span><span class="Delimiter">}</span> <span id="L50" class="LineNr"> 50 </span> -<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& canonized_x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L51" class="LineNr"> 51 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L51'>decrement_any_refcounts</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& canonized_x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L53" class="LineNr"> 53 </span> assert<span class="Delimiter">(</span>canonized_x<span class="Delimiter">.</span>value<span class="Delimiter">);</span> <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> -<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> +<span id="L55" class="LineNr"> 55 </span> <a href='036refcount.cc.html#L60'>decrement_refcount</a><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>value<span class="Delimiter">),</span> <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">(</span>canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">),</span> <a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">(</span>canonized_x<span class="Delimiter">));</span> <span id="L56" class="LineNr"> 56 </span> <span class="Delimiter">}</span> <span id="L57" class="LineNr"> 57 </span> <span class="Comment">// End Decrement Refcounts(canonized_x)</span> <span id="L58" class="LineNr"> 58 </span><span class="Delimiter">}</span> <span id="L59" class="LineNr"> 59 </span> -<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> +<span id="L60" class="LineNr"> 60 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L60'>decrement_refcount</a><span class="Delimiter">(</span><span class="Normal">int</span> old_address<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">,</span> <span class="Normal">int</span> <a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L61" class="LineNr"> 61 </span> assert<span class="Delimiter">(</span>old_address >= <span class="Constant">0</span><span class="Delimiter">);</span> <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> -<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> -<span id="L64" class="LineNr"> 64 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"decrementing refcount of "</span> << old_address << <span class="Constant">": "</span> << old_refcount << <span class="Constant">" -> "</span> << old_refcount-<span class="Constant">1</span> << end<span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <span class="Normal">int</span> old_refcount = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> old_address<span class="Delimiter">);</span> +<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"decrementing refcount of "</span> << old_address << <span class="Constant">": "</span> << old_refcount << <span class="Constant">" -> "</span> << old_refcount-<span class="Constant">1</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L65" class="LineNr"> 65 </span> --old_refcount<span class="Delimiter">;</span> -<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> +<span id="L66" class="LineNr"> 66 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> old_address<span class="Delimiter">,</span> old_refcount<span class="Delimiter">);</span> <span id="L67" class="LineNr"> 67 </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> <span id="L68" class="LineNr"> 68 </span> tb_shutdown<span class="Delimiter">();</span> <span id="L69" class="LineNr"> 69 </span> cerr << <span class="Constant">"Negative refcount!!! "</span> << old_address << <span class="Constant">' '</span> << old_refcount << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <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> -<span id="L71" class="LineNr"> 71 </span> cerr << <span class="Constant">"Saving trace to last_trace.</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> +<span id="L71" class="LineNr"> 71 </span> cerr << <span class="Constant">"Saving <a href='003trace.cc.html#L171'>trace</a> to last_trace.</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> <span id="L72" class="LineNr"> 72 </span> ofstream fout<span class="Delimiter">(</span><span class="Constant">"last_trace"</span><span class="Delimiter">);</span> -<span id="L73" class="LineNr"> 73 </span> fout << Trace_stream<span class="Delimiter">-></span>readable_contents<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L73" class="LineNr"> 73 </span> fout << Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> <span id="L74" class="LineNr"> 74 </span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> <span id="L75" class="LineNr"> 75 </span> <span class="Delimiter">}</span> <span id="L76" class="LineNr"> 76 </span> exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> @@ -140,17 +140,17 @@ if ('onhashchange' in window) { <span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">}</span> <span id="L80" class="LineNr"> 80 </span><span class="Delimiter">}</span> <span id="L81" class="LineNr"> 81 </span> -<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> +<span id="L82" class="LineNr"> 82 </span><span class="Normal">int</span> <a href='036refcount.cc.html#L82'>payload_size</a><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 id="L83" class="LineNr"> 83 </span> x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"lookup"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> <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> <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> <span id="L86" class="LineNr"> 86 </span><span class="Delimiter">}</span> <span id="L87" class="LineNr"> 87 </span> <span id="L88" class="LineNr"> 88 </span><span class="Delimiter">:(scenario refcounts_reflexive)</span> -<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> main [ -<span id="L90" class="LineNr"> 90 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L90" class="LineNr"> 90 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L91" class="LineNr"> 91 </span> <span class="Comment"># idempotent copies leave refcount unchanged</span> -<span id="L92" class="LineNr"> 92 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:num +<span id="L92" class="LineNr"> 92 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L93" class="LineNr"> 93 </span>] <span id="L94" class="LineNr"> 94 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L95" class="LineNr"> 95 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -159,15 +159,15 @@ if ('onhashchange' in window) { <span id="L98" class="LineNr"> 98 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -> 1</span> <span id="L99" class="LineNr"> 99 </span> <span id="L100" class="LineNr"> 100 </span><span class="Delimiter">:(scenario refcounts_call)</span> -<span id="L101" class="LineNr"> 101 </span><span class="muRecipe">def</span> main [ -<span id="L102" class="LineNr"> 102 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L101" class="LineNr"> 101 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L102" class="LineNr"> 102 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L103" class="LineNr"> 103 </span> <span class="Comment"># passing in addresses to recipes increments refcount</span> -<span id="L104" class="LineNr"> 104 </span> foo <span class="Constant">1</span>:address:num +<span id="L104" class="LineNr"> 104 </span> foo <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L105" class="LineNr"> 105 </span> <span class="Comment"># return does NOT yet decrement refcount; memory must be explicitly managed</span> -<span id="L106" class="LineNr"> 106 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L106" class="LineNr"> 106 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L107" class="LineNr"> 107 </span>] <span id="L108" class="LineNr"> 108 </span><span class="muRecipe">def</span> foo [ -<span id="L109" class="LineNr"> 109 </span> <span class="Constant">2</span>:address:num<span class="Special"> <- </span>next-ingredient +<span id="L109" class="LineNr"> 109 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>next-ingredient <span id="L110" class="LineNr"> 110 </span>] <span id="L111" class="LineNr"> 111 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L112" class="LineNr"> 112 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -182,32 +182,32 @@ if ('onhashchange' in window) { <span id="L121" class="LineNr"> 121 </span> <span id="L122" class="LineNr"> 122 </span><span class="Delimiter">:(scenario refcounts_put)</span> <span id="L123" class="LineNr"> 123 </span><span class="muData">container</span> foo [ -<span id="L124" class="LineNr"> 124 </span> <span class="Normal">x</span>:address:num +<span id="L124" class="LineNr"> 124 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L125" class="LineNr"> 125 </span>] -<span id="L126" class="LineNr"> 126 </span><span class="muRecipe">def</span> main [ -<span id="L127" class="LineNr"> 127 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L128" class="LineNr"> 128 </span> <span class="Constant">2</span>:address:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> -<span id="L129" class="LineNr"> 129 </span> *<span class="Constant">2</span>:address:foo<span class="Special"> <- </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 id="L126" class="LineNr"> 126 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L127" class="LineNr"> 127 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L128" class="LineNr"> 128 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> +<span id="L129" class="LineNr"> 129 </span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L130" class="LineNr"> 130 </span>] <span id="L131" class="LineNr"> 131 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L132" class="LineNr"> 132 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> <span id="L133" class="LineNr"> 133 </span><span class="traceContains">+run: {2: ("address" "foo")} <- new {foo: "type"}</span> <span id="L134" class="LineNr"> 134 </span><span class="traceContains">+mem: incrementing refcount of 1002: 0 -> 1</span> -<span id="L135" class="LineNr"> 135 </span><span class="traceContains">+run: {2: ("address" "foo"), "lookup": ()} <- put {2: ("address" "foo"), "lookup": ()}, {x: "offset"}, {1: ("address" "number")}</span> +<span id="L135" class="LineNr"> 135 </span><span class="traceContains">+run: {2: ("address" "foo"), "lookup": ()} <- <a href='001help.cc.html#L218'>put</a> {2: ("address" "foo"), "lookup": ()}, {x: "offset"}, {1: ("address" "number")}</span> <span id="L136" class="LineNr"> 136 </span><span class="Comment"># put increments refcount</span> <span id="L137" class="LineNr"> 137 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -> 2</span> <span id="L138" class="LineNr"> 138 </span> <span id="L139" class="LineNr"> 139 </span><span class="Delimiter">:(after "Write Memory in PUT in Run")</span> -<span id="L140" class="LineNr"> 140 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span> +<span id="L140" class="LineNr"> 140 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span> <span id="L141" class="LineNr"> 141 </span>assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">"lookup"</span><span class="Delimiter">));</span> -<span id="L142" class="LineNr"> 142 </span>element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span> -<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> +<span id="L142" class="LineNr"> 142 </span>element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> +<span id="L143" class="LineNr"> 143 </span><a href='036refcount.cc.html#L29'>update_any_refcounts</a><span class="Delimiter">(</span>element<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span> <span id="L144" class="LineNr"> 144 </span> <span id="L145" class="LineNr"> 145 </span><span class="Delimiter">:(scenario refcounts_put_index)</span> -<span id="L146" class="LineNr"> 146 </span><span class="muRecipe">def</span> main [ -<span id="L147" class="LineNr"> 147 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L148" class="LineNr"> 148 </span> <span class="Constant">2</span>:address:array:address:num<span class="Special"> <- </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 id="L149" class="LineNr"> 149 </span> *<span class="Constant">2</span>:address:array:address:num<span class="Special"> <- </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 id="L146" class="LineNr"> 146 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L147" class="LineNr"> 147 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L148" class="LineNr"> 148 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span> +<span id="L149" class="LineNr"> 149 </span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>put-index *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:num<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L150" class="LineNr"> 150 </span>] <span id="L151" class="LineNr"> 151 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L152" class="LineNr"> 152 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -219,19 +219,19 @@ if ('onhashchange' in window) { <span id="L158" class="LineNr"> 158 </span> <span id="L159" class="LineNr"> 159 </span><span class="Delimiter">:(after "Write Memory in PUT_INDEX in Run")</span> <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> -<span id="L161" class="LineNr"> 161 </span>element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span> -<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> -<span id="L163" class="LineNr"> 163 </span>update_any_refcounts<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">);</span> +<span id="L161" class="LineNr"> 161 </span>element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> +<span id="L162" class="LineNr"> 162 </span>element<span class="Delimiter">.</span>type = <a href='032array.cc.html#L366'>copy_array_element</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<span id="L163" class="LineNr"> 163 </span><a href='036refcount.cc.html#L29'>update_any_refcounts</a><span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">);</span> <span id="L164" class="LineNr"> 164 </span> <span id="L165" class="LineNr"> 165 </span><span class="Delimiter">:(scenario refcounts_maybe_convert)</span> <span id="L166" class="LineNr"> 166 </span><span class="muData">exclusive-container</span> foo [ <span id="L167" class="LineNr"> 167 </span> <span class="Normal">x</span>:num -<span id="L168" class="LineNr"> 168 </span> <span class="Normal">p</span>:address:num +<span id="L168" class="LineNr"> 168 </span> <span class="Normal">p</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L169" class="LineNr"> 169 </span>] -<span id="L170" class="LineNr"> 170 </span><span class="muRecipe">def</span> main [ -<span id="L171" class="LineNr"> 171 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L172" class="LineNr"> 172 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/p<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num -<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"> <- </span>maybe-convert <span class="Constant">2</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:variant/p</span> +<span id="L170" class="LineNr"> 170 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L171" class="LineNr"> 171 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L172" class="LineNr"> 172 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/p<span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L173" class="LineNr"> 173 </span> <span class="Constant">4</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Delimiter">,</span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> <- </span>maybe-convert <span class="Constant">2</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:variant/p</span> <span id="L174" class="LineNr"> 174 </span>] <span id="L175" class="LineNr"> 175 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L176" class="LineNr"> 176 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -246,27 +246,27 @@ if ('onhashchange' in window) { <span id="L185" class="LineNr"> 185 </span><span class="Comment">// todo: double-check data here as well</span> <span id="L186" class="LineNr"> 186 </span>vector<<span class="Normal">double</span>> data<span class="Delimiter">;</span> <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 < size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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> -<span id="L189" class="LineNr"> 189 </span>update_any_refcounts<span class="Delimiter">(</span>product<span class="Delimiter">,</span> data<span class="Delimiter">);</span> +<span id="L188" class="LineNr"> 188 </span> data<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><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> +<span id="L189" class="LineNr"> 189 </span><a href='036refcount.cc.html#L29'>update_any_refcounts</a><span class="Delimiter">(</span>product<span class="Delimiter">,</span> data<span class="Delimiter">);</span> <span id="L190" class="LineNr"> 190 </span> <span id="L191" class="LineNr"> 191 </span><span class="SalientComment">//:: manage refcounts in instructions that copy multiple locations at a time</span> <span id="L192" class="LineNr"> 192 </span> <span id="L193" class="LineNr"> 193 </span><span class="Delimiter">:(scenario refcounts_copy_nested)</span> <span id="L194" class="LineNr"> 194 </span><span class="muData">container</span> foo [ -<span id="L195" class="LineNr"> 195 </span> <span class="Normal">x</span>:address:num <span class="Comment"># address inside container</span> +<span id="L195" class="LineNr"> 195 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span class="Comment"># address inside container</span> <span id="L196" class="LineNr"> 196 </span>] -<span id="L197" class="LineNr"> 197 </span><span class="muRecipe">def</span> main [ -<span id="L198" class="LineNr"> 198 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L199" class="LineNr"> 199 </span> <span class="Constant">2</span>:address:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> -<span id="L200" class="LineNr"> 200 </span> *<span class="Constant">2</span>:address:foo<span class="Special"> <- </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 id="L201" class="LineNr"> 201 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>copy *<span class="Constant">2</span>:address:foo +<span id="L197" class="LineNr"> 197 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L198" class="LineNr"> 198 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L199" class="LineNr"> 199 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> +<span id="L200" class="LineNr"> 200 </span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L201" class="LineNr"> 201 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>copy *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo <span id="L202" class="LineNr"> 202 </span>] -<span id="L203" class="LineNr"> 203 </span><span class="traceContains">+transform: compute address offsets for container foo</span> +<span id="L203" class="LineNr"> 203 </span><span class="traceContains">+transform: compute <a href='043space.cc.html#L76'>address</a> offsets for container foo</span> <span id="L204" class="LineNr"> 204 </span><span class="traceContains">+transform: checking container foo, element 0</span> -<span id="L205" class="LineNr"> 205 </span><span class="traceContains">+transform: address at offset 0</span> +<span id="L205" class="LineNr"> 205 </span><span class="traceContains">+transform: <a href='043space.cc.html#L76'>address</a> at offset 0</span> <span id="L206" class="LineNr"> 206 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L207" class="LineNr"> 207 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> -<span id="L208" class="LineNr"> 208 </span><span class="traceContains">+run: {2: ("address" "foo"), "lookup": ()} <- put {2: ("address" "foo"), "lookup": ()}, {x: "offset"}, {1: ("address" "number")}</span> +<span id="L208" class="LineNr"> 208 </span><span class="traceContains">+run: {2: ("address" "foo"), "lookup": ()} <- <a href='001help.cc.html#L218'>put</a> {2: ("address" "foo"), "lookup": ()}, {x: "offset"}, {1: ("address" "number")}</span> <span id="L209" class="LineNr"> 209 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -> 2</span> <span id="L210" class="LineNr"> 210 </span><span class="Comment"># copying a container increments refcounts of any contained addresses</span> <span id="L211" class="LineNr"> 211 </span><span class="traceContains">+run: {3: "foo"} <- copy {2: ("address" "foo"), "lookup": ()}</span> @@ -275,25 +275,25 @@ if ('onhashchange' in window) { <span id="L214" class="LineNr"> 214 </span><span class="Delimiter">:(after "End type_tree Definition")</span> <span id="L215" class="LineNr"> 215 </span><span class="Normal">struct</span> address_element_info <span class="Delimiter">{</span> <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> -<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> +<span id="L217" class="LineNr"> 217 </span> <span class="Normal">const</span> type_tree* <a href='030container.cc.html#L238'>payload_type</a><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> <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> <span id="L219" class="LineNr"> 219 </span> offset = o<span class="Delimiter">;</span> -<span id="L220" class="LineNr"> 220 </span> payload_type = p<span class="Delimiter">;</span> +<span id="L220" class="LineNr"> 220 </span> <a href='030container.cc.html#L238'>payload_type</a> = p<span class="Delimiter">;</span> <span id="L221" class="LineNr"> 221 </span> <span class="Delimiter">}</span> <span id="L222" class="LineNr"> 222 </span> address_element_info<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info& other<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L223" class="LineNr"> 223 </span> offset = other<span class="Delimiter">.</span>offset<span class="Delimiter">;</span> -<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> +<span id="L224" class="LineNr"> 224 </span> <a href='030container.cc.html#L238'>payload_type</a> = other<span class="Delimiter">.</span><a href='030container.cc.html#L238'>payload_type</a> ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L225" class="LineNr"> 225 </span> <span class="Delimiter">}</span> -<span id="L226" class="LineNr"> 226 </span> ~address_element_info<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> -<span id="L228" class="LineNr"> 228 </span> <span class="Normal">delete</span> payload_type<span class="Delimiter">;</span> -<span id="L229" class="LineNr"> 229 </span> payload_type = <span class="Constant">NULL</span><span class="Delimiter">;</span> +<span id="L226" class="LineNr"> 226 </span> <a href='036refcount.cc.html#L226'>~address_element_info</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L227" class="LineNr"> 227 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L228" class="LineNr"> 228 </span> <span class="Normal">delete</span> <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">;</span> +<span id="L229" class="LineNr"> 229 </span> <a href='030container.cc.html#L238'>payload_type</a> = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L230" class="LineNr"> 230 </span> <span class="Delimiter">}</span> <span id="L231" class="LineNr"> 231 </span> <span class="Delimiter">}</span> <span id="L232" class="LineNr"> 232 </span> address_element_info& <span class="Normal">operator</span>=<span class="Delimiter">(</span><span class="Normal">const</span> address_element_info& other<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L233" class="LineNr"> 233 </span> offset = other<span class="Delimiter">.</span>offset<span class="Delimiter">;</span> -<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> -<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> +<span id="L234" class="LineNr"> 234 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">)</span> <span class="Normal">delete</span> <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">;</span> +<span id="L235" class="LineNr"> 235 </span> <a href='030container.cc.html#L238'>payload_type</a> = other<span class="Delimiter">.</span><a href='030container.cc.html#L238'>payload_type</a> ? <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*other<span class="Delimiter">.</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">)</span> : <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L236" class="LineNr"> 236 </span> <span class="Identifier">return</span> *<span class="Normal">this</span><span class="Delimiter">;</span> <span id="L237" class="LineNr"> 237 </span> <span class="Delimiter">}</span> <span id="L238" class="LineNr"> 238 </span><span class="Delimiter">};</span> @@ -313,11 +313,11 @@ if ('onhashchange' in window) { <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> <span id="L253" class="LineNr"> 253 </span><span class="Comment">// for all address_element_infos:</span> <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> -<span id="L255" class="LineNr"> 255 </span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> > address<span class="Delimiter">;</span> +<span id="L255" class="LineNr"> 255 </span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> > <a href='043space.cc.html#L76'>address</a><span class="Delimiter">;</span> <span id="L256" class="LineNr"> 256 </span><span class="Delimiter">:(code)</span> <span id="L257" class="LineNr"> 257 </span><span class="Normal">bool</span> <span class="Normal">operator</span><<span class="Delimiter">(</span><span class="Normal">const</span> set<tag_condition_info>& a<span class="Delimiter">,</span> <span class="Normal">const</span> set<tag_condition_info>& b<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> < b<span class="Delimiter">.</span>size<span class="Delimiter">();</span> -<span id="L259" class="LineNr"> 259 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<tag_condition_info>::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 id="L259" class="LineNr"> 259 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<tag_condition_info>::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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++pa<span class="Delimiter">,</span> ++pb<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L260" class="LineNr"> 260 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-></span>offset != pb<span class="Delimiter">-></span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-></span>offset < pb<span class="Delimiter">-></span>offset<span class="Delimiter">;</span> <span id="L261" class="LineNr"> 261 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-></span>tag != pb<span class="Delimiter">-></span>tag<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-></span>tag < pb<span class="Delimiter">-></span>tag<span class="Delimiter">;</span> <span id="L262" class="LineNr"> 262 </span> <span class="Delimiter">}</span> @@ -330,7 +330,7 @@ if ('onhashchange' in window) { <span id="L269" class="LineNr"> 269 </span><span class="Delimiter">}</span> <span id="L270" class="LineNr"> 270 </span><span class="Normal">bool</span> <span class="Normal">operator</span><<span class="Delimiter">(</span><span class="Normal">const</span> set<address_element_info>& a<span class="Delimiter">,</span> <span class="Normal">const</span> set<address_element_info>& b<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> < b<span class="Delimiter">.</span>size<span class="Delimiter">();</span> -<span id="L272" class="LineNr"> 272 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::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 id="L272" class="LineNr"> 272 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++pa<span class="Delimiter">,</span> ++pb<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L273" class="LineNr"> 273 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>pa<span class="Delimiter">-></span>offset != pb<span class="Delimiter">-></span>offset<span class="Delimiter">)</span> <span class="Identifier">return</span> pa<span class="Delimiter">-></span>offset < pb<span class="Delimiter">-></span>offset<span class="Delimiter">;</span> <span id="L274" class="LineNr"> 274 </span> <span class="Delimiter">}</span> <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> @@ -346,15 +346,15 @@ if ('onhashchange' in window) { <span id="L285" class="LineNr"> 285 </span><span class="Delimiter">:(after "Transform.push_back(compute_container_sizes)")</span> <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> <span id="L287" class="LineNr"> 287 </span><span class="Delimiter">:(code)</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L289" class="LineNr"> 289 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L290" class="LineNr"> 290 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- compute address offsets for "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L290" class="LineNr"> 290 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- compute <a href='043space.cc.html#L76'>address</a> offsets for "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L292" class="LineNr"> 292 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L293" class="LineNr"> 293 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"- compute address offsets for "</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L293" class="LineNr"> 293 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"- compute <a href='043space.cc.html#L76'>address</a> offsets for "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="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">" in '"</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">"'"</span><span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="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">" in '"</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">"'"</span><span class="Delimiter">);</span> <span id="L298" class="LineNr"> 298 </span> <span class="Delimiter">}</span> <span id="L299" class="LineNr"> 299 </span><span class="Delimiter">}</span> @@ -372,84 +372,84 @@ if ('onhashchange' in window) { <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> <span id="L312" class="LineNr"> 312 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L313" class="LineNr"> 313 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L314" class="LineNr"> 314 </span> raise << <span class="Constant">"invalid type "</span> << to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L314" class="LineNr"> 314 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid type "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>type<span class="Delimiter">)</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L315" class="LineNr"> 315 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L316" class="LineNr"> 316 </span> <span class="Delimiter">}</span> <span id="L317" class="LineNr"> 317 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>name == <span class="Constant">"address"</span><span class="Delimiter">)</span> -<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> +<span id="L318" class="LineNr"> 318 </span> compute_container_address_offsets<span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">(</span>type<span class="Delimiter">),</span> location_for_error_messages<span class="Delimiter">);</span> <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">-></span>left<span class="Delimiter">-></span>name == <span class="Constant">"array"</span><span class="Delimiter">)</span> -<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> +<span id="L320" class="LineNr"> 320 </span> compute_container_address_offsets<span class="Delimiter">(</span><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>type<span class="Delimiter">),</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L321" class="LineNr"> 321 </span> <span class="Comment">// End compute_container_address_offsets Non-atom Special-cases</span> <span id="L322" class="LineNr"> 322 </span> <span class="Delimiter">}</span> <span id="L323" class="LineNr"> 323 </span> <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span> <span id="L324" class="LineNr"> 324 </span> <span class="Comment">// Update base_type in compute_container_address_offsets</span> <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">-></span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L326" class="LineNr"> 326 </span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="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> +<span id="L327" class="LineNr"> 327 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L329" class="LineNr"> 329 </span> <span class="Delimiter">}</span> -<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> -<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> +<span id="L330" class="LineNr"> 330 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L331" class="LineNr"> 331 </span> <a href='036refcount.cc.html#L342'>compute_exclusive_container_address_offsets</a><span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L332" class="LineNr"> 332 </span> <span class="Delimiter">}</span> <span id="L333" class="LineNr"> 333 </span><span class="Delimiter">}</span> <span id="L334" class="LineNr"> 334 </span> <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& 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& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L336" class="LineNr"> 336 </span> container_metadata& metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> full_type<span class="Delimiter">);</span> -<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> -<span id="L338" class="LineNr"> 338 </span> trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"compute address offsets for container "</span> << container_info<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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<tag_condition_info><span class="Delimiter">(),</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L337" class="LineNr"> 337 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L338" class="LineNr"> 338 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"compute <a href='043space.cc.html#L76'>address</a> offsets for container "</span> << container_info<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L339" class="LineNr"> 339 </span> <a href='036refcount.cc.html#L352'>append_addresses</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">(),</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L340" class="LineNr"> 340 </span><span class="Delimiter">}</span> <span id="L341" class="LineNr"> 341 </span> -<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& 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& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L342" class="LineNr"> 342 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L342'>compute_exclusive_container_address_offsets</a><span class="Delimiter">(</span><span class="Normal">const</span> type_info& 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& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L343" class="LineNr"> 343 </span> container_metadata& metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> full_type<span class="Delimiter">);</span> -<span id="L344" class="LineNr"> 344 </span> trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"compute address offsets for exclusive container "</span> << exclusive_container_info<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < 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> +<span id="L344" class="LineNr"> 344 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"compute <a href='043space.cc.html#L76'>address</a> offsets for exclusive container "</span> << exclusive_container_info<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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> <span id="L346" class="LineNr"> 346 </span> set<tag_condition_info> key<span class="Delimiter">;</span> <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> -<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> +<span id="L348" class="LineNr"> 348 </span> <a href='036refcount.cc.html#L352'>append_addresses</a><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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> key<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L349" class="LineNr"> 349 </span> <span class="Delimiter">}</span> <span id="L350" class="LineNr"> 350 </span><span class="Delimiter">}</span> <span id="L351" class="LineNr"> 351 </span> -<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<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >& out<span class="Delimiter">,</span> <span class="Normal">const</span> set<tag_condition_info>& key<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L352" class="LineNr"> 352 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L352'>append_addresses</a><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<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >& out<span class="Delimiter">,</span> <span class="Normal">const</span> set<tag_condition_info>& key<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L353" class="LineNr"> 353 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<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> +<span id="L354" class="LineNr"> 354 </span> <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L355" class="LineNr"> 355 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L356" class="LineNr"> 356 </span> <span class="Delimiter">}</span> <span id="L357" class="LineNr"> 357 </span> <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span> <span id="L358" class="LineNr"> 358 </span> <span class="Comment">// Update base_type in append_container_address_offsets</span> <span id="L359" class="LineNr"> 359 </span> <span class="Normal">const</span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="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> -<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 < 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> -<span id="L362" class="LineNr"> 362 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking container "</span> << base_type<span class="Delimiter">-></span>name << <span class="Constant">", element "</span> << curr_index << end<span class="Delimiter">();</span> -<span id="L363" class="LineNr"> 363 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = 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 id="L360" class="LineNr"> 360 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L361" class="LineNr"> 361 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr_index = <span class="Constant">0</span><span class="Delimiter">,</span> curr_offset = base_offset<span class="Delimiter">;</span> curr_index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++curr_index<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L362" class="LineNr"> 362 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking container "</span> << base_type<span class="Delimiter">-></span>name << <span class="Constant">", element "</span> << curr_index << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L363" class="LineNr"> 363 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> curr_index<span class="Delimiter">);</span> <span class="Comment">// not base_type</span> <span id="L364" class="LineNr"> 364 </span> <span class="Comment">// Compute Container Address Offset(element)</span> <span id="L365" class="LineNr"> 365 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L366" class="LineNr"> 366 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"address at offset "</span> << curr_offset << end<span class="Delimiter">();</span> -<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> +<span id="L366" class="LineNr"> 366 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"address at offset "</span> << curr_offset << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L367" class="LineNr"> 367 </span> <a href='001help.cc.html#L225'>get_or_insert</a><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> <span id="L368" class="LineNr"> 368 </span> ++curr_offset<span class="Delimiter">;</span> <span id="L369" class="LineNr"> 369 </span> <span class="Delimiter">}</span> <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> <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> -<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> +<span id="L372" class="LineNr"> 372 </span> <span class="Normal">const</span> type_tree* array_element_type = <a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <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> -<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 < 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> -<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> +<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 < <a href='032array.cc.html#L117'>static_array_length</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L375" class="LineNr"> 375 </span> <a href='036refcount.cc.html#L352'>append_addresses</a><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> <span id="L376" class="LineNr"> 376 </span> curr_offset += array_element_size<span class="Delimiter">;</span> <span id="L377" class="LineNr"> 377 </span> <span class="Delimiter">}</span> <span id="L378" class="LineNr"> 378 </span> <span class="Delimiter">}</span> <span id="L379" class="LineNr"> 379 </span> <span class="Normal">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> -<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> +<span id="L380" class="LineNr"> 380 </span> <a href='036refcount.cc.html#L352'>append_addresses</a><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> <span id="L381" class="LineNr"> 381 </span> curr_offset += size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span> <span id="L382" class="LineNr"> 382 </span> <span class="Delimiter">}</span> <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> <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> <span id="L385" class="LineNr"> 385 </span> <span class="Comment">// Update element_base_type For Exclusive Container in append_addresses</span> <span id="L386" class="LineNr"> 386 </span> <span class="Normal">const</span> type_info& element_info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> element_base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<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 < 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>element_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L388" class="LineNr"> 388 </span> set<tag_condition_info> new_key = key<span class="Delimiter">;</span> <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> <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> -<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> +<span id="L391" class="LineNr"> 391 </span> <a href='036refcount.cc.html#L352'>append_addresses</a><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 id="L392" class="LineNr"> 392 </span> <span class="Delimiter">}</span> <span id="L393" class="LineNr"> 393 </span> curr_offset += size_of<span class="Delimiter">(</span>element<span class="Delimiter">);</span> <span id="L394" class="LineNr"> 394 </span> <span class="Delimiter">}</span> @@ -459,12 +459,12 @@ if ('onhashchange' in window) { <span id="L398" class="LineNr"> 398 </span> <span class="Delimiter">}</span> <span id="L399" class="LineNr"> 399 </span> <span class="Delimiter">}</span> <span id="L400" class="LineNr"> 400 </span> <span class="Delimiter">}</span> -<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> -<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 < SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++tag<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L403" class="LineNr"> 403 </span> set<tag_condition_info> new_key = key<span class="Delimiter">;</span> <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> <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> -<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> +<span id="L406" class="LineNr"> 406 </span> <a href='036refcount.cc.html#L352'>append_addresses</a><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 id="L407" class="LineNr"> 407 </span> <span class="Delimiter">}</span> <span id="L408" class="LineNr"> 408 </span> <span class="Delimiter">}</span> <span id="L409" class="LineNr"> 409 </span><span class="Delimiter">}</span> @@ -472,8 +472,8 @@ if ('onhashchange' in window) { <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> <span id="L412" class="LineNr"> 412 </span> <span id="L413" class="LineNr"> 413 </span><span class="Delimiter">:(before "End Unit Tests")</span> -<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> -<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> +<span id="L414" class="LineNr"> 414 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L414'>test_container_address_offsets_empty</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L415" class="LineNr"> 415 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L416" class="LineNr"> 416 </span> <span class="Comment">// define a container with no addresses</span> <span id="L417" class="LineNr"> 417 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> <span id="L418" class="LineNr"> 418 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> @@ -481,21 +481,21 @@ if ('onhashchange' in window) { <span id="L420" class="LineNr"> 420 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L421" class="LineNr"> 421 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L422" class="LineNr"> 422 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L423" class="LineNr"> 423 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L424" class="LineNr"> 424 </span> <span class="Comment">// the reagent we scanned knows it has no addresses</span> -<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> +<span id="L425" class="LineNr"> 425 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L426" class="LineNr"> 426 </span> <span class="Comment">// the global table contains an identical entry</span> -<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> -<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> +<span id="L427" class="LineNr"> 427 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L428" class="LineNr"> 428 </span> <a href='002test.cc.html#L25'>CHECK</a><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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L429" class="LineNr"> 429 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L430" class="LineNr"> 430 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L431" class="LineNr"> 431 </span><span class="Delimiter">}</span> <span id="L432" class="LineNr"> 432 </span> -<span id="L433" class="LineNr"> 433 </span><span class="Normal">void</span> test_container_address_offsets<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> +<span id="L433" class="LineNr"> 433 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L433'>test_container_address_offsets</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L434" class="LineNr"> 434 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <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> <span id="L436" class="LineNr"> 436 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L437" class="LineNr"> 437 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L437" class="LineNr"> 437 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L438" class="LineNr"> 438 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L439" class="LineNr"> 439 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> <span id="L440" class="LineNr"> 440 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> @@ -503,64 +503,64 @@ if ('onhashchange' in window) { <span id="L442" class="LineNr"> 442 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L443" class="LineNr"> 443 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L444" class="LineNr"> 444 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L445" class="LineNr"> 445 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L446" class="LineNr"> 446 </span> <span class="Comment">// the reagent we scanned knows it has an address at offset 0</span> -<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> -<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<tag_condition_info><span class="Delimiter">()));</span> -<span id="L449" class="LineNr"> 449 </span> <span class="Normal">const</span> set<address_element_info>& address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> <span class="Comment">// unconditional for containers</span> -<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> -<span id="L451" class="LineNr"> 451 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L452" class="LineNr"> 452 </span> CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L453" class="LineNr"> 453 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L447" class="LineNr"> 447 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L448" class="LineNr"> 448 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">()));</span> +<span id="L449" class="LineNr"> 449 </span> <span class="Normal">const</span> set<address_element_info>& address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> <span class="Comment">// unconditional for containers</span> +<span id="L450" class="LineNr"> 450 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L451" class="LineNr"> 451 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L452" class="LineNr"> 452 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L453" class="LineNr"> 453 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L454" class="LineNr"> 454 </span> <span class="Comment">// the global table contains an identical entry</span> -<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> -<span id="L456" class="LineNr"> 456 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L458" class="LineNr"> 458 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L459" class="LineNr"> 459 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L460" class="LineNr"> 460 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L455" class="LineNr"> 455 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L456" class="LineNr"> 456 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L457" class="LineNr"> 457 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L458" class="LineNr"> 458 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L459" class="LineNr"> 459 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L460" class="LineNr"> 460 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L461" class="LineNr"> 461 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L462" class="LineNr"> 462 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L463" class="LineNr"> 463 </span><span class="Delimiter">}</span> <span id="L464" class="LineNr"> 464 </span> -<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> -<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> +<span id="L465" class="LineNr"> 465 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L465'>test_container_address_offsets_2</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L466" class="LineNr"> 466 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <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> <span id="L468" class="LineNr"> 468 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L469" class="LineNr"> 469 </span> <span class="Constant">" x:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L470" class="LineNr"> 470 </span> <span class="Constant">" y:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L470" class="LineNr"> 470 </span> <span class="Constant">" y:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L471" class="LineNr"> 471 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L472" class="LineNr"> 472 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> <span id="L473" class="LineNr"> 473 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L474" class="LineNr"> 474 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L475" class="LineNr"> 475 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L476" class="LineNr"> 476 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L477" class="LineNr"> 477 </span> <span class="Comment">// scan</span> <span id="L478" class="LineNr"> 478 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L479" class="LineNr"> 479 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L480" class="LineNr"> 480 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L481" class="LineNr"> 481 </span> <span class="Comment">// the reagent we scanned knows it has an address at offset 1</span> -<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> -<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<tag_condition_info><span class="Delimiter">()));</span> -<span id="L484" class="LineNr"> 484 </span> <span class="Normal">const</span> set<address_element_info>& address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L486" class="LineNr"> 486 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">//</span> -<span id="L487" class="LineNr"> 487 </span> CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L488" class="LineNr"> 488 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L482" class="LineNr"> 482 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L483" class="LineNr"> 483 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">()));</span> +<span id="L484" class="LineNr"> 484 </span> <span class="Normal">const</span> set<address_element_info>& address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L485" class="LineNr"> 485 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L486" class="LineNr"> 486 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">//</span> +<span id="L487" class="LineNr"> 487 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L488" class="LineNr"> 488 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L489" class="LineNr"> 489 </span> <span class="Comment">// the global table contains an identical entry</span> -<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> -<span id="L491" class="LineNr"> 491 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L493" class="LineNr"> 493 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">//</span> -<span id="L494" class="LineNr"> 494 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L495" class="LineNr"> 495 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L490" class="LineNr"> 490 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L491" class="LineNr"> 491 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L492" class="LineNr"> 492 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L493" class="LineNr"> 493 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">//</span> +<span id="L494" class="LineNr"> 494 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L495" class="LineNr"> 495 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L496" class="LineNr"> 496 </span><span class="Delimiter">}</span> <span id="L497" class="LineNr"> 497 </span> -<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> -<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> +<span id="L498" class="LineNr"> 498 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L498'>test_container_address_offsets_nested</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L499" class="LineNr"> 499 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L500" class="LineNr"> 500 </span> <span class="Comment">// define a container with a nested container containing an address</span> <span id="L501" class="LineNr"> 501 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L502" class="LineNr"> 502 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L502" class="LineNr"> 502 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L503" class="LineNr"> 503 </span> <span class="Constant">" y:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L504" class="LineNr"> 504 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L505" class="LineNr"> 505 </span> <span class="Constant">"container bar [</span><span class="cSpecial">\n</span><span class="Constant">"</span> @@ -571,176 +571,176 @@ if ('onhashchange' in window) { <span id="L510" class="LineNr"> 510 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L511" class="LineNr"> 511 </span> <span class="Comment">// global metadata contains entries for bar and included types: point and foo</span> <span id="L512" class="LineNr"> 512 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L513" class="LineNr"> 513 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L514" class="LineNr"> 514 </span> <span class="Comment">// scan</span> <span id="L515" class="LineNr"> 515 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L516" class="LineNr"> 516 </span> <span class="Comment">// the reagent we scanned knows it has an address at offset 2</span> -<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> -<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<tag_condition_info><span class="Delimiter">()));</span> -<span id="L519" class="LineNr"> 519 </span> <span class="Normal">const</span> set<address_element_info>& address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L521" class="LineNr"> 521 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">//</span> -<span id="L522" class="LineNr"> 522 </span> CHECK<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L523" class="LineNr"> 523 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L517" class="LineNr"> 517 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L518" class="LineNr"> 518 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">()));</span> +<span id="L519" class="LineNr"> 519 </span> <span class="Normal">const</span> set<address_element_info>& address_offsets = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L520" class="LineNr"> 520 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L521" class="LineNr"> 521 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">//</span> +<span id="L522" class="LineNr"> 522 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L523" class="LineNr"> 523 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L524" class="LineNr"> 524 </span> <span class="Comment">// the global table also knows its address offset</span> -<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> -<span id="L526" class="LineNr"> 526 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L528" class="LineNr"> 528 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">//</span> -<span id="L529" class="LineNr"> 529 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L530" class="LineNr"> 530 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L525" class="LineNr"> 525 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L526" class="LineNr"> 526 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L527" class="LineNr"> 527 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L528" class="LineNr"> 528 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">//</span> +<span id="L529" class="LineNr"> 529 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L530" class="LineNr"> 530 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L531" class="LineNr"> 531 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L532" class="LineNr"> 532 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L533" class="LineNr"> 533 </span><span class="Delimiter">}</span> <span id="L534" class="LineNr"> 534 </span> -<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> -<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> +<span id="L535" class="LineNr"> 535 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L535'>test_container_address_offsets_from_address</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L536" class="LineNr"> 536 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L537" class="LineNr"> 537 </span> <span class="Comment">// define a container with an address at offset 0</span> <span id="L538" class="LineNr"> 538 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L539" class="LineNr"> 539 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L539" class="LineNr"> 539 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L540" class="LineNr"> 540 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L541" class="LineNr"> 541 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:foo"</span><span class="Delimiter">);</span> +<span id="L541" class="LineNr"> 541 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:foo"</span><span class="Delimiter">);</span> <span id="L542" class="LineNr"> 542 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L543" class="LineNr"> 543 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L544" class="LineNr"> 544 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L545" class="LineNr"> 545 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L546" class="LineNr"> 546 </span> <span class="Comment">// scan an address to the container</span> <span id="L547" class="LineNr"> 547 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L548" class="LineNr"> 548 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L549" class="LineNr"> 549 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L550" class="LineNr"> 550 </span> <span class="Comment">// scanning precomputed metadata for the container</span> <span id="L551" class="LineNr"> 551 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> -<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> -<span id="L553" class="LineNr"> 553 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L555" class="LineNr"> 555 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L556" class="LineNr"> 556 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L557" class="LineNr"> 557 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L552" class="LineNr"> 552 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L553" class="LineNr"> 553 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L554" class="LineNr"> 554 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L555" class="LineNr"> 555 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L556" class="LineNr"> 556 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L557" class="LineNr"> 557 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L558" class="LineNr"> 558 </span><span class="Delimiter">}</span> <span id="L559" class="LineNr"> 559 </span> -<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> -<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> +<span id="L560" class="LineNr"> 560 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L560'>test_container_address_offsets_from_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L561" class="LineNr"> 561 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L562" class="LineNr"> 562 </span> <span class="Comment">// define a container with an address at offset 0</span> <span id="L563" class="LineNr"> 563 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L564" class="LineNr"> 564 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L564" class="LineNr"> 564 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L565" class="LineNr"> 565 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L566" class="LineNr"> 566 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:array:foo"</span><span class="Delimiter">);</span> <span id="L567" class="LineNr"> 567 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L568" class="LineNr"> 568 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L569" class="LineNr"> 569 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L570" class="LineNr"> 570 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L571" class="LineNr"> 571 </span> <span class="Comment">// scan an array of the container</span> <span id="L572" class="LineNr"> 572 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L573" class="LineNr"> 573 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L574" class="LineNr"> 574 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L575" class="LineNr"> 575 </span> <span class="Comment">// scanning precomputed metadata for the container</span> <span id="L576" class="LineNr"> 576 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> -<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> -<span id="L578" class="LineNr"> 578 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L580" class="LineNr"> 580 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L581" class="LineNr"> 581 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L582" class="LineNr"> 582 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L577" class="LineNr"> 577 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L578" class="LineNr"> 578 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L579" class="LineNr"> 579 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L580" class="LineNr"> 580 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L581" class="LineNr"> 581 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L582" class="LineNr"> 582 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L583" class="LineNr"> 583 </span><span class="Delimiter">}</span> <span id="L584" class="LineNr"> 584 </span> -<span id="L585" class="LineNr"> 585 </span><span class="Normal">void</span> test_container_address_offsets_from_address_to_array<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> +<span id="L585" class="LineNr"> 585 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L585'>test_container_address_offsets_from_address_to_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L586" class="LineNr"> 586 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L587" class="LineNr"> 587 </span> <span class="Comment">// define a container with an address at offset 0</span> <span id="L588" class="LineNr"> 588 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L589" class="LineNr"> 589 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L589" class="LineNr"> 589 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L590" class="LineNr"> 590 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L591" class="LineNr"> 591 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:array:foo"</span><span class="Delimiter">);</span> +<span id="L591" class="LineNr"> 591 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:array:foo"</span><span class="Delimiter">);</span> <span id="L592" class="LineNr"> 592 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L593" class="LineNr"> 593 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L594" class="LineNr"> 594 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L595" class="LineNr"> 595 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L596" class="LineNr"> 596 </span> <span class="Comment">// scan an address to an array of the container</span> <span id="L597" class="LineNr"> 597 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L598" class="LineNr"> 598 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L599" class="LineNr"> 599 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L600" class="LineNr"> 600 </span> <span class="Comment">// scanning precomputed metadata for the container</span> <span id="L601" class="LineNr"> 601 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> -<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> -<span id="L603" class="LineNr"> 603 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L605" class="LineNr"> 605 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L606" class="LineNr"> 606 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L607" class="LineNr"> 607 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L602" class="LineNr"> 602 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L603" class="LineNr"> 603 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L604" class="LineNr"> 604 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L605" class="LineNr"> 605 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L606" class="LineNr"> 606 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L607" class="LineNr"> 607 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L608" class="LineNr"> 608 </span><span class="Delimiter">}</span> <span id="L609" class="LineNr"> 609 </span> -<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> -<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> +<span id="L610" class="LineNr"> 610 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L610'>test_container_address_offsets_from_static_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L611" class="LineNr"> 611 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L612" class="LineNr"> 612 </span> <span class="Comment">// define a container with an address at offset 0</span> <span id="L613" class="LineNr"> 613 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L614" class="LineNr"> 614 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L614" class="LineNr"> 614 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L615" class="LineNr"> 615 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L616" class="LineNr"> 616 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:array:foo:10"</span><span class="Delimiter">);</span> <span id="L617" class="LineNr"> 617 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L618" class="LineNr"> 618 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L619" class="LineNr"> 619 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L620" class="LineNr"> 620 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L621" class="LineNr"> 621 </span> <span class="Comment">// scan a static array of the container</span> <span id="L622" class="LineNr"> 622 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L623" class="LineNr"> 623 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L624" class="LineNr"> 624 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L625" class="LineNr"> 625 </span> <span class="Comment">// scanning precomputed metadata for the container</span> <span id="L626" class="LineNr"> 626 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> -<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> -<span id="L628" class="LineNr"> 628 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L630" class="LineNr"> 630 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L631" class="LineNr"> 631 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L632" class="LineNr"> 632 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L627" class="LineNr"> 627 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L628" class="LineNr"> 628 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L629" class="LineNr"> 629 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L630" class="LineNr"> 630 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L631" class="LineNr"> 631 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L632" class="LineNr"> 632 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L633" class="LineNr"> 633 </span><span class="Delimiter">}</span> <span id="L634" class="LineNr"> 634 </span> -<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> -<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> +<span id="L635" class="LineNr"> 635 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L635'>test_container_address_offsets_from_address_to_static_array</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L636" class="LineNr"> 636 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L637" class="LineNr"> 637 </span> <span class="Comment">// define a container with an address at offset 0</span> <span id="L638" class="LineNr"> 638 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L639" class="LineNr"> 639 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L639" class="LineNr"> 639 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L640" class="LineNr"> 640 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L641" class="LineNr"> 641 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:array:foo:10"</span><span class="Delimiter">);</span> +<span id="L641" class="LineNr"> 641 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:array:foo:10"</span><span class="Delimiter">);</span> <span id="L642" class="LineNr"> 642 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L643" class="LineNr"> 643 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L644" class="LineNr"> 644 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L645" class="LineNr"> 645 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L646" class="LineNr"> 646 </span> <span class="Comment">// scan an address to a static array of the container</span> <span id="L647" class="LineNr"> 647 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L648" class="LineNr"> 648 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L649" class="LineNr"> 649 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L650" class="LineNr"> 650 </span> <span class="Comment">// scanning precomputed metadata for the container</span> <span id="L651" class="LineNr"> 651 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> -<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> -<span id="L653" class="LineNr"> 653 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L655" class="LineNr"> 655 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L656" class="LineNr"> 656 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L657" class="LineNr"> 657 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L652" class="LineNr"> 652 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L653" class="LineNr"> 653 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L654" class="LineNr"> 654 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L655" class="LineNr"> 655 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L656" class="LineNr"> 656 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L657" class="LineNr"> 657 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L658" class="LineNr"> 658 </span><span class="Delimiter">}</span> <span id="L659" class="LineNr"> 659 </span> -<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> -<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> +<span id="L660" class="LineNr"> 660 </span><span class="Normal">void</span> <a href='036refcount.cc.html#L660'>test_container_address_offsets_from_repeated_address_and_array_types</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L661" class="LineNr"> 661 </span> <span class="Normal">int</span> old_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span> <span id="L662" class="LineNr"> 662 </span> <span class="Comment">// define a container with an address at offset 0</span> <span id="L663" class="LineNr"> 663 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L664" class="LineNr"> 664 </span> <span class="Constant">" x:address:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L664" class="LineNr"> 664 </span> <span class="Constant">" x:<a href='043space.cc.html#L76'>address</a>:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L665" class="LineNr"> 665 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L666" class="LineNr"> 666 </span> <span class="Comment">// scan a deep nest of 'address' and 'array' types modifying a container</span> -<span id="L667" class="LineNr"> 667 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:address:array:address:address:array:foo:10"</span><span class="Delimiter">);</span> +<span id="L667" class="LineNr"> 667 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:<a href='043space.cc.html#L76'>address</a>:array:foo:10"</span><span class="Delimiter">);</span> <span id="L668" class="LineNr"> 668 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span class="Comment">// need to first pre-populate the metadata</span> <span id="L669" class="LineNr"> 669 </span> <span class="Comment">// global metadata contains just the entry for foo</span> <span id="L670" class="LineNr"> 670 </span> <span class="Comment">// no entries for non-container types or other junk</span> -<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> +<span id="L671" class="LineNr"> 671 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L672" class="LineNr"> 672 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L673" class="LineNr"> 673 </span> <span class="Comment">// compute_container_address_offsets creates no new entries</span> -<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> +<span id="L674" class="LineNr"> 674 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L675" class="LineNr"> 675 </span> <span class="Comment">// scanning precomputed metadata for the container</span> <span id="L676" class="LineNr"> 676 </span> reagent container<span class="Delimiter">(</span><span class="Constant">"x:foo"</span><span class="Delimiter">);</span> -<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> -<span id="L678" class="LineNr"> 678 </span> <span class="Normal">const</span> set<address_element_info>& 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<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L680" class="LineNr"> 680 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L681" class="LineNr"> 681 </span> CHECK<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L682" class="LineNr"> 682 </span> CHECK_EQ<span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L677" class="LineNr"> 677 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span> +<span id="L678" class="LineNr"> 678 </span> <span class="Normal">const</span> set<address_element_info>& 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><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L679" class="LineNr"> 679 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L680" class="LineNr"> 680 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L681" class="LineNr"> 681 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L682" class="LineNr"> 682 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>address_offsets2<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L683" class="LineNr"> 683 </span><span class="Delimiter">}</span> <span id="L684" class="LineNr"> 684 </span> <span id="L685" class="LineNr"> 685 </span><span class="Comment">//: use metadata.address to update refcounts within containers, arrays and</span> @@ -749,38 +749,38 @@ if ('onhashchange' in window) { <span id="L688" class="LineNr"> 688 </span><span class="Delimiter">:(before "End Increment Refcounts(canonized_x)")</span> <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> <span id="L690" class="LineNr"> 690 </span> <span class="Normal">const</span> container_metadata& metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L691" class="LineNr"> 691 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >::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 id="L691" class="LineNr"> 691 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >::const_iterator p = metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L693" class="LineNr"> 693 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::const_iterator info = p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> info != p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++info<span class="Delimiter">)</span> -<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">-></span>offset<span class="Delimiter">));</span> +<span id="L693" class="LineNr"> 693 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::const_iterator info = p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> info != p<span class="Delimiter">-></span>second<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++info<span class="Delimiter">)</span> +<span id="L694" class="LineNr"> 694 </span> <a href='036refcount.cc.html#L43'>increment_refcount</a><span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span>info<span class="Delimiter">-></span>offset<span class="Delimiter">));</span> <span id="L695" class="LineNr"> 695 </span> <span class="Delimiter">}</span> <span id="L696" class="LineNr"> 696 </span><span class="Delimiter">}</span> <span id="L697" class="LineNr"> 697 </span> <span id="L698" class="LineNr"> 698 </span><span class="Delimiter">:(before "End Decrement Refcounts(canonized_x)")</span> <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> -<span id="L700" class="LineNr"> 700 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"need to read old value of '"</span> << to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> << <span class="Constant">"' to figure out what refcounts to decrement"</span> << end<span class="Delimiter">();</span> +<span id="L700" class="LineNr"> 700 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"need to read old value of '"</span> << to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> << <span class="Constant">"' to figure out what refcounts to decrement"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L701" class="LineNr"> 701 </span> <span class="Comment">// read from canonized_x but without canonizing again</span> <span id="L702" class="LineNr"> 702 </span> <span class="Comment">// todo: inline without running canonize all over again</span> <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> <span id="L704" class="LineNr"> 704 </span> tmp<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"raw"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> <span id="L705" class="LineNr"> 705 </span> vector<<span class="Normal">double</span>> data = read_memory<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span> -<span id="L706" class="LineNr"> 706 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"done reading old value of '"</span> << to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << end<span class="Delimiter">();</span> +<span id="L706" class="LineNr"> 706 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"done reading old value of '"</span> << to_string<span class="Delimiter">(</span>canonized_x<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L707" class="LineNr"> 707 </span> <span class="Normal">const</span> container_metadata& metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L708" class="LineNr"> 708 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >::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 id="L708" class="LineNr"> 708 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >::const_iterator p = metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L710" class="LineNr"> 710 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::const_iterator info = p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> info != p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">-></span>offset<span class="Delimiter">);</span> +<span id="L710" class="LineNr"> 710 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::const_iterator info = p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> info != p<span class="Delimiter">-></span>second<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L711" class="LineNr"> 711 </span> <span class="Normal">int</span> element_address = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> canonized_x<span class="Delimiter">.</span>value + info<span class="Delimiter">-></span>offset<span class="Delimiter">);</span> <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> -<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> -<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">-></span>payload_type<span class="Delimiter">);</span> -<span id="L715" class="LineNr"> 715 </span> decrement_refcount<span class="Delimiter">(</span>element_address<span class="Delimiter">,</span> info<span class="Delimiter">-></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 id="L713" class="LineNr"> 713 </span> element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><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> +<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">-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">);</span> +<span id="L715" class="LineNr"> 715 </span> <a href='036refcount.cc.html#L60'>decrement_refcount</a><span class="Delimiter">(</span>element_address<span class="Delimiter">,</span> info<span class="Delimiter">-></span><a href='030container.cc.html#L238'>payload_type</a><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 id="L716" class="LineNr"> 716 </span> <span class="Delimiter">}</span> <span id="L717" class="LineNr"> 717 </span> <span class="Delimiter">}</span> <span id="L718" class="LineNr"> 718 </span><span class="Delimiter">}</span> <span id="L719" class="LineNr"> 719 </span> <span id="L720" class="LineNr"> 720 </span><span class="Delimiter">:(code)</span> -<span id="L721" class="LineNr"> 721 </span><span class="Normal">bool</span> all_match<span class="Delimiter">(</span><span class="Normal">const</span> vector<<span class="Normal">double</span>>& data<span class="Delimiter">,</span> <span class="Normal">const</span> set<tag_condition_info>& conditions<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L722" class="LineNr"> 722 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<tag_condition_info>::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 id="L721" class="LineNr"> 721 </span><span class="Normal">bool</span> <a href='036refcount.cc.html#L721'>all_match</a><span class="Delimiter">(</span><span class="Normal">const</span> vector<<span class="Normal">double</span>>& data<span class="Delimiter">,</span> <span class="Normal">const</span> set<tag_condition_info>& conditions<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L722" class="LineNr"> 722 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<tag_condition_info>::const_iterator p = conditions<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != conditions<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>offset<span class="Delimiter">)</span> != p<span class="Delimiter">-></span>tag<span class="Delimiter">)</span> <span id="L724" class="LineNr"> 724 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L725" class="LineNr"> 725 </span> <span class="Delimiter">}</span> @@ -792,31 +792,31 @@ if ('onhashchange' in window) { <span id="L731" class="LineNr"> 731 </span> <span class="Normal">a</span>:bar <span class="Comment"># contains an address</span> <span id="L732" class="LineNr"> 732 </span>] <span id="L733" class="LineNr"> 733 </span><span class="muData">container</span> bar [ -<span id="L734" class="LineNr"> 734 </span> <span class="Normal">x</span>:address:num +<span id="L734" class="LineNr"> 734 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L735" class="LineNr"> 735 </span>] -<span id="L736" class="LineNr"> 736 </span><span class="muRecipe">def</span> main [ -<span id="L737" class="LineNr"> 737 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L738" class="LineNr"> 738 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>:address:num -<span id="L739" class="LineNr"> 739 </span> <span class="Constant">3</span>:address:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> -<span id="L740" class="LineNr"> 740 </span> *<span class="Constant">3</span>:address:foo<span class="Special"> <- </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 id="L736" class="LineNr"> 736 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L737" class="LineNr"> 737 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L738" class="LineNr"> 738 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L739" class="LineNr"> 739 </span> <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> +<span id="L740" class="LineNr"> 740 </span> *<span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *<span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Delimiter">,</span> <span class="Constant">a:offset</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar <span id="L741" class="LineNr"> 741 </span>] <span id="L742" class="LineNr"> 742 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L743" class="LineNr"> 743 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> <span id="L744" class="LineNr"> 744 </span><span class="traceContains">+run: {2: "bar"} <- merge {1: ("address" "number")}</span> <span id="L745" class="LineNr"> 745 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -> 2</span> -<span id="L746" class="LineNr"> 746 </span><span class="traceContains">+run: {3: ("address" "foo"), "lookup": ()} <- put {3: ("address" "foo"), "lookup": ()}, {a: "offset"}, {2: "bar"}</span> +<span id="L746" class="LineNr"> 746 </span><span class="traceContains">+run: {3: ("address" "foo"), "lookup": ()} <- <a href='001help.cc.html#L218'>put</a> {3: ("address" "foo"), "lookup": ()}, {a: "offset"}, {2: "bar"}</span> <span id="L747" class="LineNr"> 747 </span><span class="Comment"># put increments refcount inside container</span> <span id="L748" class="LineNr"> 748 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -> 3</span> <span id="L749" class="LineNr"> 749 </span> <span id="L750" class="LineNr"> 750 </span><span class="Delimiter">:(scenario refcounts_put_index_array)</span> <span id="L751" class="LineNr"> 751 </span><span class="muData">container</span> bar [ -<span id="L752" class="LineNr"> 752 </span> <span class="Normal">x</span>:address:num +<span id="L752" class="LineNr"> 752 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L753" class="LineNr"> 753 </span>] -<span id="L754" class="LineNr"> 754 </span><span class="muRecipe">def</span> main [ -<span id="L755" class="LineNr"> 755 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L756" class="LineNr"> 756 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>:address:num -<span id="L757" class="LineNr"> 757 </span> <span class="Constant">3</span>:address:array:bar<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">bar:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> -<span id="L758" class="LineNr"> 758 </span> *<span class="Constant">3</span>:address:array:bar<span class="Special"> <- </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 id="L754" class="LineNr"> 754 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L755" class="LineNr"> 755 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L756" class="LineNr"> 756 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L757" class="LineNr"> 757 </span> <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:bar<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">bar:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> +<span id="L758" class="LineNr"> 758 </span> *<span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:bar<span class="Special"> <- </span>put-index *<span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:bar<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar <span id="L759" class="LineNr"> 759 </span>] <span id="L760" class="LineNr"> 760 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L761" class="LineNr"> 761 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -832,11 +832,11 @@ if ('onhashchange' in window) { <span id="L771" class="LineNr"> 771 </span> <span class="Normal">b</span>:bar <span class="Comment"># contains an address</span> <span id="L772" class="LineNr"> 772 </span>] <span id="L773" class="LineNr"> 773 </span><span class="muData">container</span> bar [ -<span id="L774" class="LineNr"> 774 </span> <span class="Normal">x</span>:address:num +<span id="L774" class="LineNr"> 774 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L775" class="LineNr"> 775 </span>] -<span id="L776" class="LineNr"> 776 </span><span class="muRecipe">def</span> main [ -<span id="L777" class="LineNr"> 777 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L778" class="LineNr"> 778 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>:address:num +<span id="L776" class="LineNr"> 776 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L777" class="LineNr"> 777 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L778" class="LineNr"> 778 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L779" class="LineNr"> 779 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">2</span>:bar <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"> <- </span>maybe-convert <span class="Constant">3</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:variant/b</span> <span id="L781" class="LineNr"> 781 </span>] @@ -860,26 +860,26 @@ if ('onhashchange' in window) { <span id="L799" class="LineNr"> 799 </span>] <span id="L800" class="LineNr"> 800 </span><span class="muData">container</span> curr [ <span id="L801" class="LineNr"> 801 </span> <span class="Normal">x</span>:num -<span id="L802" class="LineNr"> 802 </span> <span class="Normal">y</span>:address:num <span class="Comment"># address inside container inside container</span> +<span id="L802" class="LineNr"> 802 </span> <span class="Normal">y</span>:<a href='043space.cc.html#L76'>address</a>:num <span class="Comment"># address inside container inside container</span> <span id="L803" class="LineNr"> 803 </span>] -<span id="L804" class="LineNr"> 804 </span><span class="muRecipe">def</span> main [ -<span id="L805" class="LineNr"> 805 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L806" class="LineNr"> 806 </span> <span class="Constant">2</span>:address:curr<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">curr:type</span> -<span id="L807" class="LineNr"> 807 </span> *<span class="Constant">2</span>:address:curr<span class="Special"> <- </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 id="L808" class="LineNr"> 808 </span> <span class="Constant">3</span>:address:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> -<span id="L809" class="LineNr"> 809 </span> *<span class="Constant">3</span>:address:foo<span class="Special"> <- </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 id="L810" class="LineNr"> 810 </span> <span class="Constant">4</span>:foo<span class="Special"> <- </span>copy *<span class="Constant">3</span>:address:foo +<span id="L804" class="LineNr"> 804 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L805" class="LineNr"> 805 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L806" class="LineNr"> 806 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:curr<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">curr:type</span> +<span id="L807" class="LineNr"> 807 </span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:curr<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:curr<span class="Delimiter">,</span> <span class="Constant">1:offset/y</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L808" class="LineNr"> 808 </span> <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> +<span id="L809" class="LineNr"> 809 </span> *<span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *<span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset/b</span><span class="Delimiter">,</span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:curr +<span id="L810" class="LineNr"> 810 </span> <span class="Constant">4</span>:foo<span class="Special"> <- </span>copy *<span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:foo <span id="L811" class="LineNr"> 811 </span>] -<span id="L812" class="LineNr"> 812 </span><span class="traceContains">+transform: compute address offsets for container foo</span> +<span id="L812" class="LineNr"> 812 </span><span class="traceContains">+transform: compute <a href='043space.cc.html#L76'>address</a> offsets for container foo</span> <span id="L813" class="LineNr"> 813 </span><span class="traceContains">+transform: checking container foo, element 1</span> -<span id="L814" class="LineNr"> 814 </span><span class="traceContains">+transform: address at offset 3</span> +<span id="L814" class="LineNr"> 814 </span><span class="traceContains">+transform: <a href='043space.cc.html#L76'>address</a> at offset 3</span> <span id="L815" class="LineNr"> 815 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L816" class="LineNr"> 816 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> <span id="L817" class="LineNr"> 817 </span><span class="Comment"># storing an address in a container updates its refcount</span> -<span id="L818" class="LineNr"> 818 </span><span class="traceContains">+run: {2: ("address" "curr"), "lookup": ()} <- put {2: ("address" "curr"), "lookup": ()}, {1: "offset", "y": ()}, {1: ("address" "number")}</span> +<span id="L818" class="LineNr"> 818 </span><span class="traceContains">+run: {2: ("address" "curr"), "lookup": ()} <- <a href='001help.cc.html#L218'>put</a> {2: ("address" "curr"), "lookup": ()}, {1: "offset", "y": ()}, {1: ("address" "number")}</span> <span id="L819" class="LineNr"> 819 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -> 2</span> <span id="L820" class="LineNr"> 820 </span><span class="Comment"># storing a container in a container updates refcounts of any contained addresses</span> -<span id="L821" class="LineNr"> 821 </span><span class="traceContains">+run: {3: ("address" "foo"), "lookup": ()} <- put {3: ("address" "foo"), "lookup": ()}, {1: "offset", "b": ()}, {2: ("address" "curr"), "lookup": ()}</span> +<span id="L821" class="LineNr"> 821 </span><span class="traceContains">+run: {3: ("address" "foo"), "lookup": ()} <- <a href='001help.cc.html#L218'>put</a> {3: ("address" "foo"), "lookup": ()}, {1: "offset", "b": ()}, {2: ("address" "curr"), "lookup": ()}</span> <span id="L822" class="LineNr"> 822 </span><span class="traceContains">+mem: incrementing refcount of 1000: 2 -> 3</span> <span id="L823" class="LineNr"> 823 </span><span class="Comment"># copying a container containing a container containing an address updates refcount</span> <span id="L824" class="LineNr"> 824 </span><span class="traceContains">+run: {4: "foo"} <- copy {3: ("address" "foo"), "lookup": ()}</span> @@ -893,15 +893,15 @@ if ('onhashchange' in window) { <span id="L832" class="LineNr"> 832 </span><span class="muData">exclusive-container</span> bar [ <span id="L833" class="LineNr"> 833 </span> <span class="Normal">x</span>:num <span id="L834" class="LineNr"> 834 </span> <span class="Normal">y</span>:num -<span id="L835" class="LineNr"> 835 </span> <span class="Normal">z</span>:address:num +<span id="L835" class="LineNr"> 835 </span> <span class="Normal">z</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L836" class="LineNr"> 836 </span>] -<span id="L837" class="LineNr"> 837 </span><span class="muRecipe">def</span> main [ -<span id="L838" class="LineNr"> 838 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L837" class="LineNr"> 837 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L838" class="LineNr"> 838 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L839" class="LineNr"> 839 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L840" class="LineNr"> 840 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>merge <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">2</span>:bar <span id="L841" class="LineNr"> 841 </span> <span class="Constant">5</span>:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L842" class="LineNr"> 842 </span> <span class="Constant">6</span>:foo<span class="Special"> <- </span>merge <span class="Constant">13</span><span class="Delimiter">,</span> <span class="Constant">5</span>:bar -<span id="L843" class="LineNr"> 843 </span> <span class="Constant">8</span>:bar<span class="Special"> <- </span>merge <span class="Constant">2</span>/z<span class="Delimiter">,</span> <span class="Constant">1</span>:address:num +<span id="L843" class="LineNr"> 843 </span> <span class="Constant">8</span>:bar<span class="Special"> <- </span>merge <span class="Constant">2</span>/z<span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L844" class="LineNr"> 844 </span> <span class="Constant">9</span>:foo<span class="Special"> <- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">8</span>:bar <span id="L845" class="LineNr"> 845 </span> <span class="Constant">11</span>:foo<span class="Special"> <- </span>copy <span class="Constant">9</span>:foo <span id="L846" class="LineNr"> 846 </span>] @@ -923,13 +923,13 @@ if ('onhashchange' in window) { <span id="L862" class="LineNr"> 862 </span><span class="muData">container</span> bar [ <span id="L863" class="LineNr"> 863 </span> <span class="Normal">x</span>:num <span id="L864" class="LineNr"> 864 </span> <span class="Normal">y</span>:num -<span id="L865" class="LineNr"> 865 </span> <span class="Normal">z</span>:address:num +<span id="L865" class="LineNr"> 865 </span> <span class="Normal">z</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L866" class="LineNr"> 866 </span>] -<span id="L867" class="LineNr"> 867 </span><span class="muRecipe">def</span> main [ -<span id="L868" class="LineNr"> 868 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L867" class="LineNr"> 867 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L868" class="LineNr"> 868 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L869" class="LineNr"> 869 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L870" class="LineNr"> 870 </span> <span class="Constant">6</span>:foo<span class="Special"> <- </span>merge <span class="Constant">0</span>/a<span class="Delimiter">,</span> <span class="Constant">35</span> -<span id="L871" class="LineNr"> 871 </span> <span class="Constant">10</span>:bar<span class="Special"> <- </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 id="L871" class="LineNr"> 871 </span> <span class="Constant">10</span>:bar<span class="Special"> <- </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>:<a href='043space.cc.html#L76'>address</a>:num <span id="L872" class="LineNr"> 872 </span> <span class="Constant">13</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>/b<span class="Delimiter">,</span> <span class="Constant">10</span>:bar <span id="L873" class="LineNr"> 873 </span> <span class="Constant">17</span>:foo<span class="Special"> <- </span>copy <span class="Constant">13</span>:foo <span id="L874" class="LineNr"> 874 </span>] @@ -950,11 +950,11 @@ if ('onhashchange' in window) { <span id="L889" class="LineNr"> 889 </span>] <span id="L890" class="LineNr"> 890 </span><span class="muData">exclusive-container</span> bar [ <span id="L891" class="LineNr"> 891 </span> <span class="Normal">x</span>:num -<span id="L892" class="LineNr"> 892 </span> <span class="Normal">y</span>:address:num +<span id="L892" class="LineNr"> 892 </span> <span class="Normal">y</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L893" class="LineNr"> 893 </span>] -<span id="L894" class="LineNr"> 894 </span><span class="muRecipe">def</span> main [ -<span id="L895" class="LineNr"> 895 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L896" class="LineNr"> 896 </span> <span class="Constant">10</span>:foo<span class="Special"> <- </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 id="L894" class="LineNr"> 894 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L895" class="LineNr"> 895 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L896" class="LineNr"> 896 </span> <span class="Constant">10</span>:foo<span class="Special"> <- </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>:<a href='043space.cc.html#L76'>address</a>:num <span id="L897" class="LineNr"> 897 </span> <span class="Constant">20</span>:foo<span class="Special"> <- </span>copy <span class="Constant">10</span>:foo <span id="L898" class="LineNr"> 898 </span>] <span id="L899" class="LineNr"> 899 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> @@ -967,13 +967,13 @@ if ('onhashchange' in window) { <span id="L906" class="LineNr"> 906 </span> <span id="L907" class="LineNr"> 907 </span><span class="Delimiter">:(scenario refcounts_copy_array_within_container)</span> <span id="L908" class="LineNr"> 908 </span><span class="muData">container</span> foo [ -<span id="L909" class="LineNr"> 909 </span> <span class="Normal">x</span>:address:array:num +<span id="L909" class="LineNr"> 909 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:array:num <span id="L910" class="LineNr"> 910 </span>] -<span id="L911" class="LineNr"> 911 </span><span class="muRecipe">def</span> main [ -<span id="L912" class="LineNr"> 912 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> -<span id="L913" class="LineNr"> 913 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>:address:array:num -<span id="L914" class="LineNr"> 914 </span> <span class="Constant">3</span>:address:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span> -<span id="L915" class="LineNr"> 915 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">3</span>:address:array:num +<span id="L911" class="LineNr"> 911 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L912" class="LineNr"> 912 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> +<span id="L913" class="LineNr"> 913 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num +<span id="L914" class="LineNr"> 914 </span> <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">5</span> +<span id="L915" class="LineNr"> 915 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:num <span id="L916" class="LineNr"> 916 </span>] <span id="L917" class="LineNr"> 917 </span><span class="traceContains">+run: {1: ("address" "array" "number")} <- new {number: "type"}, {3: "literal"}</span> <span id="L918" class="LineNr"> 918 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -985,22 +985,22 @@ if ('onhashchange' in window) { <span id="L924" class="LineNr"> 924 </span><span class="Delimiter">:(scenario refcounts_copy_address_within_static_array_within_container)</span> <span id="L925" class="LineNr"> 925 </span><span class="muData">container</span> foo [ <span id="L926" class="LineNr"> 926 </span> <span class="Normal">a</span>:array:bar:<span class="Constant">3</span> -<span id="L927" class="LineNr"> 927 </span> <span class="Normal">b</span>:address:num +<span id="L927" class="LineNr"> 927 </span> <span class="Normal">b</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L928" class="LineNr"> 928 </span>] <span id="L929" class="LineNr"> 929 </span><span class="muData">container</span> bar [ <span id="L930" class="LineNr"> 930 </span> <span class="Normal">y</span>:num -<span id="L931" class="LineNr"> 931 </span> <span class="Normal">z</span>:address:num +<span id="L931" class="LineNr"> 931 </span> <span class="Normal">z</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L932" class="LineNr"> 932 </span>] -<span id="L933" class="LineNr"> 933 </span><span class="muRecipe">def</span> main [ -<span id="L934" class="LineNr"> 934 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L935" class="LineNr"> 935 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num +<span id="L933" class="LineNr"> 933 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L934" class="LineNr"> 934 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L935" class="LineNr"> 935 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L936" class="LineNr"> 936 </span> <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Special"> <- </span>create-array <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 -<span id="L938" class="LineNr"> 938 </span> <span class="Constant">20</span>:foo<span class="Special"> <- </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 id="L939" class="LineNr"> 939 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L940" class="LineNr"> 940 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:address:num +<span id="L938" class="LineNr"> 938 </span> <span class="Constant">20</span>:foo<span class="Special"> <- </span>merge <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L939" class="LineNr"> 939 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L940" class="LineNr"> 940 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <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 -<span id="L942" class="LineNr"> 942 </span> <span class="Constant">20</span>:foo<span class="Special"> <- </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 id="L942" class="LineNr"> 942 </span> <span class="Constant">20</span>:foo<span class="Special"> <- </span>merge <span class="Constant">10</span>:array:bar:<span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L943" class="LineNr"> 943 </span>] <span id="L944" class="LineNr"> 944 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L945" class="LineNr"> 945 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -1023,24 +1023,24 @@ if ('onhashchange' in window) { <span id="L962" class="LineNr"> 962 </span> <span id="L963" class="LineNr"> 963 </span><span class="Delimiter">:(scenario refcounts_handle_exclusive_containers_with_different_tags)</span> <span id="L964" class="LineNr"> 964 </span><span class="muData">container</span> foo1 [ -<span id="L965" class="LineNr"> 965 </span> <span class="Normal">x</span>:address:num +<span id="L965" class="LineNr"> 965 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L966" class="LineNr"> 966 </span> <span class="Normal">y</span>:num <span id="L967" class="LineNr"> 967 </span>] <span id="L968" class="LineNr"> 968 </span><span class="muData">container</span> foo2 [ <span id="L969" class="LineNr"> 969 </span> <span class="Normal">x</span>:num -<span id="L970" class="LineNr"> 970 </span> <span class="Normal">y</span>:address:num +<span id="L970" class="LineNr"> 970 </span> <span class="Normal">y</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L971" class="LineNr"> 971 </span>] <span id="L972" class="LineNr"> 972 </span><span class="muData">exclusive-container</span> bar [ <span id="L973" class="LineNr"> 973 </span> <span class="Normal">a</span>:foo1 <span id="L974" class="LineNr"> 974 </span> <span class="Normal">b</span>:foo2 <span id="L975" class="LineNr"> 975 </span>] -<span id="L976" class="LineNr"> 976 </span><span class="muRecipe">def</span> main [ -<span id="L977" class="LineNr"> 977 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">12000</span>/unsafe <span class="Comment"># pretend allocation</span> -<span id="L978" class="LineNr"> 978 </span> *<span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L979" class="LineNr"> 979 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </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 id="L980" class="LineNr"> 980 </span> <span class="Constant">5</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">13000</span>/unsafe <span class="Comment"># pretend allocation</span> -<span id="L981" class="LineNr"> 981 </span> *<span class="Constant">5</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L982" class="LineNr"> 982 </span> <span class="Constant">6</span>:bar<span class="Special"> <- </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 id="L976" class="LineNr"> 976 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L977" class="LineNr"> 977 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">12000</span>/unsafe <span class="Comment"># pretend allocation</span> +<span id="L978" class="LineNr"> 978 </span> *<span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L979" class="LineNr"> 979 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>merge <span class="Constant">0</span>/foo1<span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Delimiter">,</span> <span class="Constant">97</span> +<span id="L980" class="LineNr"> 980 </span> <span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">13000</span>/unsafe <span class="Comment"># pretend allocation</span> +<span id="L981" class="LineNr"> 981 </span> *<span class="Constant">5</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L982" class="LineNr"> 982 </span> <span class="Constant">6</span>:bar<span class="Special"> <- </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>:<a href='043space.cc.html#L76'>address</a>:num <span id="L983" class="LineNr"> 983 </span> <span class="Constant">2</span>:bar<span class="Special"> <- </span>copy <span class="Constant">6</span>:bar <span id="L984" class="LineNr"> 984 </span>] <span id="L985" class="LineNr"> 985 </span><span class="traceContains">+run: {2: "bar"} <- merge {0: "literal", "foo1": ()}, {1: ("address" "number")}, {97: "literal"}</span> @@ -1060,7 +1060,7 @@ if ('onhashchange' in window) { <span id="L999" class="LineNr"> 999 </span> <span class="Comment">// End is_mu_container(type) Special-cases</span> <span id="L1000" class="LineNr">1000 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L1001" class="LineNr">1001 </span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L1002" class="LineNr">1002 </span> <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">;</span> +<span id="L1002" class="LineNr">1002 </span> <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">;</span> <span id="L1003" class="LineNr">1003 </span><span class="Delimiter">}</span> <span id="L1004" class="LineNr">1004 </span> <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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -1071,7 +1071,7 @@ if ('onhashchange' in window) { <span id="L1010" class="LineNr">1010 </span> <span class="Comment">// End is_mu_exclusive_container(type) Special-cases</span> <span id="L1011" class="LineNr">1011 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L1012" class="LineNr">1012 </span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L1013" class="LineNr">1013 </span> <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == EXCLUSIVE_CONTAINER<span class="Delimiter">;</span> +<span id="L1013" class="LineNr">1013 </span> <span class="Identifier">return</span> info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">;</span> <span id="L1014" class="LineNr">1014 </span><span class="Delimiter">}</span> </pre> </body> diff --git a/html/037abandon.cc.html b/html/037abandon.cc.html index 50a1d5f8..dd51f0f9 100644 --- a/html/037abandon.cc.html +++ b/html/037abandon.cc.html @@ -63,21 +63,21 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span><span class="Comment">//: The top of the address layer has the complete life cycle of memory.</span> <span id="L3" class="LineNr"> 3 </span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario new_reclaim)</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ -<span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L7" class="LineNr"> 7 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:num <span class="Comment"># because 1 will get reset during abandon below</span> -<span id="L8" class="LineNr"> 8 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># abandon</span> -<span id="L9" class="LineNr"> 9 </span> <span class="Constant">3</span>:address:num<span class="Special"> <- </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 id="L10" class="LineNr"> 10 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span>:address:num +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L7" class="LineNr"> 7 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num <span class="Comment"># because 1 will get reset during abandon below</span> +<span id="L8" class="LineNr"> 8 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># abandon</span> +<span id="L9" class="LineNr"> 9 </span> <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </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 id="L10" class="LineNr"> 10 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L11" class="LineNr"> 11 </span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num <span id="L12" class="LineNr"> 12 </span>] <span id="L13" class="LineNr"> 13 </span><span class="Comment"># both allocations should have returned the same address</span> <span id="L14" class="LineNr"> 14 </span><span class="traceContains">+mem: storing 1 in location 5</span> <span id="L15" class="LineNr"> 15 </span> -<span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Decrement Refcount(old_address, payload_type, payload_size)")</span> +<span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Decrement Refcount(old_address, <a href='030container.cc.html#L238'>payload_type</a>, payload_size)")</span> <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> -<span id="L18" class="LineNr"> 18 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"automatically abandoning "</span> << old_address << end<span class="Delimiter">();</span> -<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> +<span id="L18" class="LineNr"> 18 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"automatically abandoning "</span> << old_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L19" class="LineNr"> 19 </span> <a href='037abandon.cc.html#L28'>abandon</a><span class="Delimiter">(</span>old_address<span class="Delimiter">,</span> <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">,</span> <a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">);</span> <span id="L20" class="LineNr"> 20 </span><span class="Delimiter">}</span> <span id="L21" class="LineNr"> 21 </span> <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> @@ -86,48 +86,48 @@ if ('onhashchange' in window) { <span id="L25" class="LineNr"> 25 </span>map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>> free_list<span class="Delimiter">;</span> <span id="L26" class="LineNr"> 26 </span> <span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L29" class="LineNr"> 29 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"abandon"</span><span class="Delimiter">)</span> << <span class="Constant">"updating refcounts inside "</span> << address << <span class="Constant">": "</span> << to_string<span class="Delimiter">(</span>payload_type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L28" class="LineNr"> 28 </span><span class="Normal">void</span> <a href='037abandon.cc.html#L28'>abandon</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">,</span> <span class="Normal">int</span> <a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L29" class="LineNr"> 29 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"abandon"</span><span class="Delimiter">)</span> << <span class="Constant">"updating refcounts inside "</span> << <a href='043space.cc.html#L76'>address</a> << <span class="Constant">": "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L30" class="LineNr"> 30 </span><span class="CommentedCode">//? Total_free += size;</span> <span id="L31" class="LineNr"> 31 </span><span class="CommentedCode">//? ++Num_free;</span> <span id="L32" class="LineNr"> 32 </span><span class="CommentedCode">//? cerr << "abandon: " << size << '\n';</span> <span id="L33" class="LineNr"> 33 </span> <span class="Comment">// decrement any contained refcounts</span> -<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> +<span id="L34" class="LineNr"> 34 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> -<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> -<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> +<span id="L36" class="LineNr"> 36 </span> element<span class="Delimiter">.</span>type = <a href='032array.cc.html#L366'>copy_array_element</a><span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">);</span> +<span id="L37" class="LineNr"> 37 </span> <span class="Normal">int</span> <a href='032array.cc.html#L386'>array_length</a> = <a href='001help.cc.html#L225'>get_or_insert</a><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> <span id="L38" class="LineNr"> 38 </span> assert<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name != <span class="Constant">"array"</span><span class="Delimiter">);</span> <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> -<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 < array_length<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<span id="L42" class="LineNr"> 42 </span> decrement_any_refcounts<span class="Delimiter">(</span>element<span class="Delimiter">);</span> +<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 < <a href='032array.cc.html#L386'>array_length</a><span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L41" class="LineNr"> 41 </span> element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> + <span class="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> +<span id="L42" class="LineNr"> 42 </span> <a href='036refcount.cc.html#L51'>decrement_any_refcounts</a><span class="Delimiter">(</span>element<span class="Delimiter">);</span> <span id="L43" class="LineNr"> 43 </span> <span class="Delimiter">}</span> <span id="L44" class="LineNr"> 44 </span> <span class="Delimiter">}</span> -<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> +<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><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">)</span> || is_mu_exclusive_container<span class="Delimiter">(</span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L46" class="LineNr"> 46 </span> reagent tmp<span class="Delimiter">;</span> <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> -<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> -<span id="L49" class="LineNr"> 49 </span> decrement_any_refcounts<span class="Delimiter">(</span>tmp<span class="Delimiter">);</span> +<span id="L48" class="LineNr"> 48 </span> tmp<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> + <span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L49" class="LineNr"> 49 </span> <a href='036refcount.cc.html#L51'>decrement_any_refcounts</a><span class="Delimiter">(</span>tmp<span class="Delimiter">);</span> <span id="L50" class="LineNr"> 50 </span> <span class="Delimiter">}</span> <span id="L51" class="LineNr"> 51 </span> <span class="Comment">// clear memory</span> -<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 < address+payload_size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> -<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> +<span id="L52" class="LineNr"> 52 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = <a href='043space.cc.html#L76'>address</a><span class="Delimiter">;</span> curr < address+payload_size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> +<span id="L53" class="LineNr"> 53 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L54" class="LineNr"> 54 </span> <span class="Comment">// append existing free list to address</span> -<span id="L55" class="LineNr"> 55 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"abandon"</span><span class="Delimiter">)</span> << <span class="Constant">"saving "</span> << address << <span class="Constant">" in free-list of size "</span> << payload_size << end<span class="Delimiter">();</span> -<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">-></span>free_list<span class="Delimiter">,</span> payload_size<span class="Delimiter">));</span> -<span id="L57" class="LineNr"> 57 </span> put<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>free_list<span class="Delimiter">,</span> payload_size<span class="Delimiter">,</span> address<span class="Delimiter">);</span> +<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"abandon"</span><span class="Delimiter">)</span> << <span class="Constant">"saving "</span> << <a href='043space.cc.html#L76'>address</a> << <span class="Constant">" in free-list of size "</span> << <a href='036refcount.cc.html#L82'>payload_size</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L56" class="LineNr"> 56 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>free_list<span class="Delimiter">,</span> <a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">));</span> +<span id="L57" class="LineNr"> 57 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>free_list<span class="Delimiter">,</span> <a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> <span id="L58" class="LineNr"> 58 </span><span class="Delimiter">}</span> <span id="L59" class="LineNr"> 59 </span> <span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(after "Allocate Special-cases")</span> -<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">-></span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L62" class="LineNr"> 62 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"abandon"</span><span class="Delimiter">)</span> << <span class="Constant">"picking up space from free-list of size "</span> << size << end<span class="Delimiter">();</span> -<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">-></span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">);</span> -<span id="L64" class="LineNr"> 64 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"new alloc from free list: "</span> << result << end<span class="Delimiter">();</span> -<span id="L65" class="LineNr"> 65 </span> put<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></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> -<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> +<span id="L61" class="LineNr"> 61 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"abandon"</span><span class="Delimiter">)</span> << <span class="Constant">"picking up space from free-list of size "</span> << size << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <span class="Normal">int</span> result = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">);</span> +<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"new alloc from free list: "</span> << result << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L65" class="LineNr"> 65 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>free_list<span class="Delimiter">,</span> size<span class="Delimiter">,</span> <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">));</span> +<span id="L66" class="LineNr"> 66 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <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 < result+size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<span id="L69" class="LineNr"> 69 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"memory in free list was not zeroed out: "</span> << curr << <span class="Constant">'/'</span> << result << <span class="Constant">"; somebody wrote to us after free!!!</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L68" class="LineNr"> 68 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"memory in free list was not zeroed out: "</span> << curr << <span class="Constant">'/'</span> << result << <span class="Constant">"; somebody wrote to us after free!!!</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L70" class="LineNr"> 70 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// always fatal</span> <span id="L71" class="LineNr"> 71 </span> <span class="Delimiter">}</span> <span id="L72" class="LineNr"> 72 </span> <span class="Delimiter">}</span> @@ -135,35 +135,35 @@ if ('onhashchange' in window) { <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span> <span id="L75" class="LineNr"> 75 </span> <span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(scenario new_differing_size_no_reclaim)</span> -<span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> main [ -<span id="L78" class="LineNr"> 78 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L79" class="LineNr"> 79 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:num -<span id="L80" class="LineNr"> 80 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># abandon</span> -<span id="L81" class="LineNr"> 81 </span> <span class="Constant">3</span>:address:array:num<span class="Special"> <- </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 id="L82" class="LineNr"> 82 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span>:address:array:num +<span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L78" class="LineNr"> 78 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L79" class="LineNr"> 79 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L80" class="LineNr"> 80 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># abandon</span> +<span id="L81" class="LineNr"> 81 </span> <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </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 id="L82" class="LineNr"> 82 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:num <span id="L83" class="LineNr"> 83 </span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num <span id="L84" class="LineNr"> 84 </span>] <span id="L85" class="LineNr"> 85 </span><span class="Comment"># no reuse</span> <span id="L86" class="LineNr"> 86 </span><span class="traceContains">+mem: storing 0 in location 5</span> <span id="L87" class="LineNr"> 87 </span> <span id="L88" class="LineNr"> 88 </span><span class="Delimiter">:(scenario new_reclaim_array)</span> -<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> main [ -<span id="L90" class="LineNr"> 90 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span> -<span id="L91" class="LineNr"> 91 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:address:array:num -<span id="L92" class="LineNr"> 92 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># abandon</span> -<span id="L93" class="LineNr"> 93 </span> <span class="Constant">3</span>:address:array:num<span class="Special"> <- </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 id="L94" class="LineNr"> 94 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span>:address:array:num +<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L90" class="LineNr"> 90 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">2</span> +<span id="L91" class="LineNr"> 91 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num +<span id="L92" class="LineNr"> 92 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># abandon</span> +<span id="L93" class="LineNr"> 93 </span> <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </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 id="L94" class="LineNr"> 94 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span>:<a href='043space.cc.html#L76'>address</a>:array:num <span id="L95" class="LineNr"> 95 </span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num <span id="L96" class="LineNr"> 96 </span>] <span id="L97" class="LineNr"> 97 </span><span class="Comment"># both calls to new returned identical addresses</span> <span id="L98" class="LineNr"> 98 </span><span class="traceContains">+mem: storing 1 in location 5</span> <span id="L99" class="LineNr"> 99 </span> <span id="L100" class="LineNr">100 </span><span class="Delimiter">:(scenario abandon_on_overwrite)</span> -<span id="L101" class="LineNr">101 </span><span class="muRecipe">def</span> main [ -<span id="L102" class="LineNr">102 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L101" class="LineNr">101 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L102" class="LineNr">102 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L103" class="LineNr">103 </span> <span class="Comment"># over-writing one allocation with another</span> -<span id="L104" class="LineNr">104 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L105" class="LineNr">105 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L104" class="LineNr">104 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L105" class="LineNr">105 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L106" class="LineNr">106 </span>] <span id="L107" class="LineNr">107 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L108" class="LineNr">108 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -171,16 +171,16 @@ if ('onhashchange' in window) { <span id="L110" class="LineNr">110 </span><span class="traceContains">+mem: automatically abandoning 1000</span> <span id="L111" class="LineNr">111 </span> <span id="L112" class="LineNr">112 </span><span class="Delimiter">:(scenario abandon_after_call)</span> -<span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> main [ -<span id="L114" class="LineNr">114 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L114" class="LineNr">114 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L115" class="LineNr">115 </span> <span class="Comment"># passing in addresses to recipes increments refcount</span> -<span id="L116" class="LineNr">116 </span> foo <span class="Constant">1</span>:address:num -<span id="L117" class="LineNr">117 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L116" class="LineNr">116 </span> foo <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L117" class="LineNr">117 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L118" class="LineNr">118 </span>] <span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> foo [ -<span id="L120" class="LineNr">120 </span> <span class="Constant">2</span>:address:num<span class="Special"> <- </span>next-ingredient +<span id="L120" class="LineNr">120 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>next-ingredient <span id="L121" class="LineNr">121 </span> <span class="Comment"># return does NOT yet decrement refcount; memory must be explicitly managed</span> -<span id="L122" class="LineNr">122 </span> <span class="Constant">2</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L122" class="LineNr">122 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L123" class="LineNr">123 </span>] <span id="L124" class="LineNr">124 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L125" class="LineNr">125 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -194,13 +194,13 @@ if ('onhashchange' in window) { <span id="L133" class="LineNr">133 </span><span class="traceContains">+mem: automatically abandoning 1000</span> <span id="L134" class="LineNr">134 </span> <span id="L135" class="LineNr">135 </span><span class="Delimiter">:(scenario abandon_on_overwrite_array)</span> -<span id="L136" class="LineNr">136 </span><span class="muRecipe">def</span> main [ +<span id="L136" class="LineNr">136 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L137" class="LineNr">137 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">30</span> <span id="L138" class="LineNr">138 </span> <span class="Comment"># allocate an array</span> -<span id="L139" class="LineNr">139 </span> <span class="Constant">10</span>:address:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">20</span> -<span id="L140" class="LineNr">140 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span>:address:array:num <span class="Comment"># doesn't increment refcount</span> +<span id="L139" class="LineNr">139 </span> <span class="Constant">10</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">20</span> +<span id="L140" class="LineNr">140 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span>:<a href='043space.cc.html#L76'>address</a>:array:num <span class="Comment"># doesn't increment refcount</span> <span id="L141" class="LineNr">141 </span> <span class="Comment"># allocate another array in its place, implicitly freeing the previous allocation</span> -<span id="L142" class="LineNr">142 </span> <span class="Constant">10</span>:address:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">25</span> +<span id="L142" class="LineNr">142 </span> <span class="Constant">10</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">25</span> <span id="L143" class="LineNr">143 </span>] <span id="L144" class="LineNr">144 </span><span class="traceContains">+run: {10: ("address" "array" "number")} <- new {number: "type"}, {25: "literal"}</span> <span id="L145" class="LineNr">145 </span><span class="Comment"># abandoned array is of old size (20, not 25)</span> @@ -209,20 +209,20 @@ if ('onhashchange' in window) { <span id="L148" class="LineNr">148 </span><span class="Delimiter">:(scenario refcounts_abandon_address_in_container)</span> <span id="L149" class="LineNr">149 </span><span class="Comment"># container containing an address</span> <span id="L150" class="LineNr">150 </span><span class="muData">container</span> foo [ -<span id="L151" class="LineNr">151 </span> <span class="Normal">x</span>:address:num +<span id="L151" class="LineNr">151 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L152" class="LineNr">152 </span>] -<span id="L153" class="LineNr">153 </span><span class="muRecipe">def</span> main [ -<span id="L154" class="LineNr">154 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L155" class="LineNr">155 </span> <span class="Constant">2</span>:address:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> -<span id="L156" class="LineNr">156 </span> *<span class="Constant">2</span>:address:foo<span class="Special"> <- </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 id="L157" class="LineNr">157 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L158" class="LineNr">158 </span> <span class="Constant">2</span>:address:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L153" class="LineNr">153 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L154" class="LineNr">154 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L155" class="LineNr">155 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> +<span id="L156" class="LineNr">156 </span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L157" class="LineNr">157 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L158" class="LineNr">158 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L159" class="LineNr">159 </span>] <span id="L160" class="LineNr">160 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L161" class="LineNr">161 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> <span id="L162" class="LineNr">162 </span><span class="traceContains">+run: {2: ("address" "foo")} <- new {foo: "type"}</span> <span id="L163" class="LineNr">163 </span><span class="traceContains">+mem: incrementing refcount of 1002: 0 -> 1</span> -<span id="L164" class="LineNr">164 </span><span class="traceContains">+run: {2: ("address" "foo"), "lookup": ()} <- put {2: ("address" "foo"), "lookup": ()}, {x: "offset"}, {1: ("address" "number")}</span> +<span id="L164" class="LineNr">164 </span><span class="traceContains">+run: {2: ("address" "foo"), "lookup": ()} <- <a href='001help.cc.html#L218'>put</a> {2: ("address" "foo"), "lookup": ()}, {x: "offset"}, {1: ("address" "number")}</span> <span id="L165" class="LineNr">165 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -> 2</span> <span id="L166" class="LineNr">166 </span><span class="traceContains">+run: {1: ("address" "number")} <- copy {0: "literal"}</span> <span id="L167" class="LineNr">167 </span><span class="traceContains">+mem: decrementing refcount of 1000: 2 -> 1</span> @@ -237,12 +237,12 @@ if ('onhashchange' in window) { <span id="L176" class="LineNr">176 </span> <span id="L177" class="LineNr">177 </span><span class="Comment"># todo: move past dilated reagent</span> <span id="L178" class="LineNr">178 </span><span class="Delimiter">:(scenario refcounts_abandon_address_in_array)</span> -<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> main [ -<span id="L180" class="LineNr">180 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L181" class="LineNr">181 </span> <span class="Constant">2</span>:address:array:address:num<span class="Special"> <- </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 id="L182" class="LineNr">182 </span> *<span class="Constant">2</span>:address:array:address:num<span class="Special"> <- </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 id="L183" class="LineNr">183 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L184" class="LineNr">184 </span> <span class="Constant">2</span>:address:array:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L180" class="LineNr">180 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L181" class="LineNr">181 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span> +<span id="L182" class="LineNr">182 </span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>put-index *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:num<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L183" class="LineNr">183 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L184" class="LineNr">184 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L185" class="LineNr">185 </span>] <span id="L186" class="LineNr">186 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L187" class="LineNr">187 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -258,16 +258,16 @@ if ('onhashchange' in window) { <span id="L197" class="LineNr">197 </span><span class="Delimiter">:(scenario refcounts_abandon_address_in_container_in_array)</span> <span id="L198" class="LineNr">198 </span><span class="Comment"># container containing an address</span> <span id="L199" class="LineNr">199 </span><span class="muData">container</span> foo [ -<span id="L200" class="LineNr">200 </span> <span class="Normal">x</span>:address:num +<span id="L200" class="LineNr">200 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:num <span id="L201" class="LineNr">201 </span>] -<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> main [ -<span id="L203" class="LineNr">203 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> -<span id="L204" class="LineNr">204 </span> <span class="Constant">2</span>:address:array:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> -<span id="L205" class="LineNr">205 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>:address:num -<span id="L206" class="LineNr">206 </span> *<span class="Constant">2</span>:address:array:foo<span class="Special"> <- </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 id="L207" class="LineNr">207 </span> <span class="Constant">1</span>:address:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L203" class="LineNr">203 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L204" class="LineNr">204 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> +<span id="L205" class="LineNr">205 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num +<span id="L206" class="LineNr">206 </span> *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:foo<span class="Special"> <- </span>put-index *<span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:foo<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">3</span>:foo +<span id="L207" class="LineNr">207 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L208" class="LineNr">208 </span> <span class="Constant">3</span>:foo<span class="Special"> <- </span>merge <span class="Constant">0</span> -<span id="L209" class="LineNr">209 </span> <span class="Constant">2</span>:address:array:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L209" class="LineNr">209 </span> <span class="Constant">2</span>:<a href='043space.cc.html#L76'>address</a>:array:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L210" class="LineNr">210 </span>] <span id="L211" class="LineNr">211 </span><span class="traceContains">+run: {1: ("address" "number")} <- new {number: "type"}</span> <span id="L212" class="LineNr">212 </span><span class="traceContains">+mem: incrementing refcount of 1000: 0 -> 1</span> @@ -286,12 +286,12 @@ if ('onhashchange' in window) { <span id="L225" class="LineNr">225 </span> <span id="L226" class="LineNr">226 </span><span class="Delimiter">:(scenario refcounts_abandon_array_within_container)</span> <span id="L227" class="LineNr">227 </span><span class="muData">container</span> foo [ -<span id="L228" class="LineNr">228 </span> <span class="Normal">x</span>:address:array:num +<span id="L228" class="LineNr">228 </span> <span class="Normal">x</span>:<a href='043space.cc.html#L76'>address</a>:array:num <span id="L229" class="LineNr">229 </span>] -<span id="L230" class="LineNr">230 </span><span class="muRecipe">def</span> main [ -<span id="L231" class="LineNr">231 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> -<span id="L232" class="LineNr">232 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>:address:array:num -<span id="L233" class="LineNr">233 </span> <span class="Constant">1</span>:address:array:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L230" class="LineNr">230 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L231" class="LineNr">231 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> +<span id="L232" class="LineNr">232 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>merge <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num +<span id="L233" class="LineNr">233 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:array:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L234" class="LineNr">234 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L235" class="LineNr">235 </span>] <span id="L236" class="LineNr">236 </span><span class="traceContains">+run: {1: ("address" "array" "number")} <- new {number: "type"}, {3: "literal"}</span> diff --git a/html/038new_text.cc.html b/html/038new_text.cc.html index 67ef3c5a..ff1d1b96 100644 --- a/html/038new_text.cc.html +++ b/html/038new_text.cc.html @@ -63,10 +63,10 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Comment">//: A Mu text is an address to an array of characters.</span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L5" class="LineNr"> 5 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"text"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"address:array:character"</span><span class="Delimiter">));</span> +<span id="L5" class="LineNr"> 5 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"text"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"address:array:character"</span><span class="Delimiter">));</span> <span id="L6" class="LineNr"> 6 </span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario new_string)</span> -<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> main [ +<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L9" class="LineNr"> 9 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc def] <span id="L10" class="LineNr"> 10 </span> <span class="Constant">2</span>:<span class="Normal">char</span><span class="Special"> <- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L11" class="LineNr"> 11 </span>] @@ -74,7 +74,7 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr"> 13 </span><span class="traceContains">+mem: storing 101 in location 2</span> <span id="L14" class="LineNr"> 14 </span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(scenario new_string_handles_unicode)</span> -<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> main [ +<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L17" class="LineNr"> 17 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [a«c] <span id="L18" class="LineNr"> 18 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>length *<span class="Constant">1</span>:text <span id="L19" class="LineNr"> 19 </span> <span class="Constant">3</span>:<span class="Normal">char</span><span class="Special"> <- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">1</span> @@ -84,38 +84,38 @@ if ('onhashchange' in window) { <span id="L23" class="LineNr"> 23 </span><span class="traceContains">+mem: storing 171 in location 3</span> <span id="L24" class="LineNr"> 24 </span> <span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "End NEW Check Special-cases")</span> -<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> +<span id="L26" class="LineNr"> 26 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before "Convert 'new' To 'allocate'")</span> -<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">"new"</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">continue</span><span class="Delimiter">;</span> +<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">"new"</span> && <a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(after "case NEW" following "Primitive Recipe Implementations")</span> -<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> +<span id="L30" class="LineNr"> 30 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><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> <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> -<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> -<span id="L33" class="LineNr"> 33 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"new string alloc: "</span> << 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> << end<span class="Delimiter">();</span> +<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><a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span> +<span id="L33" class="LineNr"> 33 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"new string alloc: "</span> << 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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L34" class="LineNr"> 34 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">}</span> <span id="L36" class="LineNr"> 36 </span> <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(code)</span> -<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& contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L38" class="LineNr"> 38 </span><span class="Normal">int</span> <a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span><span class="Normal">const</span> string& contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L39" class="LineNr"> 39 </span> <span class="Comment">// allocate an array just large enough for it</span> -<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> +<span id="L40" class="LineNr"> 40 </span> <span class="Normal">int</span> string_length = <a href='038new_text.cc.html#L131'>unicode_length</a><span class="Delimiter">(</span>contents<span class="Delimiter">);</span> <span id="L41" class="LineNr"> 41 </span><span class="CommentedCode">//? Total_alloc += string_length+1;</span> <span id="L42" class="LineNr"> 42 </span><span class="CommentedCode">//? ++Num_alloc;</span> <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> -<span id="L44" class="LineNr"> 44 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing string refcount 0 in location "</span> << result << end<span class="Delimiter">();</span> -<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> +<span id="L44" class="LineNr"> 44 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing string refcount 0 in location "</span> << result << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L45" class="LineNr"> 45 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <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> -<span id="L47" class="LineNr"> 47 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing string length "</span> << string_length << <span class="Constant">" in location "</span> << curr_address << end<span class="Delimiter">();</span> -<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> +<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing string length "</span> << string_length << <span class="Constant">" in location "</span> << curr_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L48" class="LineNr"> 48 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> string_length<span class="Delimiter">);</span> <span id="L49" class="LineNr"> 49 </span> ++curr_address<span class="Delimiter">;</span> <span class="Comment">// skip length</span> <span id="L50" class="LineNr"> 50 </span> <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span> <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> <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 < string_length<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L53" class="LineNr"> 53 </span> <span class="Normal">uint32_t</span> curr_character<span class="Delimiter">;</span> -<span id="L54" class="LineNr"> 54 </span> assert<span class="Delimiter">(</span>curr < SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span> +<span id="L54" class="LineNr"> 54 </span> assert<span class="Delimiter">(</span>curr < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>contents<span class="Delimiter">));</span> <span id="L55" class="LineNr"> 55 </span> tb_utf8_char_to_unicode<span class="Delimiter">(</span>&curr_character<span class="Delimiter">,</span> &raw_contents[curr]<span class="Delimiter">);</span> -<span id="L56" class="LineNr"> 56 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing string character "</span> << curr_character << <span class="Constant">" in location "</span> << curr_address << end<span class="Delimiter">();</span> -<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> +<span id="L56" class="LineNr"> 56 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing string character "</span> << curr_character << <span class="Constant">" in location "</span> << curr_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L57" class="LineNr"> 57 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> curr_character<span class="Delimiter">);</span> <span id="L58" class="LineNr"> 58 </span> curr += tb_utf8_char_length<span class="Delimiter">(</span>raw_contents[curr]<span class="Delimiter">);</span> <span id="L59" class="LineNr"> 59 </span> ++curr_address<span class="Delimiter">;</span> <span id="L60" class="LineNr"> 60 </span> <span class="Delimiter">}</span> @@ -127,47 +127,47 @@ if ('onhashchange' in window) { <span id="L66" class="LineNr"> 66 </span> <span id="L67" class="LineNr"> 67 </span><span class="Delimiter">:(scenario string_literal_without_instruction)</span> <span id="L68" class="LineNr"> 68 </span><span class="Special">% Hide_errors = true;</span> -<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> main [ +<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L70" class="LineNr"> 70 </span> [abc] <span id="L71" class="LineNr"> 71 </span>] -<span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: main: instruction '[abc]' has no recipe</span> +<span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L32'>instruction</a> '[abc]' has no <a href='010vm.cc.html#L19'>recipe</a></span> <span id="L73" class="LineNr"> 73 </span> <span id="L74" class="LineNr"> 74 </span><span class="Comment">//: stash recognizes strings</span> <span id="L75" class="LineNr"> 75 </span> <span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(scenario stash_string)</span> -<span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> main [ +<span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L78" class="LineNr"> 78 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L79" class="LineNr"> 79 </span> stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text <span id="L80" class="LineNr"> 80 </span>] <span id="L81" class="LineNr"> 81 </span><span class="traceContains">+app: foo: abc</span> <span id="L82" class="LineNr"> 82 </span> <span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before "End inspect Special-cases(r, data)")</span> -<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> +<span id="L84" class="LineNr"> 84 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L174'>is_mu_text</a><span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L85" class="LineNr"> 85 </span> assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>data<span class="Delimiter">));</span> -<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> +<span id="L86" class="LineNr"> 86 </span> <span class="Identifier">return</span> <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <span id="L87" class="LineNr"> 87 </span><span class="Delimiter">}</span> <span id="L88" class="LineNr"> 88 </span> <span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before "End $print Special-cases")</span> -<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> -<span id="L91" class="LineNr"> 91 </span> cout << 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 id="L90" class="LineNr"> 90 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L174'>is_mu_text</a><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 id="L91" class="LineNr"> 91 </span> cout << <a href='038new_text.cc.html#L143'>read_mu_text</a><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 id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span> <span id="L93" class="LineNr"> 93 </span> <span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(scenario unicode_string)</span> -<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [ +<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L96" class="LineNr"> 96 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [♠] <span id="L97" class="LineNr"> 97 </span> stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text <span id="L98" class="LineNr"> 98 </span>] <span id="L99" class="LineNr"> 99 </span><span class="traceContains">+app: foo: ♠</span> <span id="L100" class="LineNr">100 </span> <span id="L101" class="LineNr">101 </span><span class="Delimiter">:(scenario stash_space_after_string)</span> -<span id="L102" class="LineNr">102 </span><span class="muRecipe">def</span> main [ +<span id="L102" class="LineNr">102 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L103" class="LineNr">103 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L104" class="LineNr">104 </span> stash <span class="Constant">1</span>:text<span class="Delimiter">,</span> [foo] <span id="L105" class="LineNr">105 </span>] <span id="L106" class="LineNr">106 </span><span class="traceContains">+app: abc foo</span> <span id="L107" class="LineNr">107 </span> <span id="L108" class="LineNr">108 </span><span class="Delimiter">:(scenario stash_string_as_array)</span> -<span id="L109" class="LineNr">109 </span><span class="muRecipe">def</span> main [ +<span id="L109" class="LineNr">109 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L110" class="LineNr">110 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L111" class="LineNr">111 </span> stash *<span class="Constant">1</span>:text <span id="L112" class="LineNr">112 </span>] @@ -180,8 +180,8 @@ if ('onhashchange' in window) { <span id="L119" class="LineNr">119 </span><span class="Comment">//: Allocate more to routine when initializing a literal string</span> <span id="L120" class="LineNr">120 </span><span class="Delimiter">:(scenario new_string_overflow)</span> <span id="L121" class="LineNr">121 </span><span class="Special">% Initial_memory_per_routine = 3;</span> -<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> main [ -<span id="L123" class="LineNr">123 </span> <span class="Constant">1</span>:address:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> +<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L123" class="LineNr">123 </span> <span class="Constant">1</span>:<a href='043space.cc.html#L76'>address</a>:num/<span class="Special">raw <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L124" class="LineNr">124 </span> <span class="Constant">2</span>:text/<span class="Special">raw <- </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 id="L125" class="LineNr">125 </span>] <span id="L126" class="LineNr">126 </span><span class="traceContains">+new: routine allocated memory from 1000 to 1003</span> @@ -189,11 +189,11 @@ if ('onhashchange' in window) { <span id="L128" class="LineNr">128 </span> <span id="L129" class="LineNr">129 </span><span class="Comment">//: helpers</span> <span id="L130" class="LineNr">130 </span><span class="Delimiter">:(code)</span> -<span id="L131" class="LineNr">131 </span><span class="Normal">int</span> unicode_length<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L131" class="LineNr">131 </span><span class="Normal">int</span> <a href='038new_text.cc.html#L131'>unicode_length</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L133" class="LineNr">133 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L134" class="LineNr">134 </span> <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L135" class="LineNr">135 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>curr < 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 id="L135" class="LineNr">135 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>curr < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// carefully bounds-check on the string</span> <span id="L136" class="LineNr">136 </span> <span class="Comment">// before accessing its raw pointer</span> <span id="L137" class="LineNr">137 </span> ++result<span class="Delimiter">;</span> <span id="L138" class="LineNr">138 </span> curr += tb_utf8_char_length<span class="Delimiter">(</span>in[curr]<span class="Delimiter">);</span> @@ -201,14 +201,14 @@ if ('onhashchange' in window) { <span id="L140" class="LineNr">140 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L141" class="LineNr">141 </span><span class="Delimiter">}</span> <span id="L142" class="LineNr">142 </span> -<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> -<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">""</span><span class="Delimiter">;</span> +<span id="L143" class="LineNr">143 </span>string <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L144" class="LineNr">144 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">""</span><span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span> ++address<span class="Delimiter">;</span> <span class="Comment">// skip refcount</span> -<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> +<span id="L146" class="LineNr">146 </span> <span class="Normal">int</span> size = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> <span 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">""</span><span class="Delimiter">;</span> <span id="L148" class="LineNr">148 </span> ostringstream tmp<span class="Delimiter">;</span> <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 <= address+size<span class="Delimiter">;</span> ++curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L150" class="LineNr">150 </span> tmp << to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span><<span class="Normal">uint32_t</span>><span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span> +<span id="L150" class="LineNr">150 </span> tmp << to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span><<span class="Normal">uint32_t</span>><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span> <span id="L151" class="LineNr">151 </span> <span class="Delimiter">}</span> <span id="L152" class="LineNr">152 </span> <span class="Identifier">return</span> tmp<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span> @@ -219,7 +219,7 @@ if ('onhashchange' in window) { <span id="L158" class="LineNr">158 </span> <span id="L159" class="LineNr">159 </span><span class="Delimiter">:(scenario assert)</span> <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> -<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> main [ +<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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] <span id="L163" class="LineNr">163 </span>] <span id="L164" class="LineNr">164 </span><span class="traceContains">+error: this is an assert in Mu</span> @@ -227,19 +227,19 @@ if ('onhashchange' in window) { <span id="L166" class="LineNr">166 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L167" class="LineNr">167 </span>ASSERT<span class="Delimiter">,</span> <span id="L168" class="LineNr">168 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L169" class="LineNr">169 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"assert"</span><span class="Delimiter">,</span> ASSERT<span class="Delimiter">);</span> +<span id="L169" class="LineNr">169 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"assert"</span><span class="Delimiter">,</span> ASSERT<span class="Delimiter">);</span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L171" class="LineNr">171 </span><span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span> -<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> -<span id="L173" class="LineNr">173 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'assert' takes exactly two ingredients rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L172" class="LineNr">172 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L173" class="LineNr">173 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'assert' takes exactly two ingredients rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L174" class="LineNr">174 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span> <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> -<span id="L177" class="LineNr">177 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'assert' requires a boolean for its first ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L177" class="LineNr">177 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'assert' requires a boolean for its first ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L178" class="LineNr">178 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L179" class="LineNr">179 </span> <span class="Delimiter">}</span> <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> && !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> -<span id="L181" class="LineNr">181 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'assert' requires a text as its second ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L181" class="LineNr">181 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'assert' requires a text as its second ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L182" class="LineNr">182 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L183" class="LineNr">183 </span> <span class="Delimiter">}</span> <span id="L184" class="LineNr">184 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -247,10 +247,10 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr">186 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L187" class="LineNr">187 </span><span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span> <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> -<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> -<span id="L190" class="LineNr">190 </span> raise << 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="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L189" class="LineNr">189 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><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> +<span id="L190" class="LineNr">190 </span> <a href='003trace.cc.html#L178'>raise</a> << 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="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L191" class="LineNr">191 </span> <span class="Normal">else</span> -<span id="L192" class="LineNr">192 </span> raise << 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> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L192" class="LineNr">192 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='038new_text.cc.html#L143'>read_mu_text</a><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="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L193" class="LineNr">193 </span> <span class="Delimiter">}</span> <span id="L194" class="LineNr">194 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L195" class="LineNr">195 </span><span class="Delimiter">}</span> @@ -261,24 +261,24 @@ if ('onhashchange' in window) { <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L201" class="LineNr">201 </span>_READ<span class="Delimiter">,</span> <span id="L202" class="LineNr">202 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L203" class="LineNr">203 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$read"</span><span class="Delimiter">,</span> _READ<span class="Delimiter">);</span> +<span id="L203" class="LineNr">203 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$read"</span><span class="Delimiter">,</span> _READ<span class="Delimiter">);</span> <span id="L204" class="LineNr">204 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L205" class="LineNr">205 </span><span class="Normal">case</span> _READ: <span class="Delimiter">{</span> <span id="L206" class="LineNr">206 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L207" class="LineNr">207 </span><span class="Delimiter">}</span> <span id="L208" class="LineNr">208 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L209" class="LineNr">209 </span><span class="Normal">case</span> _READ: <span class="Delimiter">{</span> -<span id="L210" class="LineNr">210 </span> skip_whitespace<span class="Delimiter">(</span>cin<span class="Delimiter">);</span> +<span id="L210" class="LineNr">210 </span> <a href='038new_text.cc.html#L220'>skip_whitespace</a><span class="Delimiter">(</span>cin<span class="Delimiter">);</span> <span id="L211" class="LineNr">211 </span> string result<span class="Delimiter">;</span> -<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> +<span id="L212" class="LineNr">212 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>cin<span class="Delimiter">))</span> <span id="L213" class="LineNr">213 </span> cin >> result<span class="Delimiter">;</span> <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> -<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> +<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><a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>result<span class="Delimiter">));</span> <span id="L216" class="LineNr">216 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L217" class="LineNr">217 </span><span class="Delimiter">}</span> <span id="L218" class="LineNr">218 </span> <span id="L219" class="LineNr">219 </span><span class="Delimiter">:(code)</span> -<span id="L220" class="LineNr">220 </span><span class="Normal">void</span> skip_whitespace<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L220" class="LineNr">220 </span><span class="Normal">void</span> <a href='038new_text.cc.html#L220'>skip_whitespace</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> diff --git a/html/039location_array.cc.html b/html/039location_array.cc.html index 07ba21a3..a3d2a113 100644 --- a/html/039location_array.cc.html +++ b/html/039location_array.cc.html @@ -57,18 +57,18 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L2" class="LineNr"> 2 </span>TO_LOCATION_ARRAY<span class="Delimiter">,</span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L4" class="LineNr"> 4 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"to-location-array"</span><span class="Delimiter">,</span> TO_LOCATION_ARRAY<span class="Delimiter">);</span> +<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"to-location-array"</span><span class="Delimiter">,</span> TO_LOCATION_ARRAY<span class="Delimiter">);</span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L6" class="LineNr"> 6 </span><span class="Normal">case</span> TO_LOCATION_ARRAY: <span class="Delimiter">{</span> <span id="L7" class="LineNr"> 7 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<span id="L9" class="LineNr"> 9 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'to-location-array' has incorrect type: '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L9" class="LineNr"> 9 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'to-location-array' has incorrect type: '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L10" class="LineNr">10 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L11" class="LineNr">11 </span> <span class="Delimiter">}</span> <span id="L12" class="LineNr">12 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L13" class="LineNr">13 </span><span class="Delimiter">}</span> <span id="L14" class="LineNr">14 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L15" class="LineNr">15 </span><span class="Normal">bool</span> <a href='039location_array.cc.html#L15'>is_address_of_array_of_numbers</a><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 id="L16" class="LineNr">16 </span> canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <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">"address"</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L18" class="LineNr">18 </span> drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">);</span> @@ -76,7 +76,7 @@ if ('onhashchange' in window) { <span id="L20" class="LineNr">20 </span> drop_from_type<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"array"</span><span class="Delimiter">);</span> <span id="L21" class="LineNr">21 </span> <span class="Identifier">return</span> x<span class="Delimiter">.</span>type && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>atom && x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>value == get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L22" class="LineNr">22 </span><span class="Delimiter">}</span> -<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& expected_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L23" class="LineNr">23 </span><span class="Normal">bool</span> <a href='039location_array.cc.html#L23'>is_compound_type_starting_with</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string& expected_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L25" class="LineNr">25 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L26" class="LineNr">26 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> @@ -85,19 +85,19 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr">29 </span> <span id="L30" class="LineNr">30 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L31" class="LineNr">31 </span><span class="Normal">case</span> TO_LOCATION_ARRAY: <span class="Delimiter">{</span> -<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> +<span id="L32" class="LineNr">32 </span> <span class="Normal">int</span> array_size = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <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> <span id="L34" class="LineNr">34 </span> ensure_space<span class="Delimiter">(</span>allocation_size<span class="Delimiter">);</span> <span id="L35" class="LineNr">35 </span> <span class="Normal">const</span> <span class="Normal">int</span> result = Current_routine<span class="Delimiter">-></span>alloc<span class="Delimiter">;</span> <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> <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> <span id="L38" class="LineNr">38 </span> <span class="Comment">// initialize array refcount</span> -<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> +<span id="L39" class="LineNr">39 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L40" class="LineNr">40 </span> <span class="Comment">// initialize array length</span> -<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> +<span id="L41" class="LineNr">41 </span> <a href='001help.cc.html#L218'>put</a><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 id="L42" class="LineNr">42 </span> <span class="Comment">// now copy over data</span> <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 < array_size<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> -<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> +<span id="L44" class="LineNr">44 </span> <a href='001help.cc.html#L218'>put</a><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 id="L45" class="LineNr">45 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L46" class="LineNr">46 </span><span class="Delimiter">}</span> </pre> diff --git a/html/040brace.cc.html b/html/040brace.cc.html index e6701738..85f5b434 100644 --- a/html/040brace.cc.html +++ b/html/040brace.cc.html @@ -80,38 +80,38 @@ if ('onhashchange' in window) { <span id="L21" class="LineNr"> 21 </span> <span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(scenario brace_conversion)</span> -<span id="L24" class="LineNr"> 24 </span><span class="muRecipe">def</span> main [ +<span id="L24" class="LineNr"> 24 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L25" class="LineNr"> 25 </span> <span class="Delimiter">{</span> <span id="L26" class="LineNr"> 26 </span> <span class="Identifier">break</span> <span id="L27" class="LineNr"> 27 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L28" class="LineNr"> 28 </span> <span class="Delimiter">}</span> <span id="L29" class="LineNr"> 29 </span>] -<span id="L30" class="LineNr"> 30 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L30" class="LineNr"> 30 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L31" class="LineNr"> 31 </span><span class="traceContains">+transform: jump 1:offset</span> <span id="L32" class="LineNr"> 32 </span><span class="traceContains">+transform: copy ...</span> <span id="L33" class="LineNr"> 33 </span> <span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before "End Instruction Modifying Transforms")</span> -<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> +<span id="L35" class="LineNr"> 35 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='040brace.cc.html#L38'>transform_braces</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L36" class="LineNr"> 36 </span> <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L38" class="LineNr"> 38 </span><span class="Normal">void</span> <a href='040brace.cc.html#L38'>transform_braces</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <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> <span id="L41" class="LineNr"> 41 </span> list<pair<<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>> > braces<span class="Delimiter">;</span> -<span id="L42" class="LineNr"> 42 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- transform braces for recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> -<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 < 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 id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L44" class="LineNr"> 44 </span> <span class="Normal">const</span> instruction& 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 id="L45" class="LineNr"> 45 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">"{"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L46" class="LineNr"> 46 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"push (open, "</span> << index << <span class="Constant">")"</span> << end<span class="Delimiter">();</span> +<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"push (open, "</span> << index << <span class="Constant">")"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L47" class="LineNr"> 47 </span> braces<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<<span class="Normal">int</span><span class="Delimiter">,</span><span class="Normal">int</span>><span class="Delimiter">(</span>OPEN<span class="Delimiter">,</span> index<span class="Delimiter">));</span> <span id="L48" class="LineNr"> 48 </span> <span class="Delimiter">}</span> <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">"}"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L50" class="LineNr"> 50 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"push (close, "</span> << index << <span class="Constant">")"</span> << end<span class="Delimiter">();</span> +<span id="L50" class="LineNr"> 50 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"push (close, "</span> << index << <span class="Constant">")"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L51" class="LineNr"> 51 </span> braces<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<<span class="Normal">int</span><span class="Delimiter">,</span><span class="Normal">int</span>><span class="Delimiter">(</span>CLOSE<span class="Delimiter">,</span> index<span class="Delimiter">));</span> <span id="L52" class="LineNr"> 52 </span> <span class="Delimiter">}</span> <span id="L53" class="LineNr"> 53 </span> <span class="Delimiter">}</span> <span id="L54" class="LineNr"> 54 </span> stack<<span class="Comment">/*</span><span class="Comment">step</span><span class="Comment">*/</span><span class="Normal">int</span>> open_braces<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L56" class="LineNr"> 56 </span> instruction& 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 id="L57" class="LineNr"> 57 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label == <span class="Constant">"{"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L58" class="LineNr"> 58 </span> open_braces<span class="Delimiter">.</span>push<span class="Delimiter">(</span>index<span class="Delimiter">);</span> @@ -119,7 +119,7 @@ if ('onhashchange' in window) { <span id="L60" class="LineNr"> 60 </span> <span class="Delimiter">}</span> <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">"}"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L63" class="LineNr"> 63 </span> raise << <span class="Constant">"missing '{' in '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"missing '{' in '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L64" class="LineNr"> 64 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L65" class="LineNr"> 65 </span> <span class="Delimiter">}</span> <span id="L66" class="LineNr"> 66 </span> open_braces<span class="Delimiter">.</span>pop<span class="Delimiter">();</span> @@ -132,13 +132,13 @@ if ('onhashchange' in window) { <span id="L73" class="LineNr"> 73 </span> && inst<span class="Delimiter">.</span>old_name != <span class="Constant">"break"</span> <span id="L74" class="LineNr"> 74 </span> && inst<span class="Delimiter">.</span>old_name != <span class="Constant">"break-if"</span> <span id="L75" class="LineNr"> 75 </span> && inst<span class="Delimiter">.</span>old_name != <span class="Constant">"break-unless"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L76" class="LineNr"> 76 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>old_name << <span class="Constant">" ..."</span> << end<span class="Delimiter">();</span> +<span id="L76" class="LineNr"> 76 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>old_name << <span class="Constant">" ..."</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L77" class="LineNr"> 77 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L78" class="LineNr"> 78 </span> <span class="Delimiter">}</span> <span id="L79" class="LineNr"> 79 </span> <span class="Comment">// check for errors</span> <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">"-if"</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">"-unless"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L82" class="LineNr"> 82 </span> raise << <span class="Constant">"'"</span> << inst<span class="Delimiter">.</span>old_name << <span class="Constant">"' expects 1 or 2 ingredients, but got none</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L82" class="LineNr"> 82 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"'"</span> << inst<span class="Delimiter">.</span>old_name << <span class="Constant">"' expects 1 or 2 ingredients, but got none</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L83" class="LineNr"> 83 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L84" class="LineNr"> 84 </span> <span class="Delimiter">}</span> <span id="L85" class="LineNr"> 85 </span> <span class="Delimiter">}</span> @@ -158,52 +158,52 @@ if ('onhashchange' in window) { <span id="L99" class="LineNr"> 99 </span> <span class="Comment">// check for explicitly provided targets</span> <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">"-if"</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">"-unless"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L101" class="LineNr">101 </span> <span class="Comment">// conditional branches check arg 1</span> -<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">1</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> -<span id="L103" class="LineNr">103 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">' '</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">":offset</span><span class="Constant">" << end();</span> +<span id="L102" class="LineNr">102 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</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> +<span id="L103" class="LineNr">103 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">' '</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">":offset</span><span class="Constant">" << end();</span> <span id="L104" class="LineNr">104 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span> <span id="L106" class="LineNr">106 </span> <span class="Delimiter">}</span> <span id="L107" class="LineNr">107 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L108" class="LineNr">108 </span> <span class="Comment">// unconditional branches check arg 0</span> <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> && 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> -<span id="L110" class="LineNr">110 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</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="Constant">":offset</span><span class="Constant">" << end();</span> +<span id="L110" class="LineNr">110 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</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="Constant">":offset</span><span class="Constant">" << end();</span> <span id="L111" class="LineNr">111 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L112" class="LineNr">112 </span> <span class="Delimiter">}</span> <span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span> <span id="L114" class="LineNr">114 </span> <span class="Comment">// if implicit, compute target</span> <span id="L115" class="LineNr">115 </span> reagent target<span class="Delimiter">;</span> <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">"offset"</span><span class="Delimiter">);</span> -<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> +<span id="L117" class="LineNr">117 </span> target<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <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> -<span id="L119" class="LineNr">119 </span> raise << <span class="Constant">"'"</span> << inst<span class="Delimiter">.</span>old_name << <span class="Constant">"' needs a '{' before</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"'"</span> << inst<span class="Delimiter">.</span>old_name << <span class="Constant">"' needs a '{' before</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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">"loop"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> -<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> +<span id="L121" class="LineNr">121 </span> target<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>open_braces<span class="Delimiter">.</span>top<span class="Delimiter">()</span>-index<span class="Delimiter">);</span> <span id="L122" class="LineNr">122 </span> <span class="Normal">else</span> <span class="Comment">// break instruction</span> -<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> +<span id="L123" class="LineNr">123 </span> target<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='040brace.cc.html#L135'>matching_brace</a><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> <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> <span id="L125" class="LineNr">125 </span> <span class="Comment">// log computed target</span> <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">"jump"</span><span class="Delimiter">)</span> -<span id="L127" class="LineNr">127 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> << <span class="Constant">":offset</span><span class="Constant">" << end();</span> +<span id="L127" class="LineNr">127 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"jump "</span> << no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> << <span class="Constant">":offset</span><span class="Constant">" << end();</span> <span id="L128" class="LineNr">128 </span> <span class="Normal">else</span> -<span id="L129" class="LineNr">129 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">' '</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="Constant">", "</span> << no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> << <span class="Constant">":offset</span><span class="Constant">" << end();</span> +<span id="L129" class="LineNr">129 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">' '</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="Constant">", "</span> << no_scientific<span class="Delimiter">(</span>target<span class="Delimiter">.</span>value<span class="Delimiter">)</span> << <span class="Constant">":offset</span><span class="Constant">" << end();</span> <span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span> <span id="L131" class="LineNr">131 </span><span class="Delimiter">}</span> <span id="L132" class="LineNr">132 </span> <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> <span id="L134" class="LineNr">134 </span><span class="Comment">// enable future signed arithmetic</span> -<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<pair<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>> >& braces<span class="Delimiter">,</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L135" class="LineNr">135 </span><span class="Normal">int</span> <a href='040brace.cc.html#L135'>matching_brace</a><span class="Delimiter">(</span><span class="Normal">int</span> index<span class="Delimiter">,</span> <span class="Normal">const</span> list<pair<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>> >& braces<span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L136" class="LineNr">136 </span> <span class="Normal">int</span> stacksize = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L137" class="LineNr">137 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>list<pair<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>> >::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 id="L137" class="LineNr">137 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>list<pair<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>> >::const_iterator p = braces<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != braces<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L138" class="LineNr">138 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>second < index<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L139" class="LineNr">139 </span> stacksize += <span class="Delimiter">(</span>p<span class="Delimiter">-></span>first ? <span class="Constant">1</span> : -<span class="Constant">1</span><span class="Delimiter">);</span> <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">-></span>second<span class="Delimiter">;</span> <span id="L141" class="LineNr">141 </span> <span class="Delimiter">}</span> -<span id="L142" class="LineNr">142 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"unbalanced '{'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L142" class="LineNr">142 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"unbalanced '{'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L143" class="LineNr">143 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L138'>SIZE</a><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 id="L144" class="LineNr">144 </span><span class="Delimiter">}</span> <span id="L145" class="LineNr">145 </span> <span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenario loop)</span> -<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [ +<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L148" class="LineNr">148 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L149" class="LineNr">149 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L150" class="LineNr">150 </span> <span class="Delimiter">{</span> @@ -211,25 +211,25 @@ if ('onhashchange' in window) { <span id="L152" class="LineNr">152 </span> loop <span id="L153" class="LineNr">153 </span> <span class="Delimiter">}</span> <span id="L154" class="LineNr">154 </span>] -<span id="L155" class="LineNr">155 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L155" class="LineNr">155 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L156" class="LineNr">156 </span><span class="traceContains">+transform: copy ...</span> <span id="L157" class="LineNr">157 </span><span class="traceContains">+transform: copy ...</span> <span id="L158" class="LineNr">158 </span><span class="traceContains">+transform: copy ...</span> <span id="L159" class="LineNr">159 </span><span class="traceContains">+transform: jump -2:offset</span> <span id="L160" class="LineNr">160 </span> <span id="L161" class="LineNr">161 </span><span class="Delimiter">:(scenario break_empty_block)</span> -<span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> main [ +<span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L163" class="LineNr">163 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L164" class="LineNr">164 </span> <span class="Delimiter">{</span> <span id="L165" class="LineNr">165 </span> <span class="Identifier">break</span> <span id="L166" class="LineNr">166 </span> <span class="Delimiter">}</span> <span id="L167" class="LineNr">167 </span>] -<span id="L168" class="LineNr">168 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L168" class="LineNr">168 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L169" class="LineNr">169 </span><span class="traceContains">+transform: copy ...</span> <span id="L170" class="LineNr">170 </span><span class="traceContains">+transform: jump 0:offset</span> <span id="L171" class="LineNr">171 </span> <span id="L172" class="LineNr">172 </span><span class="Delimiter">:(scenario break_cascading)</span> -<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [ +<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L174" class="LineNr">174 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L175" class="LineNr">175 </span> <span class="Delimiter">{</span> <span id="L176" class="LineNr">176 </span> <span class="Identifier">break</span> @@ -238,13 +238,13 @@ if ('onhashchange' in window) { <span id="L179" class="LineNr">179 </span> <span class="Identifier">break</span> <span id="L180" class="LineNr">180 </span> <span class="Delimiter">}</span> <span id="L181" class="LineNr">181 </span>] -<span id="L182" class="LineNr">182 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L182" class="LineNr">182 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L183" class="LineNr">183 </span><span class="traceContains">+transform: copy ...</span> <span id="L184" class="LineNr">184 </span><span class="traceContains">+transform: jump 0:offset</span> <span id="L185" class="LineNr">185 </span><span class="traceContains">+transform: jump 0:offset</span> <span id="L186" class="LineNr">186 </span> <span id="L187" class="LineNr">187 </span><span class="Delimiter">:(scenario break_cascading_2)</span> -<span id="L188" class="LineNr">188 </span><span class="muRecipe">def</span> main [ +<span id="L188" class="LineNr">188 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L189" class="LineNr">189 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L190" class="LineNr">190 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L191" class="LineNr">191 </span> <span class="Delimiter">{</span> @@ -255,7 +255,7 @@ if ('onhashchange' in window) { <span id="L196" class="LineNr">196 </span> <span class="Identifier">break</span> <span id="L197" class="LineNr">197 </span> <span class="Delimiter">}</span> <span id="L198" class="LineNr">198 </span>] -<span id="L199" class="LineNr">199 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L199" class="LineNr">199 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L200" class="LineNr">200 </span><span class="traceContains">+transform: copy ...</span> <span id="L201" class="LineNr">201 </span><span class="traceContains">+transform: copy ...</span> <span id="L202" class="LineNr">202 </span><span class="traceContains">+transform: jump 1:offset</span> @@ -263,7 +263,7 @@ if ('onhashchange' in window) { <span id="L204" class="LineNr">204 </span><span class="traceContains">+transform: jump 0:offset</span> <span id="L205" class="LineNr">205 </span> <span id="L206" class="LineNr">206 </span><span class="Delimiter">:(scenario break_if)</span> -<span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> main [ +<span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L208" class="LineNr">208 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L209" class="LineNr">209 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L210" class="LineNr">210 </span> <span class="Delimiter">{</span> @@ -274,7 +274,7 @@ if ('onhashchange' in window) { <span id="L215" class="LineNr">215 </span> <span class="Identifier">break</span> <span id="L216" class="LineNr">216 </span> <span class="Delimiter">}</span> <span id="L217" class="LineNr">217 </span>] -<span id="L218" class="LineNr">218 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L218" class="LineNr">218 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L219" class="LineNr">219 </span><span class="traceContains">+transform: copy ...</span> <span id="L220" class="LineNr">220 </span><span class="traceContains">+transform: copy ...</span> <span id="L221" class="LineNr">221 </span><span class="traceContains">+transform: jump-if 2, 1:offset</span> @@ -282,7 +282,7 @@ if ('onhashchange' in window) { <span id="L223" class="LineNr">223 </span><span class="traceContains">+transform: jump 0:offset</span> <span id="L224" class="LineNr">224 </span> <span id="L225" class="LineNr">225 </span><span class="Delimiter">:(scenario break_nested)</span> -<span id="L226" class="LineNr">226 </span><span class="muRecipe">def</span> main [ +<span id="L226" class="LineNr">226 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L227" class="LineNr">227 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L228" class="LineNr">228 </span> <span class="Delimiter">{</span> <span id="L229" class="LineNr">229 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -296,7 +296,7 @@ if ('onhashchange' in window) { <span id="L237" class="LineNr">237 </span><span class="traceContains">+transform: jump 4:offset</span> <span id="L238" class="LineNr">238 </span> <span id="L239" class="LineNr">239 </span><span class="Delimiter">:(scenario break_nested_degenerate)</span> -<span id="L240" class="LineNr">240 </span><span class="muRecipe">def</span> main [ +<span id="L240" class="LineNr">240 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L241" class="LineNr">241 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L242" class="LineNr">242 </span> <span class="Delimiter">{</span> <span id="L243" class="LineNr">243 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -309,7 +309,7 @@ if ('onhashchange' in window) { <span id="L250" class="LineNr">250 </span><span class="traceContains">+transform: jump 3:offset</span> <span id="L251" class="LineNr">251 </span> <span id="L252" class="LineNr">252 </span><span class="Delimiter">:(scenario break_nested_degenerate_2)</span> -<span id="L253" class="LineNr">253 </span><span class="muRecipe">def</span> main [ +<span id="L253" class="LineNr">253 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L254" class="LineNr">254 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L255" class="LineNr">255 </span> <span class="Delimiter">{</span> <span id="L256" class="LineNr">256 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -322,7 +322,7 @@ if ('onhashchange' in window) { <span id="L263" class="LineNr">263 </span> <span id="L264" class="LineNr">264 </span><span class="Delimiter">:(scenario break_label)</span> <span id="L265" class="LineNr">265 </span><span class="Special">% Hide_errors = true;</span> -<span id="L266" class="LineNr">266 </span><span class="muRecipe">def</span> main [ +<span id="L266" class="LineNr">266 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L267" class="LineNr">267 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L268" class="LineNr">268 </span> <span class="Delimiter">{</span> <span id="L269" class="LineNr">269 </span> <span class="Identifier">break</span> <span class="Constant">+foo:offset</span> @@ -331,7 +331,7 @@ if ('onhashchange' in window) { <span id="L272" class="LineNr">272 </span><span class="traceContains">+transform: jump +foo:offset</span> <span id="L273" class="LineNr">273 </span> <span id="L274" class="LineNr">274 </span><span class="Delimiter">:(scenario break_unless)</span> -<span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> main [ +<span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L276" class="LineNr">276 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L277" class="LineNr">277 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L278" class="LineNr">278 </span> <span class="Delimiter">{</span> @@ -339,14 +339,14 @@ if ('onhashchange' in window) { <span id="L280" class="LineNr">280 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L281" class="LineNr">281 </span> <span class="Delimiter">}</span> <span id="L282" class="LineNr">282 </span>] -<span id="L283" class="LineNr">283 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L283" class="LineNr">283 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L284" class="LineNr">284 </span><span class="traceContains">+transform: copy ...</span> <span id="L285" class="LineNr">285 </span><span class="traceContains">+transform: copy ...</span> <span id="L286" class="LineNr">286 </span><span class="traceContains">+transform: jump-unless 2, 1:offset</span> <span id="L287" class="LineNr">287 </span><span class="traceContains">+transform: copy ...</span> <span id="L288" class="LineNr">288 </span> <span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenario loop_unless)</span> -<span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> main [ +<span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L291" class="LineNr">291 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L292" class="LineNr">292 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L293" class="LineNr">293 </span> <span class="Delimiter">{</span> @@ -354,14 +354,14 @@ if ('onhashchange' in window) { <span id="L295" class="LineNr">295 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L296" class="LineNr">296 </span> <span class="Delimiter">}</span> <span id="L297" class="LineNr">297 </span>] -<span id="L298" class="LineNr">298 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L298" class="LineNr">298 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L299" class="LineNr">299 </span><span class="traceContains">+transform: copy ...</span> <span id="L300" class="LineNr">300 </span><span class="traceContains">+transform: copy ...</span> <span id="L301" class="LineNr">301 </span><span class="traceContains">+transform: jump-unless 2, -1:offset</span> <span id="L302" class="LineNr">302 </span><span class="traceContains">+transform: copy ...</span> <span id="L303" class="LineNr">303 </span> <span id="L304" class="LineNr">304 </span><span class="Delimiter">:(scenario loop_nested)</span> -<span id="L305" class="LineNr">305 </span><span class="muRecipe">def</span> main [ +<span id="L305" class="LineNr">305 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L306" class="LineNr">306 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L307" class="LineNr">307 </span> <span class="Delimiter">{</span> <span id="L308" class="LineNr">308 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -372,16 +372,16 @@ if ('onhashchange' in window) { <span id="L313" class="LineNr">313 </span> <span class="Constant">5</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L314" class="LineNr">314 </span> <span class="Delimiter">}</span> <span id="L315" class="LineNr">315 </span>] -<span id="L316" class="LineNr">316 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L316" class="LineNr">316 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L317" class="LineNr">317 </span><span class="traceContains">+transform: jump-if 4, -5:offset</span> <span id="L318" class="LineNr">318 </span> <span id="L319" class="LineNr">319 </span><span class="Delimiter">:(scenario loop_label)</span> -<span id="L320" class="LineNr">320 </span><span class="muRecipe">def</span> main [ +<span id="L320" class="LineNr">320 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L321" class="LineNr">321 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L322" class="LineNr">322 </span> +foo <span id="L323" class="LineNr">323 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L324" class="LineNr">324 </span>] -<span id="L325" class="LineNr">325 </span><span class="traceContains">+transform: --- transform braces for recipe main</span> +<span id="L325" class="LineNr">325 </span><span class="traceContains">+transform: --- <a href='012transform.cc.html#L98'>transform</a> braces for <a href='010vm.cc.html#L19'>recipe</a> <a href='000organization.cc.html#L113'>main</a></span> <span id="L326" class="LineNr">326 </span><span class="traceContains">+transform: copy ...</span> <span id="L327" class="LineNr">327 </span><span class="traceContains">+transform: copy ...</span> <span id="L328" class="LineNr">328 </span> @@ -405,14 +405,14 @@ if ('onhashchange' in window) { <span id="L346" class="LineNr">346 </span> <span id="L347" class="LineNr">347 </span><span class="Delimiter">:(scenario break_outside_braces_fails)</span> <span id="L348" class="LineNr">348 </span><span class="Special">% Hide_errors = true;</span> -<span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> main [ +<span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L350" class="LineNr">350 </span> <span class="Identifier">break</span> <span id="L351" class="LineNr">351 </span>] <span id="L352" class="LineNr">352 </span><span class="traceContains">+error: 'break' needs a '{' before</span> <span id="L353" class="LineNr">353 </span> <span id="L354" class="LineNr">354 </span><span class="Delimiter">:(scenario break_conditional_without_ingredient_fails)</span> <span id="L355" class="LineNr">355 </span><span class="Special">% Hide_errors = true;</span> -<span id="L356" class="LineNr">356 </span><span class="muRecipe">def</span> main [ +<span id="L356" class="LineNr">356 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L357" class="LineNr">357 </span> <span class="Delimiter">{</span> <span id="L358" class="LineNr">358 </span> <span class="Identifier">break</span>-<span class="Normal">if</span> <span id="L359" class="LineNr">359 </span> <span class="Delimiter">}</span> @@ -422,7 +422,7 @@ if ('onhashchange' in window) { <span id="L363" class="LineNr">363 </span><span class="Comment">//: Using break we can now implement conditional returns.</span> <span id="L364" class="LineNr">364 </span> <span id="L365" class="LineNr">365 </span><span class="Delimiter">:(scenario return_if)</span> -<span id="L366" class="LineNr">366 </span><span class="muRecipe">def</span> main [ +<span id="L366" class="LineNr">366 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L367" class="LineNr">367 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>test1 <span id="L368" class="LineNr">368 </span>] <span id="L369" class="LineNr">369 </span><span class="muRecipe">def</span> test1 [ @@ -432,7 +432,7 @@ if ('onhashchange' in window) { <span id="L373" class="LineNr">373 </span><span class="traceContains">+mem: storing 35 in location 1</span> <span id="L374" class="LineNr">374 </span> <span id="L375" class="LineNr">375 </span><span class="Delimiter">:(scenario return_if_2)</span> -<span id="L376" class="LineNr">376 </span><span class="muRecipe">def</span> main [ +<span id="L376" class="LineNr">376 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L377" class="LineNr">377 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>test1 <span id="L378" class="LineNr">378 </span>] <span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> test1 [ @@ -441,7 +441,7 @@ if ('onhashchange' in window) { <span id="L382" class="LineNr">382 </span>] <span id="L383" class="LineNr">383 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L384" class="LineNr">384 </span> -<span id="L385" class="LineNr">385 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, recipe result)")</span> +<span id="L385" class="LineNr">385 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> <span id="L386" class="LineNr">386 </span><span class="Comment">// rewrite `return-if a, b, c, ...` to</span> <span id="L387" class="LineNr">387 </span><span class="Comment">// ```</span> <span id="L388" class="LineNr">388 </span><span class="Comment">// {</span> @@ -451,11 +451,11 @@ if ('onhashchange' in window) { <span id="L392" class="LineNr">392 </span><span class="Comment">// ```</span> <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">"return-if"</span> || curr<span class="Delimiter">.</span>name == <span class="Constant">"reply-if"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L395" class="LineNr">395 </span> emit_return_block<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">"break-unless"</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span> -<span id="L396" class="LineNr">396 </span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L395" class="LineNr">395 </span> <a href='040brace.cc.html#L420'>emit_return_block</a><span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">"break-unless"</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span> +<span id="L396" class="LineNr">396 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L397" class="LineNr">397 </span> <span class="Delimiter">}</span> <span id="L398" class="LineNr">398 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L399" class="LineNr">399 </span> raise << <span class="Constant">"'"</span> << curr<span class="Delimiter">.</span>name << <span class="Constant">"' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L399" class="LineNr">399 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"'"</span> << curr<span class="Delimiter">.</span>name << <span class="Constant">"' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L400" class="LineNr">400 </span> <span class="Delimiter">}</span> <span id="L401" class="LineNr">401 </span><span class="Delimiter">}</span> <span id="L402" class="LineNr">402 </span><span class="Comment">// rewrite `return-unless a, b, c, ...` to</span> @@ -467,34 +467,34 @@ if ('onhashchange' in window) { <span id="L408" class="LineNr">408 </span><span class="Comment">// ```</span> <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">"return-unless"</span> || curr<span class="Delimiter">.</span>name == <span class="Constant">"reply-unless"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L411" class="LineNr">411 </span> emit_return_block<span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">"break-if"</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span> -<span id="L412" class="LineNr">412 </span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L411" class="LineNr">411 </span> <a href='040brace.cc.html#L420'>emit_return_block</a><span class="Delimiter">(</span>result<span class="Delimiter">,</span> <span class="Constant">"break-if"</span><span class="Delimiter">,</span> curr<span class="Delimiter">);</span> +<span id="L412" class="LineNr">412 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L413" class="LineNr">413 </span> <span class="Delimiter">}</span> <span id="L414" class="LineNr">414 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L415" class="LineNr">415 </span> raise << <span class="Constant">"'"</span> << curr<span class="Delimiter">.</span>name << <span class="Constant">"' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L415" class="LineNr">415 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"'"</span> << curr<span class="Delimiter">.</span>name << <span class="Constant">"' never yields any products</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L416" class="LineNr">416 </span> <span class="Delimiter">}</span> <span id="L417" class="LineNr">417 </span><span class="Delimiter">}</span> <span id="L418" class="LineNr">418 </span> <span id="L419" class="LineNr">419 </span><span class="Delimiter">:(code)</span> -<span id="L420" class="LineNr">420 </span><span class="Normal">void</span> emit_return_block<span class="Delimiter">(</span>recipe& out<span class="Delimiter">,</span> <span class="Normal">const</span> string& break_command<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L420" class="LineNr">420 </span><span class="Normal">void</span> <a href='040brace.cc.html#L420'>emit_return_block</a><span class="Delimiter">(</span>recipe& out<span class="Delimiter">,</span> <span class="Normal">const</span> string& break_command<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L421" class="LineNr">421 </span> <span class="Normal">const</span> vector<reagent>& ingredients = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">;</span> <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> <span id="L423" class="LineNr">423 </span> vector<reagent> return_ingredients<span class="Delimiter">;</span> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>return_ingredients<span class="Delimiter">,</span> return_ingredients<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()));</span> <span id="L425" class="LineNr">425 </span> <span id="L426" class="LineNr">426 </span> <span class="Comment">// {</span> -<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">"{"</span><span class="Delimiter">;</span> +<span id="L427" class="LineNr">427 </span> <a href='010vm.cc.html#L32'>instruction</a> 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">"{"</span><span class="Delimiter">;</span> <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> <span id="L429" class="LineNr">429 </span> <span id="L430" class="LineNr">430 </span> <span class="Comment">// <break command> <condition></span> -<span id="L431" class="LineNr">431 </span> instruction break_inst<span class="Delimiter">;</span> +<span id="L431" class="LineNr">431 </span> <a href='010vm.cc.html#L32'>instruction</a> break_inst<span class="Delimiter">;</span> <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> <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> <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> <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> <span id="L436" class="LineNr">436 </span> <span id="L437" class="LineNr">437 </span> <span class="Comment">// return <return ingredients></span> -<span id="L438" class="LineNr">438 </span> instruction return_inst<span class="Delimiter">;</span> +<span id="L438" class="LineNr">438 </span> <a href='010vm.cc.html#L32'>instruction</a> return_inst<span class="Delimiter">;</span> <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">"return"</span><span class="Delimiter">);</span> <span id="L440" class="LineNr">440 </span> return_inst<span class="Delimiter">.</span>name = <span class="Constant">"return"</span><span class="Delimiter">;</span> <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> @@ -502,7 +502,7 @@ if ('onhashchange' in window) { <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> <span id="L444" class="LineNr">444 </span> <span id="L445" class="LineNr">445 </span> <span class="Comment">// }</span> -<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">"}"</span><span class="Delimiter">;</span> +<span id="L446" class="LineNr">446 </span> <a href='010vm.cc.html#L32'>instruction</a> 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">"}"</span><span class="Delimiter">;</span> <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> <span id="L448" class="LineNr">448 </span><span class="Delimiter">}</span> <span id="L449" class="LineNr">449 </span> @@ -518,12 +518,12 @@ if ('onhashchange' in window) { <span id="L459" class="LineNr">459 </span>LOOP_IF<span class="Delimiter">,</span> <span id="L460" class="LineNr">460 </span>LOOP_UNLESS<span class="Delimiter">,</span> <span id="L461" class="LineNr">461 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L462" class="LineNr">462 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"break"</span><span class="Delimiter">,</span> BREAK<span class="Delimiter">);</span> -<span id="L463" class="LineNr">463 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"break-if"</span><span class="Delimiter">,</span> BREAK_IF<span class="Delimiter">);</span> -<span id="L464" class="LineNr">464 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"break-unless"</span><span class="Delimiter">,</span> BREAK_UNLESS<span class="Delimiter">);</span> -<span id="L465" class="LineNr">465 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"loop"</span><span class="Delimiter">,</span> LOOP<span class="Delimiter">);</span> -<span id="L466" class="LineNr">466 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"loop-if"</span><span class="Delimiter">,</span> LOOP_IF<span class="Delimiter">);</span> -<span id="L467" class="LineNr">467 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"loop-unless"</span><span class="Delimiter">,</span> LOOP_UNLESS<span class="Delimiter">);</span> +<span id="L462" class="LineNr">462 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"break"</span><span class="Delimiter">,</span> BREAK<span class="Delimiter">);</span> +<span id="L463" class="LineNr">463 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"break-if"</span><span class="Delimiter">,</span> BREAK_IF<span class="Delimiter">);</span> +<span id="L464" class="LineNr">464 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"break-unless"</span><span class="Delimiter">,</span> BREAK_UNLESS<span class="Delimiter">);</span> +<span id="L465" class="LineNr">465 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"loop"</span><span class="Delimiter">,</span> LOOP<span class="Delimiter">);</span> +<span id="L466" class="LineNr">466 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"loop-if"</span><span class="Delimiter">,</span> LOOP_IF<span class="Delimiter">);</span> +<span id="L467" class="LineNr">467 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"loop-unless"</span><span class="Delimiter">,</span> LOOP_UNLESS<span class="Delimiter">);</span> <span id="L468" class="LineNr">468 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L469" class="LineNr">469 </span><span class="Normal">case</span> BREAK: <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L470" class="LineNr">470 </span><span class="Normal">case</span> BREAK_IF: <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/041jump_target.cc.html b/html/041jump_target.cc.html index 1b10b1de..62665f41 100644 --- a/html/041jump_target.cc.html +++ b/html/041jump_target.cc.html @@ -68,14 +68,14 @@ if ('onhashchange' in window) { <span id="L8" class="LineNr"> 8 </span> <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> <span id="L10" class="LineNr"> 10 </span><span class="Comment">//: targets.</span> -<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& label<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L11" class="LineNr"> 11 </span><span class="Normal">bool</span> <a href='041jump_target.cc.html#L11'>is_jump_target</a><span class="Delimiter">(</span><span class="Normal">const</span> string& label<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L12" class="LineNr"> 12 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>label == <span class="Constant">"{"</span> || label == <span class="Constant">"}"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L13" class="LineNr"> 13 </span> <span class="Comment">// End is_jump_target Special-cases</span> -<span id="L14" class="LineNr"> 14 </span> <span class="Identifier">return</span> is_label_word<span class="Delimiter">(</span>label<span class="Delimiter">);</span> +<span id="L14" class="LineNr"> 14 </span> <span class="Identifier">return</span> <a href='011load.cc.html#L178'>is_label_word</a><span class="Delimiter">(</span>label<span class="Delimiter">);</span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">}</span> <span id="L16" class="LineNr"> 16 </span> <span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(scenario jump_to_label)</span> -<span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> main [ +<span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L19" class="LineNr"> 19 </span> jump <span class="Constant">+target:label</span> <span id="L20" class="LineNr"> 20 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L21" class="LineNr"> 21 </span> +target @@ -83,79 +83,79 @@ if ('onhashchange' in window) { <span id="L23" class="LineNr"> 23 </span><span class="traceAbsent">-mem: storing 0 in location 1</span> <span id="L24" class="LineNr"> 24 </span> <span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L26" class="LineNr"> 26 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"label"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L26" class="LineNr"> 26 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"label"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L27" class="LineNr"> 27 </span> <span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(before "End Instruction Modifying Transforms")</span> -<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> +<span id="L29" class="LineNr"> 29 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='041jump_target.cc.html#L32'>transform_labels</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L30" class="LineNr"> 30 </span> <span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L32" class="LineNr"> 32 </span><span class="Normal">void</span> <a href='041jump_target.cc.html#L32'>transform_labels</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L33" class="LineNr"> 33 </span> map<string<span class="Delimiter">,</span> <span class="Normal">int</span>> offset<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L35" class="LineNr"> 35 </span> <span class="Normal">const</span> instruction& 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 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> -<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> +<span id="L37" class="LineNr"> 37 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='041jump_target.cc.html#L11'>is_jump_target</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> -<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> +<span id="L39" class="LineNr"> 39 </span> <a href='001help.cc.html#L218'>put</a><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 id="L40" class="LineNr"> 40 </span> <span class="Delimiter">}</span> <span id="L41" class="LineNr"> 41 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L42" class="LineNr"> 42 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"duplicate label '"</span> << inst<span class="Delimiter">.</span>label << <span class="Constant">"'"</span> << end<span class="Delimiter">();</span> +<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"duplicate label '"</span> << inst<span class="Delimiter">.</span>label << <span class="Constant">"'"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L43" class="LineNr"> 43 </span> <span class="Comment">// have all jumps skip some random but noticeable and deterministic amount of code</span> -<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> +<span id="L44" class="LineNr"> 44 </span> <a href='001help.cc.html#L218'>put</a><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 id="L45" class="LineNr"> 45 </span> <span class="Delimiter">}</span> <span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span> <span id="L47" class="LineNr"> 47 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L49" class="LineNr"> 49 </span> instruction& 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 id="L50" class="LineNr"> 50 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"jump"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L52" class="LineNr"> 52 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump' expects an ingredient but got none</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L52" class="LineNr"> 52 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'jump' expects an ingredient but got none</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L53" class="LineNr"> 53 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L54" class="LineNr"> 54 </span> <span class="Delimiter">}</span> -<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> +<span id="L55" class="LineNr"> 55 </span> <a href='041jump_target.cc.html#L76'>replace_offset</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L56" class="LineNr"> 56 </span> <span class="Delimiter">}</span> <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">"jump-if"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"jump-unless"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> < <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L59" class="LineNr"> 59 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">"' expects 2 ingredients but got "</span> << SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L58" class="LineNr"> 58 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> < <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L59" class="LineNr"> 59 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">"' expects 2 ingredients but got "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L60" class="LineNr"> 60 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L61" class="LineNr"> 61 </span> <span class="Delimiter">}</span> -<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> +<span id="L62" class="LineNr"> 62 </span> <a href='041jump_target.cc.html#L76'>replace_offset</a><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 id="L63" class="LineNr"> 63 </span> <span class="Delimiter">}</span> <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">"loop"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"break"</span><span class="Delimiter">)</span> -<span id="L65" class="LineNr"> 65 </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> -<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> +<span id="L65" class="LineNr"> 65 </span> && <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> >= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L66" class="LineNr"> 66 </span> <a href='041jump_target.cc.html#L76'>replace_offset</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span> <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">"loop-if"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"loop-unless"</span> <span id="L69" class="LineNr"> 69 </span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"break-if"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"break-unless"</span><span class="Delimiter">)</span> -<span id="L70" class="LineNr"> 70 </span> && SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> >= <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="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> +<span id="L70" class="LineNr"> 70 </span> && <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> >= <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L71" class="LineNr"> 71 </span> <a href='041jump_target.cc.html#L76'>replace_offset</a><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 id="L72" class="LineNr"> 72 </span> <span class="Delimiter">}</span> <span id="L73" class="LineNr"> 73 </span> <span class="Delimiter">}</span> <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span> <span id="L75" class="LineNr"> 75 </span> -<span id="L76" class="LineNr"> 76 </span><span class="Normal">void</span> replace_offset<span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>& 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 id="L76" class="LineNr"> 76 </span><span class="Normal">void</span> <a href='041jump_target.cc.html#L76'>replace_offset</a><span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>& 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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L78" class="LineNr"> 78 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"jump target must be offset or label but is '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L78" class="LineNr"> 78 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"jump target must be offset or label but is '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L79" class="LineNr"> 79 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// no jump by default</span> <span id="L80" class="LineNr"> 80 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L81" class="LineNr"> 81 </span> <span class="Delimiter">}</span> <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> -<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> +<span id="L83" class="LineNr"> 83 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><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 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> -<span id="L85" class="LineNr"> 85 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't jump to label '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L85" class="LineNr"> 85 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't jump to label '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L86" class="LineNr"> 86 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// no jump by default</span> <span id="L87" class="LineNr"> 87 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span> <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> -<span id="L90" class="LineNr"> 90 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't find label '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L90" class="LineNr"> 90 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't find label '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L91" class="LineNr"> 91 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// no jump by default</span> <span id="L92" class="LineNr"> 92 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">}</span> -<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> +<span id="L94" class="LineNr"> 94 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><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 id="L95" class="LineNr"> 95 </span><span class="Delimiter">}</span> <span id="L96" class="LineNr"> 96 </span> <span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(scenario break_to_label)</span> -<span id="L98" class="LineNr"> 98 </span><span class="muRecipe">def</span> main [ +<span id="L98" class="LineNr"> 98 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">{</span> <span id="L100" class="LineNr">100 </span> <span class="Delimiter">{</span> <span id="L101" class="LineNr">101 </span> <span class="Identifier">break</span> <span class="Constant">+target:label</span> @@ -167,7 +167,7 @@ if ('onhashchange' in window) { <span id="L107" class="LineNr">107 </span><span class="traceAbsent">-mem: storing 0 in location 1</span> <span id="L108" class="LineNr">108 </span> <span id="L109" class="LineNr">109 </span><span class="Delimiter">:(scenario jump_if_to_label)</span> -<span id="L110" class="LineNr">110 </span><span class="muRecipe">def</span> main [ +<span id="L110" class="LineNr">110 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L111" class="LineNr">111 </span> <span class="Delimiter">{</span> <span id="L112" class="LineNr">112 </span> <span class="Delimiter">{</span> <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> @@ -179,7 +179,7 @@ if ('onhashchange' in window) { <span id="L119" class="LineNr">119 </span><span class="traceAbsent">-mem: storing 0 in location 1</span> <span id="L120" class="LineNr">120 </span> <span id="L121" class="LineNr">121 </span><span class="Delimiter">:(scenario loop_unless_to_label)</span> -<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> main [ +<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L123" class="LineNr">123 </span> <span class="Delimiter">{</span> <span id="L124" class="LineNr">124 </span> <span class="Delimiter">{</span> <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> @@ -191,7 +191,7 @@ if ('onhashchange' in window) { <span id="L131" class="LineNr">131 </span><span class="traceAbsent">-mem: storing 0 in location 1</span> <span id="L132" class="LineNr">132 </span> <span id="L133" class="LineNr">133 </span><span class="Delimiter">:(scenario jump_runs_code_after_label)</span> -<span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> main [ +<span id="L134" class="LineNr">134 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L135" class="LineNr">135 </span> <span class="Comment"># first a few lines of padding to exercise the offset computation</span> <span id="L136" class="LineNr">136 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L137" class="LineNr">137 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -206,31 +206,31 @@ if ('onhashchange' in window) { <span id="L146" class="LineNr">146 </span> <span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario jump_fails_without_target)</span> <span id="L148" class="LineNr">148 </span><span class="Special">% Hide_errors = true;</span> -<span id="L149" class="LineNr">149 </span><span class="muRecipe">def</span> main [ +<span id="L149" class="LineNr">149 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L150" class="LineNr">150 </span> jump <span id="L151" class="LineNr">151 </span>] -<span id="L152" class="LineNr">152 </span><span class="traceContains">+error: main: 'jump' expects an ingredient but got none</span> +<span id="L152" class="LineNr">152 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'jump' expects an ingredient but got none</span> <span id="L153" class="LineNr">153 </span> <span id="L154" class="LineNr">154 </span><span class="Delimiter">:(scenario jump_fails_without_target_2)</span> <span id="L155" class="LineNr">155 </span><span class="Special">% Hide_errors = true;</span> -<span id="L156" class="LineNr">156 </span><span class="muRecipe">def</span> main [ +<span id="L156" class="LineNr">156 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L157" class="LineNr">157 </span> jump-<span class="Normal">if</span> <span class="Constant">1</span>/<span class="Constant">true</span> <span id="L158" class="LineNr">158 </span>] -<span id="L159" class="LineNr">159 </span><span class="traceContains">+error: main: 'jump-if' expects 2 ingredients but got 1</span> +<span id="L159" class="LineNr">159 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'jump-if' expects 2 ingredients but got 1</span> <span id="L160" class="LineNr">160 </span> <span id="L161" class="LineNr">161 </span><span class="Delimiter">:(scenario recipe_fails_on_duplicate_jump_target)</span> <span id="L162" class="LineNr">162 </span><span class="Special">% Hide_errors = true;</span> -<span id="L163" class="LineNr">163 </span><span class="muRecipe">def</span> main [ +<span id="L163" class="LineNr">163 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L164" class="LineNr">164 </span> +label <span id="L165" class="LineNr">165 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L166" class="LineNr">166 </span> +label <span id="L167" class="LineNr">167 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L168" class="LineNr">168 </span>] -<span id="L169" class="LineNr">169 </span><span class="traceContains">+error: main: duplicate label '+label'</span> +<span id="L169" class="LineNr">169 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: duplicate label '+label'</span> <span id="L170" class="LineNr">170 </span> <span id="L171" class="LineNr">171 </span><span class="Delimiter">:(scenario jump_ignores_nontarget_label)</span> <span id="L172" class="LineNr">172 </span><span class="Special">% Hide_errors = true;</span> -<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [ +<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L174" class="LineNr">174 </span> <span class="Comment"># first a few lines of padding to exercise the offset computation</span> <span id="L175" class="LineNr">175 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L176" class="LineNr">176 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -240,7 +240,7 @@ if ('onhashchange' in window) { <span id="L180" class="LineNr">180 </span> $target <span id="L181" class="LineNr">181 </span> <span class="Constant">5</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L182" class="LineNr">182 </span>] -<span id="L183" class="LineNr">183 </span><span class="traceContains">+error: main: can't jump to label '$target'</span> +<span id="L183" class="LineNr">183 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: can't jump to label '$target'</span> </pre> </body> </html> diff --git a/html/042name.cc.html b/html/042name.cc.html index 5da198ff..f4d2b013 100644 --- a/html/042name.cc.html +++ b/html/042name.cc.html @@ -64,7 +64,7 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Comment">//: convenience.</span> <span id="L4" class="LineNr"> 4 </span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(scenario transform_names)</span> -<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [ +<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L7" class="LineNr"> 7 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L8" class="LineNr"> 8 </span>] <span id="L9" class="LineNr"> 9 </span><span class="traceContains">+name: assign x 1</span> @@ -73,14 +73,14 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario transform_names_fails_on_use_before_define)</span> <span id="L14" class="LineNr"> 14 </span><span class="Special">% Hide_errors = true;</span> -<span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> main [ +<span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L16" class="LineNr"> 16 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy y:num <span id="L17" class="LineNr"> 17 </span>] -<span id="L18" class="LineNr"> 18 </span><span class="traceContains">+error: main: tried to read ingredient 'y' in 'x:num <- copy y:num' but it hasn't been written to yet</span> +<span id="L18" class="LineNr"> 18 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: tried to read ingredient 'y' in 'x:num <- copy y:num' but it hasn't been written to yet</span> <span id="L19" class="LineNr"> 19 </span><span class="Comment"># todo: detect conditional defines</span> <span id="L20" class="LineNr"> 20 </span> <span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(after "Transform.push_back(compute_container_sizes)")</span> -<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> +<span id="L22" class="LineNr"> 22 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='042name.cc.html#L37'>transform_names</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L23" class="LineNr"> 23 </span> <span id="L24" class="LineNr"> 24 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L25" class="LineNr"> 25 </span>map<recipe_ordinal<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> <span class="Normal">int</span>> > Name<span class="Delimiter">;</span> @@ -95,75 +95,75 @@ if ('onhashchange' in window) { <span id="L34" class="LineNr"> 34 </span>Name = Name_snapshot<span class="Delimiter">;</span> <span id="L35" class="LineNr"> 35 </span> <span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L37" class="LineNr"> 37 </span><span class="Normal">void</span> <a href='042name.cc.html#L37'>transform_names</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L38" class="LineNr"> 38 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L39" class="LineNr"> 39 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- transform names for recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L39" class="LineNr"> 39 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- <a href='012transform.cc.html#L98'>transform</a> names for <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L40" class="LineNr"> 40 </span> <span class="Normal">bool</span> names_used = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L41" class="LineNr"> 41 </span> <span class="Normal">bool</span> numeric_locations_used = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L42" class="LineNr"> 42 </span> map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>& names = Name[r]<span class="Delimiter">;</span> <span id="L43" class="LineNr"> 43 </span> <span class="Comment">// store the indices 'used' so far in the map</span> <span id="L44" class="LineNr"> 44 </span> <span class="Normal">int</span>& curr_idx = names[<span class="Constant">""</span>]<span class="Delimiter">;</span> <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> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L47" class="LineNr"> 47 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L48" class="LineNr"> 48 </span> <span class="Comment">// End transform_names(inst) Special-cases</span> <span id="L49" class="LineNr"> 49 </span> <span class="Comment">// map names to addresses</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L51" class="LineNr"> 51 </span> reagent& ingredient = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L52" class="LineNr"> 52 </span> <span class="Comment">// Begin transform_names Ingredient Special-cases(ingredient, inst, caller)</span> -<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> -<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> -<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> -<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> +<span id="L53" class="LineNr"> 53 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L99'>is_disqualified</a><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 id="L54" class="LineNr"> 54 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L141'>is_numeric_location</a><span class="Delimiter">(</span>ingredient<span class="Delimiter">))</span> numeric_locations_used = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L55" class="LineNr"> 55 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L148'>is_named_location</a><span class="Delimiter">(</span>ingredient<span class="Delimiter">))</span> names_used = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L56" class="LineNr"> 56 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>ingredient<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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> -<span id="L58" class="LineNr"> 58 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"tried to read ingredient '"</span> << ingredient<span class="Delimiter">.</span>name << <span class="Constant">"' in '"</span> << to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"' but it hasn't been written to yet</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"tried to read ingredient '"</span> << ingredient<span class="Delimiter">.</span>name << <span class="Constant">"' in '"</span> << to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"' but it hasn't been written to yet</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L59" class="LineNr"> 59 </span> <span class="Comment">// use-before-set Error</span> <span id="L60" class="LineNr"> 60 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L61" class="LineNr"> 61 </span> <span class="Delimiter">}</span> <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> <span id="L63" class="LineNr"> 63 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>v >= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L64" class="LineNr"> 64 </span> ingredient<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>v<span class="Delimiter">);</span> +<span id="L64" class="LineNr"> 64 </span> ingredient<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>v<span class="Delimiter">);</span> <span id="L65" class="LineNr"> 65 </span> <span class="Comment">// Done Placing Ingredient(ingredient, inst, caller)</span> <span id="L66" class="LineNr"> 66 </span> <span class="Delimiter">}</span> <span id="L67" class="LineNr"> 67 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L68" class="LineNr"> 68 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't find a place to store '"</span> << ingredient<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L68" class="LineNr"> 68 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't find a place to store '"</span> << ingredient<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L69" class="LineNr"> 69 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L70" class="LineNr"> 70 </span> <span class="Delimiter">}</span> <span id="L71" class="LineNr"> 71 </span> <span class="Delimiter">}</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L73" class="LineNr"> 73 </span> reagent& product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>out<span class="Delimiter">);</span> <span id="L74" class="LineNr"> 74 </span> <span class="Comment">// Begin transform_names Product Special-cases(product, inst, caller)</span> -<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> -<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> -<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> -<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> -<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> -<span id="L80" class="LineNr"> 80 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"assign "</span> << product<span class="Delimiter">.</span>name << <span class="Constant">" "</span> << curr_idx << end<span class="Delimiter">();</span> +<span id="L75" class="LineNr"> 75 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L99'>is_disqualified</a><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 id="L76" class="LineNr"> 76 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L141'>is_numeric_location</a><span class="Delimiter">(</span>product<span class="Delimiter">))</span> numeric_locations_used = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L77" class="LineNr"> 77 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L148'>is_named_location</a><span class="Delimiter">(</span>product<span class="Delimiter">))</span> names_used = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L78" class="LineNr"> 78 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>product<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L80" class="LineNr"> 80 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"assign "</span> << product<span class="Delimiter">.</span>name << <span class="Constant">" "</span> << curr_idx << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L81" class="LineNr"> 81 </span> names[product<span class="Delimiter">.</span>name] = curr_idx<span class="Delimiter">;</span> <span id="L82" class="LineNr"> 82 </span> curr_idx += size_of<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L83" class="LineNr"> 83 </span> <span class="Delimiter">}</span> <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> <span id="L85" class="LineNr"> 85 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>v >= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L86" class="LineNr"> 86 </span> product<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>v<span class="Delimiter">);</span> +<span id="L86" class="LineNr"> 86 </span> product<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>v<span class="Delimiter">);</span> <span id="L87" class="LineNr"> 87 </span> <span class="Comment">// Done Placing Product(product, inst, caller)</span> <span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span> <span id="L89" class="LineNr"> 89 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L90" class="LineNr"> 90 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't find a place to store '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L90" class="LineNr"> 90 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't find a place to store '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L91" class="LineNr"> 91 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L92" class="LineNr"> 92 </span> <span class="Delimiter">}</span> <span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">}</span> <span id="L94" class="LineNr"> 94 </span> <span class="Delimiter">}</span> <span id="L95" class="LineNr"> 95 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>names_used && numeric_locations_used<span class="Delimiter">)</span> -<span id="L96" class="LineNr"> 96 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"mixing variable names and numeric addresses</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L96" class="LineNr"> 96 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"mixing variable names and numeric addresses</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L97" class="LineNr"> 97 </span><span class="Delimiter">}</span> <span id="L98" class="LineNr"> 98 </span> -<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& x<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> string& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L99" class="LineNr"> 99 </span><span class="Normal">bool</span> <a href='042name.cc.html#L99'>is_disqualified</a><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">mutable</span><span class="Comment">*/</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> string& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L101" class="LineNr">101 </span> raise << maybe<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> << <span class="Constant">"missing type for '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L101" class="LineNr">101 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> << <span class="Constant">"missing type for '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L102" class="LineNr">102 </span> <span class="Comment">// missing-type Error 1</span> <span id="L103" class="LineNr">103 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L104" class="LineNr">104 </span> <span class="Delimiter">}</span> -<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> +<span id="L105" class="LineNr">105 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='022arithmetic.cc.html#L108'>is_raw</a><span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <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> <span id="L107" class="LineNr">107 </span> <span class="Comment">// End is_disqualified Special-cases</span> <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> @@ -174,12 +174,12 @@ if ('onhashchange' in window) { <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> <span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span> <span id="L115" class="LineNr">115 </span> -<span id="L116" class="LineNr">116 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L116" class="LineNr">116 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L118" class="LineNr">118 </span><span class="Delimiter">}</span> <span id="L119" class="LineNr">119 </span> -<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> -<span id="L121" class="LineNr">121 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>type && is_compound_type_starting_with<span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">))</span> +<span id="L120" class="LineNr">120 </span><a href='010vm.cc.html#L124'>type_ordinal</a> <a href='042name.cc.html#L120'>skip_addresses</a><span class="Delimiter">(</span>type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L121" class="LineNr">121 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>type && <a href='039location_array.cc.html#L23'>is_compound_type_starting_with</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">))</span> <span id="L122" class="LineNr">122 </span> type = type<span class="Delimiter">-></span>right<span class="Delimiter">;</span> <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> <span id="L124" class="LineNr">124 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>value<span class="Delimiter">;</span> @@ -191,30 +191,30 @@ if ('onhashchange' in window) { <span id="L130" class="LineNr">130 </span> <span class="Identifier">return</span> base_type<span class="Delimiter">-></span>left<span class="Delimiter">-></span>value<span class="Delimiter">;</span> <span id="L131" class="LineNr">131 </span><span class="Delimiter">}</span> <span id="L132" class="LineNr">132 </span> -<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& name<span class="Delimiter">,</span> <span class="Normal">const</span> string& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L133" class="LineNr">133 </span><span class="Normal">int</span> <a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L124'>type_ordinal</a> t<span class="Delimiter">,</span> <span class="Normal">const</span> string& name<span class="Delimiter">,</span> <span class="Normal">const</span> string& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L134" class="LineNr">134 </span> <span class="Normal">const</span> type_info& container = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> t<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>container<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>container<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<span id="L137" class="LineNr">137 </span> raise << maybe<span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> << <span class="Constant">"unknown element '"</span> << name << <span class="Constant">"' in container '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> t<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L137" class="LineNr">137 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>recipe_name<span class="Delimiter">)</span> << <span class="Constant">"unknown element '"</span> << name << <span class="Constant">"' in container '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> t<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L138" class="LineNr">138 </span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L139" class="LineNr">139 </span><span class="Delimiter">}</span> <span id="L140" class="LineNr">140 </span> -<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& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L141" class="LineNr">141 </span><span class="Normal">bool</span> <a href='042name.cc.html#L141'>is_numeric_location</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<span id="L143" class="LineNr">143 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='022arithmetic.cc.html#L108'>is_raw</a><span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <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">"0"</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 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> +<span id="L145" class="LineNr">145 </span> <span class="Identifier">return</span> <a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">);</span> <span id="L146" class="LineNr">146 </span><span class="Delimiter">}</span> <span id="L147" class="LineNr">147 </span> -<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& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L148" class="LineNr">148 </span><span class="Normal">bool</span> <a href='042name.cc.html#L148'>is_named_location</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> -<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> +<span id="L150" class="LineNr">150 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='022arithmetic.cc.html#L108'>is_raw</a><span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L151" class="LineNr">151 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L156'>is_special_name</a><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 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> <span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span> <span id="L154" class="LineNr">154 </span> <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> -<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& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L156" class="LineNr">156 </span><span class="Normal">bool</span> <a href='042name.cc.html#L156'>is_special_name</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L157" class="LineNr">157 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"_"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L158" class="LineNr">158 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"0"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L159" class="LineNr">159 </span> <span class="Comment">// End is_special_name Special-cases</span> @@ -222,7 +222,7 @@ if ('onhashchange' in window) { <span id="L161" class="LineNr">161 </span><span class="Delimiter">}</span> <span id="L162" class="LineNr">162 </span> <span id="L163" class="LineNr">163 </span><span class="Delimiter">:(scenario transform_names_supports_containers)</span> -<span id="L164" class="LineNr">164 </span><span class="muRecipe">def</span> main [ +<span id="L164" class="LineNr">164 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L165" class="LineNr">165 </span> <span class="Normal">x</span>:point<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L166" class="LineNr">166 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> <span id="L167" class="LineNr">167 </span>] @@ -231,7 +231,7 @@ if ('onhashchange' in window) { <span id="L170" class="LineNr">170 </span><span class="traceContains">+name: assign y 3</span> <span id="L171" class="LineNr">171 </span> <span id="L172" class="LineNr">172 </span><span class="Delimiter">:(scenario transform_names_supports_static_arrays)</span> -<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [ +<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L174" class="LineNr">174 </span> <span class="Normal">x</span>:@:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L175" class="LineNr">175 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> <span id="L176" class="LineNr">176 </span>] @@ -241,7 +241,7 @@ if ('onhashchange' in window) { <span id="L180" class="LineNr">180 </span> <span id="L181" class="LineNr">181 </span><span class="Delimiter">:(scenario transform_names_passes_dummy)</span> <span id="L182" class="LineNr">182 </span><span class="Comment"># _ is just a dummy result that never gets consumed</span> -<span id="L183" class="LineNr">183 </span><span class="muRecipe">def</span> main [ +<span id="L183" class="LineNr">183 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L184" class="LineNr">184 </span> _<span class="Delimiter">,</span> x:num<span class="Special"> <- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L185" class="LineNr">185 </span>] <span id="L186" class="LineNr">186 </span><span class="traceContains">+name: assign x 1</span> @@ -251,7 +251,7 @@ if ('onhashchange' in window) { <span id="L190" class="LineNr">190 </span><span class="Delimiter">:(scenarios run)</span> <span id="L191" class="LineNr">191 </span><span class="Delimiter">:(scenario transform_names_passes_raw)</span> <span id="L192" class="LineNr">192 </span><span class="Special">% Hide_errors = true;</span> -<span id="L193" class="LineNr">193 </span><span class="muRecipe">def</span> main [ +<span id="L193" class="LineNr">193 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L194" class="LineNr">194 </span> <span class="Normal">x</span>:num/<span class="Special">raw <- </span>copy <span class="Constant">0</span> <span id="L195" class="LineNr">195 </span>] <span id="L196" class="LineNr">196 </span><span class="traceAbsent">-name: assign x 1</span> @@ -260,38 +260,38 @@ if ('onhashchange' in window) { <span id="L199" class="LineNr">199 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario transform_names_fails_when_mixing_names_and_numeric_locations)</span> <span id="L201" class="LineNr">201 </span><span class="Special">% Hide_errors = true;</span> -<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> main [ +<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L203" class="LineNr">203 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:num <span id="L204" class="LineNr">204 </span>] -<span id="L205" class="LineNr">205 </span><span class="traceContains">+error: main: mixing variable names and numeric addresses</span> +<span id="L205" class="LineNr">205 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: mixing variable names and numeric addresses</span> <span id="L206" class="LineNr">206 </span> <span id="L207" class="LineNr">207 </span><span class="Delimiter">:(scenario transform_names_fails_when_mixing_names_and_numeric_locations_2)</span> <span id="L208" class="LineNr">208 </span><span class="Special">% Hide_errors = true;</span> -<span id="L209" class="LineNr">209 </span><span class="muRecipe">def</span> main [ +<span id="L209" class="LineNr">209 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L210" class="LineNr">210 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L211" class="LineNr">211 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy x:num <span id="L212" class="LineNr">212 </span>] -<span id="L213" class="LineNr">213 </span><span class="traceContains">+error: main: mixing variable names and numeric addresses</span> +<span id="L213" class="LineNr">213 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: mixing variable names and numeric addresses</span> <span id="L214" class="LineNr">214 </span> <span id="L215" class="LineNr">215 </span><span class="Delimiter">:(scenario transform_names_does_not_fail_when_mixing_names_and_raw_locations)</span> -<span id="L216" class="LineNr">216 </span><span class="muRecipe">def</span> main [ +<span id="L216" class="LineNr">216 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L217" class="LineNr">217 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:num/<span class="Special">raw</span> <span id="L218" class="LineNr">218 </span>] -<span id="L219" class="LineNr">219 </span><span class="traceAbsent">-error: main: mixing variable names and numeric addresses</span> +<span id="L219" class="LineNr">219 </span><span class="traceAbsent">-error: <a href='000organization.cc.html#L113'>main</a>: mixing variable names and numeric addresses</span> <span id="L220" class="LineNr">220 </span>$error: <span class="Constant">0</span> <span id="L221" class="LineNr">221 </span> <span id="L222" class="LineNr">222 </span><span class="Delimiter">:(scenario transform_names_does_not_fail_when_mixing_names_and_literals)</span> -<span id="L223" class="LineNr">223 </span><span class="muRecipe">def</span> main [ +<span id="L223" class="LineNr">223 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L224" class="LineNr">224 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L225" class="LineNr">225 </span>] -<span id="L226" class="LineNr">226 </span><span class="traceAbsent">-error: main: mixing variable names and numeric addresses</span> +<span id="L226" class="LineNr">226 </span><span class="traceAbsent">-error: <a href='000organization.cc.html#L113'>main</a>: mixing variable names and numeric addresses</span> <span id="L227" class="LineNr">227 </span>$error: <span class="Constant">0</span> <span id="L228" class="LineNr">228 </span> <span id="L229" class="LineNr">229 </span><span class="SalientComment">//:: Support element names for containers in 'get' and 'get-location' and 'put'.</span> <span id="L230" class="LineNr">230 </span><span class="Comment">//: (get-location is implemented later)</span> <span id="L231" class="LineNr">231 </span> <span id="L232" class="LineNr">232 </span><span class="Delimiter">:(scenario transform_names_transforms_container_elements)</span> -<span id="L233" class="LineNr">233 </span><span class="muRecipe">def</span> main [ +<span id="L233" class="LineNr">233 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L234" class="LineNr">234 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L235" class="LineNr">235 </span> <span class="Normal">a</span>:num<span class="Special"> <- </span>get *p:&:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span> <span id="L236" class="LineNr">236 </span> <span class="Normal">b</span>:num<span class="Special"> <- </span>get *p:&:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span> @@ -305,18 +305,18 @@ if ('onhashchange' in window) { <span id="L244" class="LineNr">244 </span> <span class="Comment">//: avoid raising any errors here; later layers will support overloading new</span> <span id="L245" class="LineNr">245 </span> <span class="Comment">//: instructions with the same names (static dispatch), which could lead to</span> <span id="L246" class="LineNr">246 </span> <span class="Comment">//: spurious errors</span> -<span id="L247" class="LineNr">247 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>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 id="L247" class="LineNr">247 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> < <span class="Constant">2</span><span class="Delimiter">)</span> <span id="L248" class="LineNr">248 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L249" class="LineNr">249 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span id="L250" class="LineNr">250 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L251" class="LineNr">251 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L252" class="LineNr">252 </span> <span class="Comment">// since first non-address in base type must be a container, we don't have to canonize</span> -<span id="L253" class="LineNr">253 </span> 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 id="L253" class="LineNr">253 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> base_type = <a href='042name.cc.html#L120'>skip_addresses</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">);</span> <span id="L254" class="LineNr">254 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base_type == -<span class="Constant">1</span><span class="Delimiter">)</span> <span id="L255" class="LineNr">255 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> <span id="L256" class="LineNr">256 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// otherwise we'll raise an error elsewhere</span> -<span id="L257" class="LineNr">257 </span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>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> -<span id="L258" class="LineNr">258 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"element "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" is at offset "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L257" class="LineNr">257 </span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">));</span> +<span id="L258" class="LineNr">258 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"element "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" is at offset "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L259" class="LineNr">259 </span> <span class="Delimiter">}</span> <span id="L260" class="LineNr">260 </span> <span class="Delimiter">}</span> <span id="L261" class="LineNr">261 </span><span class="Delimiter">}</span> @@ -324,7 +324,7 @@ if ('onhashchange' in window) { <span id="L263" class="LineNr">263 </span><span class="Comment">//: this test is actually illegal so can't call run</span> <span id="L264" class="LineNr">264 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L265" class="LineNr">265 </span><span class="Delimiter">:(scenario transform_names_handles_containers)</span> -<span id="L266" class="LineNr">266 </span><span class="muRecipe">def</span> main [ +<span id="L266" class="LineNr">266 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L267" class="LineNr">267 </span> <span class="Normal">a</span>:point<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe <span id="L268" class="LineNr">268 </span> <span class="Normal">b</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe <span id="L269" class="LineNr">269 </span>] @@ -335,7 +335,7 @@ if ('onhashchange' in window) { <span id="L274" class="LineNr">274 </span> <span id="L275" class="LineNr">275 </span><span class="Delimiter">:(scenarios run)</span> <span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario transform_names_handles_exclusive_containers)</span> -<span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> main [ +<span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L278" class="LineNr">278 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L279" class="LineNr">279 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L280" class="LineNr">280 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> @@ -349,19 +349,19 @@ if ('onhashchange' in window) { <span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before "End transform_names(inst) Special-cases")</span> <span id="L289" class="LineNr">289 </span><span class="Comment">// convert variant names of exclusive containers</span> <span id="L290" class="LineNr">290 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"maybe-convert"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L291" class="LineNr">291 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L292" class="LineNr">292 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"exactly 2 ingredients expected in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L291" class="LineNr">291 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L292" class="LineNr">292 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"exactly 2 ingredients expected in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L293" class="LineNr">293 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L294" class="LineNr">294 </span> <span class="Delimiter">}</span> <span id="L295" class="LineNr">295 </span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)));</span> <span id="L296" class="LineNr">296 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L297" class="LineNr">297 </span> <span class="Comment">// since first non-address in base type must be an exclusive container, we don't have to canonize</span> -<span id="L298" class="LineNr">298 </span> 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 id="L298" class="LineNr">298 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> base_type = <a href='042name.cc.html#L120'>skip_addresses</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">);</span> <span id="L299" class="LineNr">299 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base_type == -<span class="Constant">1</span><span class="Delimiter">)</span> -<span id="L300" class="LineNr">300 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"expected an exclusive-container in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L300" class="LineNr">300 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"expected an exclusive-container in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L301" class="LineNr">301 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// otherwise we'll raise an error elsewhere</span> -<span id="L302" class="LineNr">302 </span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>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> -<span id="L303" class="LineNr">303 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"variant "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" has tag "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L302" class="LineNr">302 </span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">));</span> +<span id="L303" class="LineNr">303 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"variant "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" has tag "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L304" class="LineNr">304 </span> <span class="Delimiter">}</span> <span id="L305" class="LineNr">305 </span> <span class="Delimiter">}</span> <span id="L306" class="LineNr">306 </span><span class="Delimiter">}</span> diff --git a/html/043space.cc.html b/html/043space.cc.html index 0d062293..70eae581 100644 --- a/html/043space.cc.html +++ b/html/043space.cc.html @@ -66,14 +66,14 @@ if ('onhashchange' in window) { <span id="L4" class="LineNr"> 4 </span> <span id="L5" class="LineNr"> 5 </span><span class="Comment">//: A space is just an array of any scalar location.</span> <span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L7" class="LineNr"> 7 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"address:array:location"</span><span class="Delimiter">));</span> +<span id="L7" class="LineNr"> 7 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"address:array:location"</span><span class="Delimiter">));</span> <span id="L8" class="LineNr"> 8 </span><span class="Comment">//: Spaces are often called 'scopes' in other languages.</span> -<span id="L9" class="LineNr"> 9 </span>put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"scope"</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">"address:array:location"</span><span class="Delimiter">));</span> +<span id="L9" class="LineNr"> 9 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">"scope"</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"address:array:location"</span><span class="Delimiter">));</span> <span id="L10" class="LineNr"> 10 </span> <span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(scenario set_default_space)</span> <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> <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> -<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [ +<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L15" class="LineNr"> 15 </span> <span class="Comment"># pretend address:array:location; in practice we'll use new</span> <span id="L16" class="LineNr"> 16 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># refcount</span> <span id="L17" class="LineNr"> 17 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">5</span> <span class="Comment"># length</span> @@ -83,7 +83,7 @@ if ('onhashchange' in window) { <span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 23 in location 13</span> <span id="L22" class="LineNr"> 22 </span> <span id="L23" class="LineNr"> 23 </span><span class="Delimiter">:(scenario lookup_sidesteps_default_space)</span> -<span id="L24" class="LineNr"> 24 </span><span class="muRecipe">def</span> main [ +<span id="L24" class="LineNr"> 24 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L25" class="LineNr"> 25 </span> <span class="Comment"># pretend pointer from outside (2000 reserved for refcount)</span> <span id="L26" class="LineNr"> 26 </span> <span class="Constant">2001</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L27" class="LineNr"> 27 </span> <span class="Comment"># pretend address:array:location; in practice we'll use new</span> @@ -99,16 +99,16 @@ if ('onhashchange' in window) { <span id="L37" class="LineNr"> 37 </span><span class="SalientComment">//:: first disable name conversion for 'default-space'</span> <span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(scenario convert_names_passes_default_space)</span> <span id="L39" class="LineNr"> 39 </span><span class="Special">% Hide_errors = true;</span> -<span id="L40" class="LineNr"> 40 </span><span class="muRecipe">def</span> main [ +<span id="L40" class="LineNr"> 40 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L41" class="LineNr"> 41 </span> <span class="Normal">default</span>-space:num<span class="Delimiter">,</span> x:num<span class="Special"> <- </span>copy <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L42" class="LineNr"> 42 </span>] <span id="L43" class="LineNr"> 43 </span><span class="traceContains">+name: assign x 1</span> <span id="L44" class="LineNr"> 44 </span><span class="traceAbsent">-name: assign default-space 1</span> <span id="L45" class="LineNr"> 45 </span> -<span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(before "End is_disqualified Special-cases")</span> +<span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L99'>is_disqualified</a> Special-cases")</span> <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">"default-space"</span><span class="Delimiter">)</span> <span id="L48" class="LineNr"> 48 </span> x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before "End is_special_name Special-cases")</span> +<span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> <span id="L50" class="LineNr"> 50 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"default-space"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L51" class="LineNr"> 51 </span> <span id="L52" class="LineNr"> 52 </span><span class="SalientComment">//:: now implement space support</span> @@ -118,16 +118,16 @@ if ('onhashchange' in window) { <span id="L56" class="LineNr"> 56 </span>default_space = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L57" class="LineNr"> 57 </span> <span id="L58" class="LineNr"> 58 </span><span class="Delimiter">:(before "End canonize(x) Special-cases")</span> -<span id="L59" class="LineNr"> 59 </span>absolutize<span class="Delimiter">(</span>x<span class="Delimiter">);</span> +<span id="L59" class="LineNr"> 59 </span><a href='043space.cc.html#L61'>absolutize</a><span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L60" class="LineNr"> 60 </span><span class="Delimiter">:(code)</span> -<span id="L61" class="LineNr"> 61 </span><span class="Normal">void</span> absolutize<span class="Delimiter">(</span>reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L61" class="LineNr"> 61 </span><span class="Normal">void</span> <a href='043space.cc.html#L61'>absolutize</a><span class="Delimiter">(</span>reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L62" class="LineNr"> 62 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='022arithmetic.cc.html#L108'>is_raw</a><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 id="L63" class="LineNr"> 63 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>name == <span class="Constant">"default-space"</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <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> -<span id="L65" class="LineNr"> 65 </span> raise << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">": reagent not initialized: '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L65" class="LineNr"> 65 </span> <a href='003trace.cc.html#L178'>raise</a> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">": reagent not initialized: '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L66" class="LineNr"> 66 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>value<span class="Delimiter">,</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">)));</span> <span id="L67" class="LineNr"> 67 </span> x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"raw"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> -<span id="L68" class="LineNr"> 68 </span> assert<span class="Delimiter">(</span>is_raw<span class="Delimiter">(</span>x<span class="Delimiter">));</span> +<span id="L68" class="LineNr"> 68 </span> assert<span class="Delimiter">(</span><a href='022arithmetic.cc.html#L108'>is_raw</a><span class="Delimiter">(</span>x<span class="Delimiter">));</span> <span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span> <span id="L70" class="LineNr"> 70 </span> <span id="L71" class="LineNr"> 71 </span><span class="Comment">//: hook replaced in a later layer</span> @@ -135,13 +135,13 @@ if ('onhashchange' in window) { <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> <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span> <span id="L75" class="LineNr"> 75 </span> -<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> +<span id="L76" class="LineNr"> 76 </span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><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> <span id="L77" class="LineNr"> 77 </span> assert<span class="Delimiter">(</span>offset >= <span class="Constant">0</span><span class="Delimiter">);</span> <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> -<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> +<span id="L79" class="LineNr"> 79 </span> <span class="Normal">int</span> size = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> base<span class="Delimiter">);</span> <span id="L80" class="LineNr"> 80 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset >= size<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L81" class="LineNr"> 81 </span> <span class="Comment">// todo: test</span> -<span id="L82" class="LineNr"> 82 </span> raise << <span class="Constant">"location "</span> << offset << <span class="Constant">" is out of bounds "</span> << size << <span class="Constant">" at "</span> << base << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L82" class="LineNr"> 82 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"location "</span> << offset << <span class="Constant">" is out of bounds "</span> << size << <span class="Constant">" at "</span> << base << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L83" class="LineNr"> 83 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L84" class="LineNr"> 84 </span> <span class="Delimiter">}</span> <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> @@ -152,17 +152,17 @@ if ('onhashchange' in window) { <span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(after "Begin Preprocess write_memory(x, data)")</span> <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">"default-space"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L93" class="LineNr"> 93 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"'default-space' should be of type address:array:location, but is "</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L93" class="LineNr"> 93 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"'default-space' should be of type <a href='043space.cc.html#L76'>address</a>:array:location, but is "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="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> <span id="L95" class="LineNr"> 95 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L96" class="LineNr"> 96 </span><span class="Delimiter">}</span> <span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(code)</span> -<span id="L98" class="LineNr"> 98 </span><span class="Normal">bool</span> is_space<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L98" class="LineNr"> 98 </span><span class="Normal">bool</span> <a href='043space.cc.html#L98'>is_space</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L99" class="LineNr"> 99 </span> <span class="Identifier">return</span> <a href='039location_array.cc.html#L15'>is_address_of_array_of_numbers</a><span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span id="L100" class="LineNr">100 </span><span class="Delimiter">}</span> <span id="L101" class="LineNr">101 </span> <span id="L102" class="LineNr">102 </span><span class="Delimiter">:(scenario get_default_space)</span> -<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> main [ +<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L104" class="LineNr">104 </span> <span class="Normal">default</span>-space:space<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L105" class="LineNr">105 </span> <span class="Constant">1</span>:space/<span class="Special">raw <- </span>copy <span class="Normal">default</span>-space:space <span id="L106" class="LineNr">106 </span>] @@ -178,7 +178,7 @@ if ('onhashchange' in window) { <span id="L116" class="LineNr">116 </span><span class="SalientComment">//:: fix 'get'</span> <span id="L117" class="LineNr">117 </span> <span id="L118" class="LineNr">118 </span><span class="Delimiter">:(scenario lookup_sidesteps_default_space_in_get)</span> -<span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> main [ +<span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L120" class="LineNr">120 </span> <span class="Comment"># pretend pointer to container from outside (2000 reserved for refcount)</span> <span id="L121" class="LineNr">121 </span> <span class="Constant">2001</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L122" class="LineNr">122 </span> <span class="Constant">2002</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> @@ -198,7 +198,7 @@ if ('onhashchange' in window) { <span id="L136" class="LineNr">136 </span><span class="SalientComment">//:: fix 'index'</span> <span id="L137" class="LineNr">137 </span> <span id="L138" class="LineNr">138 </span><span class="Delimiter">:(scenario lookup_sidesteps_default_space_in_index)</span> -<span id="L139" class="LineNr">139 </span><span class="muRecipe">def</span> main [ +<span id="L139" class="LineNr">139 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L140" class="LineNr">140 </span> <span class="Comment"># pretend pointer to array from outside (2000 reserved for refcount)</span> <span id="L141" class="LineNr">141 </span> <span class="Constant">2001</span>:num<span class="Special"> <- </span>copy <span class="Constant">2</span> <span class="Comment"># length</span> <span id="L142" class="LineNr">142 </span> <span class="Constant">2002</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -220,7 +220,7 @@ if ('onhashchange' in window) { <span id="L158" class="LineNr">158 </span><span class="SalientComment">//:: allocate in a default space with names</span> <span id="L159" class="LineNr">159 </span> <span id="L160" class="LineNr">160 </span><span class="Delimiter">:(scenario new_default_space)</span> -<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> main [ +<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L162" class="LineNr">162 </span> <span class="Normal">new</span>-<span class="Normal">default</span>-space <span id="L163" class="LineNr">163 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L164" class="LineNr">164 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> @@ -228,30 +228,30 @@ if ('onhashchange' in window) { <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> <span id="L167" class="LineNr">167 </span><span class="traceContains">+mem: array length is 3</span> <span id="L168" class="LineNr">168 </span> -<span id="L169" class="LineNr">169 </span><span class="Delimiter">:(before "End is_disqualified Special-cases")</span> +<span id="L169" class="LineNr">169 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L99'>is_disqualified</a> Special-cases")</span> <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">"number-of-locals"</span><span class="Delimiter">)</span> <span id="L171" class="LineNr">171 </span> x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L172" class="LineNr">172 </span><span class="Delimiter">:(before "End is_special_name Special-cases")</span> +<span id="L172" class="LineNr">172 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> <span id="L173" class="LineNr">173 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"number-of-locals"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L174" class="LineNr">174 </span> -<span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, recipe result)")</span> +<span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> <span id="L176" class="LineNr">176 </span><span class="Comment">// rewrite `new-default-space` to</span> <span id="L177" class="LineNr">177 </span><span class="Comment">// `default-space:space <- new location:type, number-of-locals:literal`</span> <span id="L178" class="LineNr">178 </span><span class="Comment">// where N is Name[recipe][""]</span> <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">"new-default-space"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L180" class="LineNr">180 </span> rewrite_default_space_instruction<span class="Delimiter">(</span>curr<span class="Delimiter">);</span> +<span id="L180" class="LineNr">180 </span> <a href='043space.cc.html#L305'>rewrite_default_space_instruction</a><span class="Delimiter">(</span>curr<span class="Delimiter">);</span> <span id="L181" class="LineNr">181 </span><span class="Delimiter">}</span> <span id="L182" class="LineNr">182 </span><span class="Delimiter">:(after "Begin Preprocess read_memory(x)")</span> <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">"number-of-locals"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L184" class="LineNr">184 </span> vector<<span class="Normal">double</span>> result<span class="Delimiter">;</span> <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">""</span>]<span class="Delimiter">);</span> <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> -<span id="L187" class="LineNr">187 </span> raise << <span class="Constant">"no space allocated for default-space in recipe "</span> << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">"; are you using names?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L187" class="LineNr">187 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"no space allocated for default-space in <a href='010vm.cc.html#L19'>recipe</a> "</span> << current_recipe_name<span class="Delimiter">()</span> << <span class="Constant">"; are you using names?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L188" class="LineNr">188 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L189" class="LineNr">189 </span><span class="Delimiter">}</span> <span id="L190" class="LineNr">190 </span><span class="Delimiter">:(after "Begin Preprocess write_memory(x, data)")</span> <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">"number-of-locals"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L192" class="LineNr">192 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"can't write to special name 'number-of-locals'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L192" class="LineNr">192 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"can't write to special name 'number-of-locals'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L193" class="LineNr">193 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L194" class="LineNr">194 </span><span class="Delimiter">}</span> <span id="L195" class="LineNr">195 </span> @@ -259,7 +259,7 @@ if ('onhashchange' in window) { <span id="L197" class="LineNr">197 </span><span class="SalientComment">//:: default-space when the routine exits</span> <span id="L198" class="LineNr">198 </span> <span id="L199" class="LineNr">199 </span><span class="Delimiter">:(scenario local_scope)</span> -<span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> main [ +<span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L201" class="LineNr">201 </span> <span class="Constant">1</span>:&:@:location<span class="Special"> <- </span>foo <span id="L202" class="LineNr">202 </span> <span class="Constant">2</span>:&:@:location<span class="Special"> <- </span>foo <span id="L203" class="LineNr">203 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">1</span>:&<span class="Delimiter">,</span> <span class="Constant">2</span>:& @@ -273,49 +273,49 @@ if ('onhashchange' in window) { <span id="L211" class="LineNr">211 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L212" class="LineNr">212 </span> <span id="L213" class="LineNr">213 </span><span class="Delimiter">:(scenario local_scope_frees_up_addresses)</span> -<span id="L214" class="LineNr">214 </span><span class="muRecipe">def</span> main [ +<span id="L214" class="LineNr">214 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L215" class="LineNr">215 </span> local-scope <span id="L216" class="LineNr">216 </span> <span class="Normal">x</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L217" class="LineNr">217 </span>] <span id="L218" class="LineNr">218 </span><span class="traceContains">+mem: clearing x:text</span> <span id="L219" class="LineNr">219 </span> -<span id="L220" class="LineNr">220 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, recipe result)")</span> +<span id="L220" class="LineNr">220 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> <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">"local-scope"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L222" class="LineNr">222 </span> rewrite_default_space_instruction<span class="Delimiter">(</span>curr<span class="Delimiter">);</span> +<span id="L222" class="LineNr">222 </span> <a href='043space.cc.html#L305'>rewrite_default_space_instruction</a><span class="Delimiter">(</span>curr<span class="Delimiter">);</span> <span id="L223" class="LineNr">223 </span><span class="Delimiter">}</span> <span id="L224" class="LineNr">224 </span> <span id="L225" class="LineNr">225 </span><span class="Comment">//: todo: do this in a transform, rather than magically in the 'return' instruction</span> <span id="L226" class="LineNr">226 </span><span class="Delimiter">:(after "Falling Through End Of Recipe")</span> -<span id="L227" class="LineNr">227 </span>try_reclaim_locals<span class="Delimiter">();</span> +<span id="L227" class="LineNr">227 </span><a href='043space.cc.html#L232'>try_reclaim_locals</a><span class="Delimiter">();</span> <span id="L228" class="LineNr">228 </span><span class="Delimiter">:(after "Starting Reply")</span> -<span id="L229" class="LineNr">229 </span>try_reclaim_locals<span class="Delimiter">();</span> +<span id="L229" class="LineNr">229 </span><a href='043space.cc.html#L232'>try_reclaim_locals</a><span class="Delimiter">();</span> <span id="L230" class="LineNr">230 </span> <span id="L231" class="LineNr">231 </span><span class="Delimiter">:(code)</span> -<span id="L232" class="LineNr">232 </span><span class="Normal">void</span> try_reclaim_locals<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L232" class="LineNr">232 </span><span class="Normal">void</span> <a href='043space.cc.html#L232'>try_reclaim_locals</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L233" class="LineNr">233 </span> <span class="Comment">// only reclaim routines starting with 'local-scope'</span> -<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> +<span id="L234" class="LineNr">234 </span> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> current_recipe_name<span class="Delimiter">());</span> <span id="L235" class="LineNr">235 </span> <span class="Normal">const</span> recipe& exiting_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> <span id="L237" class="LineNr">237 </span> <span class="Normal">const</span> instruction& 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 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">"local-scope"</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L239" class="LineNr">239 </span> <span class="Comment">// reclaim any local variables unless they're being returned</span> <span id="L240" class="LineNr">240 </span> vector<<span class="Normal">double</span>> zeros<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L242" class="LineNr">242 </span> <span class="Normal">const</span> instruction& inst = exiting_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L244" class="LineNr">244 </span> <span class="Normal">const</span> reagent& product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L245" class="LineNr">245 </span> <span class="Comment">// local variables only</span> <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">"lookup"</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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">"raw"</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 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> +<span id="L248" class="LineNr">248 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='043space.cc.html#L264'>escaping</a><span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L249" class="LineNr">249 </span> <span class="Comment">// End Checks For Reclaiming Locals</span> -<span id="L250" class="LineNr">250 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"clearing "</span> << product<span class="Delimiter">.</span>original_string << end<span class="Delimiter">();</span> +<span id="L250" class="LineNr">250 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"clearing "</span> << product<span class="Delimiter">.</span>original_string << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L252" class="LineNr">252 </span> write_memory<span class="Delimiter">(</span>product<span class="Delimiter">,</span> zeros<span class="Delimiter">);</span> <span id="L253" class="LineNr">253 </span> <span class="Delimiter">}</span> <span id="L254" class="LineNr">254 </span> <span class="Delimiter">}</span> -<span id="L255" class="LineNr">255 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"automatically abandoning "</span> << current_call<span class="Delimiter">().</span>default_space << end<span class="Delimiter">();</span> -<span id="L256" class="LineNr">256 </span> abandon<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space<span class="Delimiter">,</span> +<span id="L255" class="LineNr">255 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"automatically abandoning "</span> << current_call<span class="Delimiter">().</span>default_space << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L256" class="LineNr">256 </span> <a href='037abandon.cc.html#L28'>abandon</a><span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>default_space<span class="Delimiter">,</span> <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">-></span>right<span class="Delimiter">,</span> <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">""</span>]<span class="Delimiter">);</span> <span id="L259" class="LineNr">259 </span><span class="Delimiter">}</span> @@ -323,13 +323,13 @@ if ('onhashchange' in window) { <span id="L261" class="LineNr">261 </span><span class="Delimiter">:(code)</span> <span id="L262" class="LineNr">262 </span><span class="Comment">// is this reagent one of the values returned by the current (return) instruction?</span> <span id="L263" class="LineNr">263 </span><span class="Comment">// is the corresponding ingredient saved in the caller?</span> -<span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> escaping<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> <a href='043space.cc.html#L264'>escaping</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L266" class="LineNr">266 </span> <span class="Comment">// nothing escapes when you fall through past end of recipe</span> -<span id="L267" class="LineNr">267 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> >= SIZE<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>steps<span class="Delimiter">()))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L268" class="LineNr">268 </span> <span class="Normal">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 < 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 id="L267" class="LineNr">267 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>current_step_index<span class="Delimiter">()</span> >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>steps<span class="Delimiter">()))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L268" class="LineNr">268 </span> <span class="Normal">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 < <a href='001help.cc.html#L138'>SIZE</a><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 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> -<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> +<span id="L270" class="LineNr">270 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='043space.cc.html#L295'>caller_uses_product</a><span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span id="L271" class="LineNr">271 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L272" class="LineNr">272 </span> <span class="Delimiter">}</span> <span id="L273" class="LineNr">273 </span> <span class="Delimiter">}</span> @@ -340,38 +340,38 @@ if ('onhashchange' in window) { <span id="L278" class="LineNr">278 </span><span class="Comment">//: don't increment them when the caller saves them either</span> <span id="L279" class="LineNr">279 </span> <span id="L280" class="LineNr">280 </span><span class="Delimiter">:(after "Write Products of Instruction")</span> -<span id="L281" class="LineNr">281 </span>Update_refcounts_in_write_memory = should_update_refcounts_in_write_memory<span class="Delimiter">();</span> +<span id="L281" class="LineNr">281 </span>Update_refcounts_in_write_memory = <a href='043space.cc.html#L285'>should_update_refcounts_in_write_memory</a><span class="Delimiter">();</span> <span id="L282" class="LineNr">282 </span><span class="Delimiter">:(before "End Write Products of Instruction")</span> <span id="L283" class="LineNr">283 </span>Update_refcounts_in_write_memory = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L284" class="LineNr">284 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L285" class="LineNr">285 </span><span class="Normal">bool</span> <a href='043space.cc.html#L285'>should_update_refcounts_in_write_memory</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L286" class="LineNr">286 </span> <span class="Normal">const</span> instruction& inst = current_instruction<span class="Delimiter">();</span> <span id="L287" class="LineNr">287 </span> <span class="Comment">// End should_update_refcounts_in_write_memory Special-cases For Primitives</span> -<span id="L288" class="LineNr">288 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation < MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L288" class="LineNr">288 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation < <a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <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> <span id="L290" class="LineNr">290 </span> <span class="Normal">const</span> recipe& callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span> <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> <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">"local-scope"</span><span class="Delimiter">;</span> <span class="Comment">// callees that call local-scope are already dealt with before return</span> <span id="L293" class="LineNr">293 </span><span class="Delimiter">}</span> <span id="L294" class="LineNr">294 </span> -<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> +<span id="L295" class="LineNr">295 </span><span class="Normal">bool</span> <a href='043space.cc.html#L295'>caller_uses_product</a><span class="Delimiter">(</span><span class="Normal">int</span> product_index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L297" class="LineNr">297 </span> assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L298" class="LineNr">298 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></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 id="L299" class="LineNr">299 </span> <span class="Normal">const</span> call& caller = *++Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> <span id="L300" class="LineNr">300 </span> <span class="Normal">const</span> instruction& caller_inst = to_instruction<span class="Delimiter">(</span>caller<span class="Delimiter">);</span> -<span id="L301" class="LineNr">301 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>product_index >= 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 id="L301" class="LineNr">301 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>product_index >= <a href='001help.cc.html#L138'>SIZE</a><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 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> <span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span> <span id="L304" class="LineNr">304 </span> -<span id="L305" class="LineNr">305 </span><span class="Normal">void</span> rewrite_default_space_instruction<span class="Delimiter">(</span>instruction& curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L305" class="LineNr">305 </span><span class="Normal">void</span> <a href='043space.cc.html#L305'>rewrite_default_space_instruction</a><span class="Delimiter">(</span>instruction& curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L307" class="LineNr">307 </span> raise << to_original_string<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> << <span class="Constant">" can't take any ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L307" class="LineNr">307 </span> <a href='003trace.cc.html#L178'>raise</a> << to_original_string<span class="Delimiter">(</span>curr<span class="Delimiter">)</span> << <span class="Constant">" can't take any ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L308" class="LineNr">308 </span> curr<span class="Delimiter">.</span>name = <span class="Constant">"new"</span><span class="Delimiter">;</span> <span id="L309" class="LineNr">309 </span> <span class="Constant">curr.ingredients.push_back(reagent("location:type</span><span class="Constant">"));</span> <span id="L310" class="LineNr">310 </span> <span class="Constant">curr.ingredients.push_back(reagent("number-of-locals:literal</span><span class="Constant">"));</span> <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> -<span id="L312" class="LineNr">312 </span> raise << <span class="Constant">"new-default-space can't take any results</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L312" class="LineNr">312 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"new-default-space can't take any results</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <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">"default-space:space"</span><span class="Delimiter">));</span> <span id="L314" class="LineNr">314 </span><span class="Delimiter">}</span> <span id="L315" class="LineNr">315 </span> @@ -380,7 +380,7 @@ if ('onhashchange' in window) { <span id="L318" class="LineNr">318 </span> <span class="Normal">x</span>:num <span id="L319" class="LineNr">319 </span> <span class="Normal">y</span>:&:num <span id="L320" class="LineNr">320 </span>] -<span id="L321" class="LineNr">321 </span><span class="muRecipe">def</span> main [ +<span id="L321" class="LineNr">321 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L322" class="LineNr">322 </span> local-scope <span id="L323" class="LineNr">323 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L324" class="LineNr">324 </span> <span class="Normal">y</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> x:&:num @@ -405,12 +405,12 @@ if ('onhashchange' in window) { <span id="L343" class="LineNr">343 </span> <span class="Comment"># since y is 'escaping' f, it should not be cleared</span> <span id="L344" class="LineNr">344 </span> <span class="Identifier">return</span> y:foo <span id="L345" class="LineNr">345 </span>] -<span id="L346" class="LineNr">346 </span><span class="muRecipe">def</span> main [ +<span id="L346" class="LineNr">346 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L347" class="LineNr">347 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>f <span id="L348" class="LineNr">348 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span id="L349" class="LineNr">349 </span> <span class="Constant">4</span>:&:num<span class="Special"> <- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">y:offset</span> <span id="L350" class="LineNr">350 </span> <span class="Constant">5</span>:num<span class="Special"> <- </span>copy *<span class="Constant">4</span>:&:num -<span id="L351" class="LineNr">351 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </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 id="L351" class="LineNr">351 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> <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 id="L352" class="LineNr">352 </span> <span class="Constant">4</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L353" class="LineNr">353 </span>] <span id="L354" class="LineNr">354 </span><span class="traceContains">+mem: storing 34 in location 1</span> @@ -422,7 +422,7 @@ if ('onhashchange' in window) { <span id="L360" class="LineNr">360 </span><span class="Comment"># 1:foo wasn't abandoned/cleared</span> <span id="L361" class="LineNr">361 </span><span class="traceContains">+run: {5: "number"} <- copy {4: ("address" "number"), "lookup": ()}</span> <span id="L362" class="LineNr">362 </span><span class="traceContains">+mem: storing 12 in location 5</span> -<span id="L363" class="LineNr">363 </span><span class="traceContains">+run: {1: "foo"} <- put {1: "foo"}, {y: "offset"}, {0: "literal"}</span> +<span id="L363" class="LineNr">363 </span><span class="traceContains">+run: {1: "foo"} <- <a href='001help.cc.html#L218'>put</a> {1: "foo"}, {y: "offset"}, {0: "literal"}</span> <span id="L364" class="LineNr">364 </span><span class="traceContains">+mem: decrementing refcount of 1006: 2 -> 1</span> <span id="L365" class="LineNr">365 </span><span class="traceContains">+run: {4: ("address" "number")} <- copy {0: "literal"}</span> <span id="L366" class="LineNr">366 </span><span class="traceContains">+mem: decrementing refcount of 1006: 1 -> 0</span> @@ -434,7 +434,7 @@ if ('onhashchange' in window) { <span id="L372" class="LineNr">372 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L373" class="LineNr">373 </span> <span class="Identifier">return</span> x:&:num <span id="L374" class="LineNr">374 </span>] -<span id="L375" class="LineNr">375 </span><span class="muRecipe">def</span> main [ +<span id="L375" class="LineNr">375 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L376" class="LineNr">376 </span> f <span class="Comment"># doesn't save result</span> <span id="L377" class="LineNr">377 </span>] <span id="L378" class="LineNr">378 </span><span class="Comment"># x reclaimed</span> @@ -449,17 +449,17 @@ if ('onhashchange' in window) { <span id="L387" class="LineNr">387 </span><span class="Delimiter">:(before "End Checks")</span> <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> <span id="L389" class="LineNr">389 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> check_default_space<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L392" class="LineNr">392 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L393" class="LineNr">393 </span> <span class="Comment">// End check_default_space Special-cases</span> <span id="L394" class="LineNr">394 </span> <span class="Comment">// assume recipes with only numeric addresses know what they're doing (usually tests)</span> <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> -<span id="L396" class="LineNr">396 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check that recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" sets default-space"</span> << end<span class="Delimiter">();</span> +<span id="L396" class="LineNr">396 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check that <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" sets default-space"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <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> <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">"default-space"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L400" class="LineNr">400 </span> raise << caller<span class="Delimiter">.</span>name << <span class="Constant">" does not seem to start with default-space or local-scope</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L400" class="LineNr">400 </span> <a href='003trace.cc.html#L178'>raise</a> << caller<span class="Delimiter">.</span>name << <span class="Constant">" does not seem to start with default-space or local-scope</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L401" class="LineNr">401 </span> <span class="Delimiter">}</span> <span id="L402" class="LineNr">402 </span><span class="Delimiter">}</span> <span id="L403" class="LineNr">403 </span><span class="Delimiter">:(after "Load Mu Prelude")</span> @@ -470,8 +470,8 @@ if ('onhashchange' in window) { <span id="L408" class="LineNr">408 </span>Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L409" class="LineNr">409 </span> <span id="L410" class="LineNr">410 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L412" class="LineNr">412 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::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 id="L411" class="LineNr">411 </span><span class="Normal">bool</span> contains_non_special_name<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L412" class="LineNr">412 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>>::iterator p = Name[r]<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Name[r]<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L413" class="LineNr">413 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>first<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L414" class="LineNr">414 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>first<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"stash_"</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 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">-></span>first<span class="Delimiter">))</span> @@ -489,8 +489,8 @@ if ('onhashchange' in window) { <span id="L427" class="LineNr">427 </span> <span id="L428" class="LineNr">428 </span><span class="Normal">bool</span> <span class="Normal">operator</span><<span class="Delimiter">(</span><span class="Normal">const</span> reagent& a<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& b<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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">"space"</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">"space"</span><span class="Delimiter">)-></span>value<span class="Delimiter">);</span> -<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">"space"</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">"space"</span><span class="Delimiter">)-></span>value<span class="Delimiter">);</span> +<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">"space"</span><span class="Delimiter">))</span> aspace = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>property<span class="Delimiter">(</span>a<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">)-></span>value<span class="Delimiter">);</span> +<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">"space"</span><span class="Delimiter">))</span> bspace = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>property<span class="Delimiter">(</span>b<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">)-></span>value<span class="Delimiter">);</span> <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 < bspace<span class="Delimiter">;</span> <span id="L433" class="LineNr">433 </span> <span class="Identifier">return</span> a<span class="Delimiter">.</span>name < b<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L434" class="LineNr">434 </span><span class="Delimiter">}</span> diff --git a/html/044space_surround.cc.html b/html/044space_surround.cc.html index 308288b3..6f8f6981 100644 --- a/html/044space_surround.cc.html +++ b/html/044space_surround.cc.html @@ -65,7 +65,7 @@ if ('onhashchange' in window) { <span id="L6" class="LineNr"> 6 </span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario surrounding_space)</span> <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> -<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> main [ +<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L10" class="LineNr">10 </span> <span class="Comment"># pretend address:array:location; in practice we'll use new</span> <span id="L11" class="LineNr">11 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># refcount</span> <span id="L12" class="LineNr">12 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">5</span> <span class="Comment"># length</span> @@ -89,7 +89,7 @@ if ('onhashchange' in window) { <span id="L30" class="LineNr">30 </span><span class="traceContains">+mem: storing 33 in location 23</span> <span id="L31" class="LineNr">31 </span> <span id="L32" class="LineNr">32 </span><span class="Delimiter">:(before "End Checks For Reclaiming Locals")</span> -<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> > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L33" class="LineNr">33 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='044space_surround.cc.html#L52'>space_index</a><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">0</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L34" class="LineNr">34 </span> <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> <span id="L36" class="LineNr">36 </span><span class="Comment">//: lifetime, surrounding allows managing shorter lifetimes inside a longer</span> @@ -98,29 +98,29 @@ if ('onhashchange' in window) { <span id="L39" class="LineNr">39 </span><span class="Delimiter">:(replace{} "int space_base(const reagent& x)")</span> <span id="L40" class="LineNr">40 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<span id="L42" class="LineNr">42 </span> <span class="Identifier">return</span> space_base<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <a href='044space_surround.cc.html#L52'>space_index</a><span class="Delimiter">(</span>x<span class="Delimiter">),</span> base<span class="Delimiter">);</span> <span id="L43" class="LineNr">43 </span><span class="Delimiter">}</span> <span id="L44" class="LineNr">44 </span> -<span id="L45" class="LineNr">45 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent& 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 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> +<span id="L45" class="LineNr">45 </span><span class="Normal">int</span> space_base<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">int</span> <a href='044space_surround.cc.html#L52'>space_index</a><span class="Delimiter">,</span> <span class="Normal">int</span> base<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L46" class="LineNr">46 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='044space_surround.cc.html#L52'>space_index</a> == <span class="Constant">0</span><span class="Delimiter">)</span> <span id="L47" class="LineNr">47 </span> <span class="Identifier">return</span> base<span class="Delimiter">;</span> -<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> +<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> <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L49" class="LineNr">49 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L50" class="LineNr">50 </span><span class="Delimiter">}</span> <span id="L51" class="LineNr">51 </span> -<span id="L52" class="LineNr">52 </span><span class="Normal">int</span> space_index<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 id="L52" class="LineNr">52 </span><span class="Normal">int</span> <a href='044space_surround.cc.html#L52'>space_index</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>properties<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"space"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">-></span>right<span class="Delimiter">)</span> -<span id="L56" class="LineNr">56 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"/space metadata should take exactly one value in '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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">-></span>value<span class="Delimiter">);</span> +<span id="L56" class="LineNr">56 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"/space metadata should take exactly one value in '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L57" class="LineNr">57 </span> <span class="Identifier">return</span> <a href='002test.cc.html#L92'>to_integer</a><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">-></span>value<span class="Delimiter">);</span> <span id="L58" class="LineNr">58 </span> <span class="Delimiter">}</span> <span id="L59" class="LineNr">59 </span> <span class="Delimiter">}</span> <span id="L60" class="LineNr">60 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L61" class="LineNr">61 </span><span class="Delimiter">}</span> <span id="L62" class="LineNr">62 </span> <span id="L63" class="LineNr">63 </span><span class="Delimiter">:(scenario permit_space_as_variable_name)</span> -<span id="L64" class="LineNr">64 </span><span class="muRecipe">def</span> main [ +<span id="L64" class="LineNr">64 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L65" class="LineNr">65 </span> <span class="Normal">space</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L66" class="LineNr">66 </span>] </pre> diff --git a/html/045closure_name.cc.html b/html/045closure_name.cc.html index c2a4cac8..950fe28e 100644 --- a/html/045closure_name.cc.html +++ b/html/045closure_name.cc.html @@ -63,7 +63,7 @@ if ('onhashchange' in window) { <span id="L4" class="LineNr"> 4 </span><span class="Comment">//: surrounding space of the surrounding space, etc.</span> <span id="L5" class="LineNr"> 5 </span> <span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(scenario closure)</span> -<span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> main [ +<span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L8" class="LineNr"> 8 </span> <span class="Normal">default</span>-space:space<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">30</span> <span id="L9" class="LineNr"> 9 </span> <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter<span class="Special"> <- </span><span class="Normal">new</span>-counter <span id="L10" class="LineNr"> 10 </span> <span class="Constant">2</span>:num/<span class="Special">raw <- </span>increment-counter <span class="Constant">1</span>:space/names:<span class="Normal">new</span>-counter @@ -82,7 +82,7 @@ if ('onhashchange' in window) { <span id="L23" class="LineNr"> 23 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>copy <span class="Constant">234</span> <span class="Comment"># dummy</span> <span id="L24" class="LineNr"> 24 </span> <span class="Identifier">return</span> y:num/space:<span class="Constant">1</span> <span id="L25" class="LineNr"> 25 </span>] -<span id="L26" class="LineNr"> 26 </span><span class="traceContains">+name: lexically surrounding space for recipe increment-counter comes from new-counter</span> +<span id="L26" class="LineNr"> 26 </span><span class="traceContains">+name: lexically surrounding space for <a href='010vm.cc.html#L19'>recipe</a> increment-counter comes from new-counter</span> <span id="L27" class="LineNr"> 27 </span><span class="traceContains">+mem: storing 5 in location 3</span> <span id="L28" class="LineNr"> 28 </span> <span id="L29" class="LineNr"> 29 </span><span class="Comment">//: To make this work, compute the recipe that provides names for the</span> @@ -92,43 +92,43 @@ if ('onhashchange' in window) { <span id="L33" class="LineNr"> 33 </span>map<recipe_ordinal<span class="Delimiter">,</span> recipe_ordinal> Surrounding_space<span class="Delimiter">;</span> <span id="L34" class="LineNr"> 34 </span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before "Transform.push_back(transform_names)")</span> -<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> +<span id="L36" class="LineNr"> 36 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='045closure_name.cc.html#L39'>collect_surrounding_spaces</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L37" class="LineNr"> 37 </span> <span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L40" class="LineNr"> 40 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- collect surrounding spaces for recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> -<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 < 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 id="L39" class="LineNr"> 39 </span><span class="Normal">void</span> <a href='045closure_name.cc.html#L39'>collect_surrounding_spaces</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- collect surrounding spaces for <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L42" class="LineNr"> 42 </span> <span class="Normal">const</span> instruction& 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 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> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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">"0"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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> -<span id="L48" class="LineNr"> 48 </span> raise << <span class="Constant">"slot 0 should always have type address:array:location, but is '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L48" class="LineNr"> 48 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"slot 0 should always have type <a href='043space.cc.html#L76'>address</a>:array:location, but is '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L49" class="LineNr"> 49 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L50" class="LineNr"> 50 </span> <span class="Delimiter">}</span> <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">"names"</span><span class="Delimiter">);</span> <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> -<span id="L53" class="LineNr"> 53 </span> raise << <span class="Constant">"slot 0 requires a /names property in recipe '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L53" class="LineNr"> 53 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"slot 0 requires a /names property in <a href='010vm.cc.html#L19'>recipe</a> '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L54" class="LineNr"> 54 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L55" class="LineNr"> 55 </span> <span class="Delimiter">}</span> -<span id="L56" class="LineNr"> 56 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> raise << <span class="Constant">"slot 0 should have a single value in /names, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L56" class="LineNr"> 56 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!s<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"slot 0 should have a single value in /names, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L57" class="LineNr"> 57 </span> <span class="Normal">const</span> string& surrounding_recipe_name = s<span class="Delimiter">-></span>value<span class="Delimiter">;</span> <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> -<span id="L59" class="LineNr"> 59 </span> raise << <span class="Constant">"slot 0 doesn't initialize its /names property in recipe '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L59" class="LineNr"> 59 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"slot 0 doesn't initialize its /names property in recipe '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L60" class="LineNr"> 60 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L61" class="LineNr"> 61 </span> <span class="Delimiter">}</span> <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> <span id="L63" class="LineNr"> 63 </span> && 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> -<span id="L64" class="LineNr"> 64 </span> raise << <span class="Constant">"recipe '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"' can have only one 'surrounding' recipe but has '"</span> << 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 << <span class="Constant">"' and '"</span> << surrounding_recipe_name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L64" class="LineNr"> 64 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"recipe '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"' can have only one 'surrounding' <a href='010vm.cc.html#L19'>recipe</a> but has '"</span> << 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 << <span class="Constant">"' and '"</span> << surrounding_recipe_name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L65" class="LineNr"> 65 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L66" class="LineNr"> 66 </span> <span class="Delimiter">}</span> -<span id="L67" class="LineNr"> 67 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"lexically surrounding space for recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">" comes from "</span> << surrounding_recipe_name << end<span class="Delimiter">();</span> +<span id="L67" class="LineNr"> 67 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"lexically surrounding space for <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">" comes from "</span> << surrounding_recipe_name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<span id="L69" class="LineNr"> 69 </span> raise << <span class="Constant">"can't find recipe providing surrounding space for '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'; looking for '"</span> << surrounding_recipe_name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't find recipe providing surrounding space for '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'; looking for '"</span> << surrounding_recipe_name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L70" class="LineNr"> 70 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L71" class="LineNr"> 71 </span> <span class="Delimiter">}</span> -<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> +<span id="L72" class="LineNr"> 72 </span> <a href='001help.cc.html#L218'>put</a><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 id="L73" class="LineNr"> 73 </span> <span class="Delimiter">}</span> <span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">}</span> <span id="L75" class="LineNr"> 75 </span><span class="Delimiter">}</span> @@ -136,17 +136,17 @@ if ('onhashchange' in window) { <span id="L77" class="LineNr"> 77 </span><span class="Comment">//: Once surrounding spaces are available, transform_names uses them to handle</span> <span id="L78" class="LineNr"> 78 </span><span class="Comment">//: /space properties.</span> <span id="L79" class="LineNr"> 79 </span> -<span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(replace{} "int lookup_name(const reagent& r, const recipe_ordinal default_recipe)")</span> -<span id="L81" class="LineNr"> 81 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(replace{} "int lookup_name(const reagent& r, const <a href='010vm.cc.html#L14'>recipe_ordinal</a> default_recipe)")</span> +<span id="L81" class="LineNr"> 81 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> default_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"space"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<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 << <span class="Constant">"name not found: "</span> << x<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<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> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"name not found: "</span> << x<span class="Delimiter">.</span>name << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L85" class="LineNr"> 85 </span> <span class="Delimiter">}</span> <span id="L86" class="LineNr"> 86 </span> string_tree* p = property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">);</span> -<span id="L87" class="LineNr"> 87 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!p || !p<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> raise << <span class="Constant">"/space property should have exactly one (non-negative integer) value</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L88" class="LineNr"> 88 </span> <span class="Normal">int</span> n = to_integer<span class="Delimiter">(</span>p<span class="Delimiter">-></span>value<span class="Delimiter">);</span> +<span id="L87" class="LineNr"> 87 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!p || !p<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"/space property should have exactly one (non-negative integer) value</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L88" class="LineNr"> 88 </span> <span class="Normal">int</span> n = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>value<span class="Delimiter">);</span> <span id="L89" class="LineNr"> 89 </span> assert<span class="Delimiter">(</span>n >= <span class="Constant">0</span><span class="Delimiter">);</span> -<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> +<span id="L90" class="LineNr"> 90 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> surrounding_recipe = <a href='045closure_name.cc.html#L116'>lookup_surrounding_recipe</a><span class="Delimiter">(</span>default_recipe<span class="Delimiter">,</span> n<span class="Delimiter">);</span> <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> <span id="L92" class="LineNr"> 92 </span> set<recipe_ordinal> done<span class="Delimiter">;</span> <span id="L93" class="LineNr"> 93 </span> vector<recipe_ordinal> path<span class="Delimiter">;</span> @@ -155,31 +155,31 @@ if ('onhashchange' in window) { <span id="L96" class="LineNr"> 96 </span> <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> <span id="L98" class="LineNr"> 98 </span><span class="Comment">// recursively call transform_names on it.</span> -<span id="L99" class="LineNr"> 99 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">,</span> set<recipe_ordinal>& done<span class="Delimiter">,</span> vector<recipe_ordinal>& path<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L99" class="LineNr"> 99 </span><span class="Normal">int</span> lookup_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">,</span> set<recipe_ordinal>& done<span class="Delimiter">,</span> vector<recipe_ordinal>& path<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L102" class="LineNr">102 </span> raise << <span class="Constant">"can't compute address of '"</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">"' because</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>path<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L104" class="LineNr">104 </span> raise << path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">)</span> << <span class="Constant">" requires computing names of "</span> << path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't compute address of '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">"' because</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>path<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L104" class="LineNr">104 </span> <a href='003trace.cc.html#L178'>raise</a> << path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i-<span class="Constant">1</span><span class="Delimiter">)</span> << <span class="Constant">" requires computing names of "</span> << path<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span> -<span id="L106" class="LineNr">106 </span> raise << 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> << <span class="Constant">" requires computing names of "</span> << r << <span class="Constant">"..ad infinitum</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L106" class="LineNr">106 </span> <a href='003trace.cc.html#L178'>raise</a> << path<span class="Delimiter">.</span>at<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>path<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">)</span> << <span class="Constant">" requires computing names of "</span> << r << <span class="Constant">"..ad infinitum</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L107" class="LineNr">107 </span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L108" class="LineNr">108 </span> <span class="Delimiter">}</span> <span id="L109" class="LineNr">109 </span> done<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span id="L110" class="LineNr">110 </span> path<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>r<span class="Delimiter">);</span> -<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> +<span id="L111" class="LineNr">111 </span> <a href='042name.cc.html#L37'>transform_names</a><span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span class="Comment">// Not passing 'done' through. Might this somehow cause an infinite loop?</span> <span id="L112" class="LineNr">112 </span> assert<span class="Delimiter">(</span>!Name[r]<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L113" class="LineNr">113 </span> <span class="Identifier">return</span> Name[r][x<span class="Delimiter">.</span>name]<span class="Delimiter">;</span> <span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span> <span id="L115" class="LineNr">115 </span> -<span id="L116" class="LineNr">116 </span>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 id="L116" class="LineNr">116 </span><a href='010vm.cc.html#L14'>recipe_ordinal</a> <a href='045closure_name.cc.html#L116'>lookup_surrounding_recipe</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">,</span> <span class="Normal">int</span> n<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L119" class="LineNr">119 </span> raise << <span class="Constant">"don't know surrounding recipe of '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"don't know surrounding recipe of '"</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L120" class="LineNr">120 </span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L121" class="LineNr">121 </span> <span class="Delimiter">}</span> <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> -<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> +<span id="L123" class="LineNr">123 </span> <span class="Identifier">return</span> <a href='045closure_name.cc.html#L116'>lookup_surrounding_recipe</a><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 id="L124" class="LineNr">124 </span><span class="Delimiter">}</span> <span id="L125" class="LineNr">125 </span> <span id="L126" class="LineNr">126 </span><span class="Comment">//: weaken use-before-set detection just a tad</span> @@ -188,7 +188,7 @@ if ('onhashchange' in window) { <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">"space"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L130" class="LineNr">130 </span> string_tree* p = property<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">);</span> <span id="L131" class="LineNr">131 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!p || !p<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L132" class="LineNr">132 </span> raise << <span class="Constant">"/space property should have exactly one (non-negative integer) value in '"</span> << r<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L132" class="LineNr">132 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"/space property should have exactly one (non-negative integer) value in '"</span> << r<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L133" class="LineNr">133 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L134" class="LineNr">134 </span> <span class="Delimiter">}</span> <span id="L135" class="LineNr">135 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>value != <span class="Constant">"0"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> @@ -219,7 +219,7 @@ if ('onhashchange' in window) { <span id="L160" class="LineNr">160 </span> <span class="Constant">0</span>:space/names:<span class="Normal">new</span>-scope<span class="Special"> <- </span>copy outer:space <span id="L161" class="LineNr">161 </span> <span class="Identifier">return</span> *x:&:num/space:<span class="Constant">1</span> <span id="L162" class="LineNr">162 </span>] -<span id="L163" class="LineNr">163 </span><span class="muRecipe">def</span> main [ +<span id="L163" class="LineNr">163 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L164" class="LineNr">164 </span> <span class="Constant">1</span>:space/<span class="Special">raw <- </span><span class="Normal">new</span>-scope <span id="L165" class="LineNr">165 </span> <span class="Constant">2</span>:num/<span class="Special">raw <- </span>use-scope <span class="Constant">1</span>:space/<span class="Special">raw</span> <span id="L166" class="LineNr">166 </span>] diff --git a/html/046global.cc.html b/html/046global.cc.html index 1fadf3f6..dc7a99f7 100644 --- a/html/046global.cc.html +++ b/html/046global.cc.html @@ -69,7 +69,7 @@ if ('onhashchange' in window) { <span id="L10" class="LineNr">10 </span><span class="Comment">//: [tag: todo]</span> <span id="L11" class="LineNr">11 </span> <span id="L12" class="LineNr">12 </span><span class="Delimiter">:(scenario global_space)</span> -<span id="L13" class="LineNr">13 </span><span class="muRecipe">def</span> main [ +<span id="L13" class="LineNr">13 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L14" class="LineNr">14 </span> <span class="Comment"># pretend address:array:location; in practice we'll use new</span> <span id="L15" class="LineNr">15 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># refcount</span> <span id="L16" class="LineNr">16 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">5</span> <span class="Comment"># length</span> @@ -88,10 +88,10 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr">29 </span><span class="traceContains">+mem: storing 24 in location 23</span> <span id="L30" class="LineNr">30 </span> <span id="L31" class="LineNr">31 </span><span class="Comment">//: to support it, create another special variable called global space</span> -<span id="L32" class="LineNr">32 </span><span class="Delimiter">:(before "End is_disqualified Special-cases")</span> +<span id="L32" class="LineNr">32 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L99'>is_disqualified</a> Special-cases")</span> <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">"global-space"</span><span class="Delimiter">)</span> <span id="L34" class="LineNr">34 </span> x<span class="Delimiter">.</span>initialized = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L35" class="LineNr">35 </span><span class="Delimiter">:(before "End is_special_name Special-cases")</span> +<span id="L35" class="LineNr">35 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> <span id="L36" class="LineNr">36 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"global-space"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L37" class="LineNr">37 </span> <span id="L38" class="LineNr">38 </span><span class="Comment">//: writes to this variable go to a field in the current routine</span> @@ -102,18 +102,18 @@ if ('onhashchange' in window) { <span id="L43" class="LineNr">43 </span><span class="Delimiter">:(after "Begin Preprocess write_memory(x, data)")</span> <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">"global-space"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L46" class="LineNr">46 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"'global-space' should be of type address:array:location, but tried to write '"</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L46" class="LineNr">46 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"'global-space' should be of type <a href='043space.cc.html#L76'>address</a>:array:location, but tried to write '"</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L47" class="LineNr">47 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>global_space<span class="Delimiter">)</span> -<span id="L48" class="LineNr">48 </span> raise << <span class="Constant">"routine already has a global-space; you can't over-write your globals"</span> << end<span class="Delimiter">();</span> +<span id="L48" class="LineNr">48 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"routine already has a global-space; you can't over-write your globals"</span> << end<span class="Delimiter">();</span> <span id="L49" class="LineNr">49 </span> Current_routine<span class="Delimiter">-></span>global_space = data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L50" class="LineNr">50 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L51" class="LineNr">51 </span><span class="Delimiter">}</span> <span id="L52" class="LineNr">52 </span> <span id="L53" class="LineNr">53 </span><span class="Comment">//: now marking variables as /space:global looks them up inside this field</span> <span id="L54" class="LineNr">54 </span><span class="Delimiter">:(after "int space_base(const reagent& x)")</span> -<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> +<span id="L55" class="LineNr">55 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='046global.cc.html#L79'>is_global</a><span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L56" class="LineNr">56 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>global_space<span class="Delimiter">)</span> -<span id="L57" class="LineNr">57 </span> raise << <span class="Constant">"routine has no global space</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L57" class="LineNr">57 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"routine has no global space</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L58" class="LineNr">58 </span> <span class="Identifier">return</span> Current_routine<span class="Delimiter">-></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 id="L59" class="LineNr">59 </span> <span class="Delimiter">}</span> <span id="L60" class="LineNr">60 </span> @@ -121,7 +121,7 @@ if ('onhashchange' in window) { <span id="L62" class="LineNr">62 </span><span class="Comment">//: don't want to make them too comfortable to use.</span> <span id="L63" class="LineNr">63 </span> <span id="L64" class="LineNr">64 </span><span class="Delimiter">:(scenario global_space_with_names)</span> -<span id="L65" class="LineNr">65 </span><span class="muRecipe">def</span> main [ +<span id="L65" class="LineNr">65 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L66" class="LineNr">66 </span> global-space:space<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">location:type</span><span class="Delimiter">,</span> <span class="Constant">10</span> <span id="L67" class="LineNr">67 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L68" class="LineNr">68 </span> <span class="Special">1:num/space:global</span><span class="Special"> <- </span>copy <span class="Constant">24</span> @@ -130,12 +130,12 @@ if ('onhashchange' in window) { <span id="L71" class="LineNr">71 </span>$error: <span class="Constant">0</span> <span id="L72" class="LineNr">72 </span> <span id="L73" class="LineNr">73 </span><span class="Delimiter">:(after "bool is_numeric_location(const reagent& x)")</span> -<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> +<span id="L74" class="LineNr">74 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='046global.cc.html#L79'>is_global</a><span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L75" class="LineNr">75 </span> <span id="L76" class="LineNr">76 </span><span class="Comment">//: helpers</span> <span id="L77" class="LineNr">77 </span> <span id="L78" class="LineNr">78 </span><span class="Delimiter">:(code)</span> -<span id="L79" class="LineNr">79 </span><span class="Normal">bool</span> is_global<span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L79" class="LineNr">79 </span><span class="Normal">bool</span> <a href='046global.cc.html#L79'>is_global</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L80" class="LineNr">80 </span> string_tree* s = property<span class="Delimiter">(</span>x<span class="Delimiter">,</span> <span class="Constant">"space"</span><span class="Delimiter">);</span> <span id="L81" class="LineNr">81 </span> <span class="Identifier">return</span> s && s<span class="Delimiter">-></span>atom && s<span class="Delimiter">-></span>value == <span class="Constant">"global"</span><span class="Delimiter">;</span> <span id="L82" class="LineNr">82 </span><span class="Delimiter">}</span> diff --git a/html/047check_type_by_name.cc.html b/html/047check_type_by_name.cc.html index e8eb9325..cc8a4678 100644 --- a/html/047check_type_by_name.cc.html +++ b/html/047check_type_by_name.cc.html @@ -68,75 +68,75 @@ if ('onhashchange' in window) { <span id="L8" class="LineNr"> 8 </span> <span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(scenario transform_fails_on_reusing_name_with_different_type)</span> <span id="L10" class="LineNr"> 10 </span><span class="Special">% Hide_errors = true;</span> -<span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> main [ +<span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L12" class="LineNr"> 12 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L13" class="LineNr"> 13 </span> <span class="Normal">x</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L14" class="LineNr"> 14 </span>] -<span id="L15" class="LineNr"> 15 </span><span class="traceContains">+error: main: 'x' used with multiple types</span> +<span id="L15" class="LineNr"> 15 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'x' used with multiple types</span> <span id="L16" class="LineNr"> 16 </span> <span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(after "Transform.push_back(expand_type_abbreviations)")</span> -<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> +<span id="L18" class="LineNr"> 18 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='047check_type_by_name.cc.html#L21'>check_or_set_types_by_name</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L19" class="LineNr"> 19 </span> <span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L22" class="LineNr"> 22 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- deduce types for recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> +<span id="L21" class="LineNr"> 21 </span><span class="Normal">void</span> <a href='047check_type_by_name.cc.html#L21'>check_or_set_types_by_name</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L22" class="LineNr"> 22 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- deduce types for <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L23" class="LineNr"> 23 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L24" class="LineNr"> 24 </span> set<reagent> known<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L26" class="LineNr"> 26 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L28" class="LineNr"> 28 </span> <a href='047check_type_by_name.cc.html#L38'>deduce_missing_type</a><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> +<span id="L29" class="LineNr"> 29 </span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><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 id="L30" class="LineNr"> 30 </span> <span class="Delimiter">}</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L32" class="LineNr"> 32 </span> <a href='047check_type_by_name.cc.html#L38'>deduce_missing_type</a><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> +<span id="L33" class="LineNr"> 33 </span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><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 id="L34" class="LineNr"> 34 </span> <span class="Delimiter">}</span> <span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">}</span> <span id="L36" class="LineNr"> 36 </span><span class="Delimiter">}</span> <span id="L37" class="LineNr"> 37 </span> -<span id="L38" class="LineNr"> 38 </span><span class="Normal">void</span> deduce_missing_type<span class="Delimiter">(</span>set<reagent>& known<span class="Delimiter">,</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L38" class="LineNr"> 38 </span><span class="Normal">void</span> <a href='047check_type_by_name.cc.html#L38'>deduce_missing_type</a><span class="Delimiter">(</span>set<reagent>& known<span class="Delimiter">,</span> reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<span id="L40" class="LineNr"> 40 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='041jump_target.cc.html#L11'>is_jump_target</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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">"label"</span><span class="Delimiter">);</span> <span id="L42" class="LineNr"> 42 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L43" class="LineNr"> 43 </span> <span class="Delimiter">}</span> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <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">)-></span>type<span class="Delimiter">);</span> -<span id="L46" class="LineNr"> 46 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << x<span class="Delimiter">.</span>name << <span class="Constant">" <= "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << x<span class="Delimiter">.</span>name << <span class="Constant">" <= "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L47" class="LineNr"> 47 </span><span class="Delimiter">}</span> <span id="L48" class="LineNr"> 48 </span> -<span id="L49" class="LineNr"> 49 </span><span class="Normal">void</span> check_type<span class="Delimiter">(</span>set<reagent>& known<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L49" class="LineNr"> 49 </span><span class="Normal">void</span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><span class="Delimiter">(</span>set<reagent>& known<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<span id="L51" class="LineNr"> 51 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><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 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> -<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> +<span id="L53" class="LineNr"> 53 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='041jump_target.cc.html#L11'>is_jump_target</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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">-></span>atom || x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name != <span class="Constant">"label"</span><span class="Delimiter">)</span> -<span id="L55" class="LineNr"> 55 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"non-label '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' must begin with a letter</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"non-label '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' must begin with a letter</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L56" class="LineNr"> 56 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L57" class="LineNr"> 57 </span> <span class="Delimiter">}</span> -<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> -<span id="L59" class="LineNr"> 59 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << x<span class="Delimiter">.</span>name << <span class="Constant">" => "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L59" class="LineNr"> 59 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << x<span class="Delimiter">.</span>name << <span class="Constant">" => "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L60" class="LineNr"> 60 </span> known<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L61" class="LineNr"> 61 </span> <span class="Delimiter">}</span> <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">)-></span>type<span class="Delimiter">,</span> x<span class="Delimiter">.</span>type<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L63" class="LineNr"> 63 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' used with multiple types</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' used with multiple types</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L64" class="LineNr"> 64 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L65" class="LineNr"> 65 </span> <span class="Delimiter">}</span> <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> <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">-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L68" class="LineNr"> 68 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">": can't be just an array. What is it an array of?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L68" class="LineNr"> 68 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">": can't be just an array. What is it an array of?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L69" class="LineNr"> 69 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L70" class="LineNr"> 70 </span> <span class="Delimiter">}</span> <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">-></span>right<span class="Delimiter">-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L72" class="LineNr"> 72 </span> raise << caller<span class="Delimiter">.</span>name << <span class="Constant">" can't determine the size of array variable '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'. Either allocate it separately and make the type of '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' an address, or specify the length of the array in the type of '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L72" class="LineNr"> 72 </span> <a href='003trace.cc.html#L178'>raise</a> << caller<span class="Delimiter">.</span>name << <span class="Constant">" can't determine the size of array variable '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'. Either allocate it separately and make the type of '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' an address, or specify the length of the array in the type of '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"'.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L73" class="LineNr"> 73 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">}</span> <span id="L75" class="LineNr"> 75 </span> <span class="Delimiter">}</span> <span id="L76" class="LineNr"> 76 </span><span class="Delimiter">}</span> <span id="L77" class="LineNr"> 77 </span> <span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(scenario transform_fills_in_missing_types)</span> -<span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> main [ +<span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L80" class="LineNr"> 80 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L81" class="LineNr"> 81 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L82" class="LineNr"> 82 </span>] @@ -144,7 +144,7 @@ if ('onhashchange' in window) { <span id="L84" class="LineNr"> 84 </span><span class="traceContains">+mem: storing 2 in location 2</span> <span id="L85" class="LineNr"> 85 </span> <span id="L86" class="LineNr"> 86 </span><span class="Delimiter">:(scenario transform_fills_in_missing_types_in_product)</span> -<span id="L87" class="LineNr"> 87 </span><span class="muRecipe">def</span> main [ +<span id="L87" class="LineNr"> 87 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L88" class="LineNr"> 88 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L89" class="LineNr"> 89 </span> x<span class="Special"> <- </span>copy <span class="Constant">2</span> <span id="L90" class="LineNr"> 90 </span>] @@ -152,7 +152,7 @@ if ('onhashchange' in window) { <span id="L92" class="LineNr"> 92 </span><span class="traceContains">+mem: storing 2 in location 1</span> <span id="L93" class="LineNr"> 93 </span> <span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(scenario transform_fills_in_missing_types_in_product_and_ingredient)</span> -<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [ +<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L96" class="LineNr"> 96 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L97" class="LineNr"> 97 </span> x<span class="Special"> <- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L98" class="LineNr"> 98 </span>] @@ -160,7 +160,7 @@ if ('onhashchange' in window) { <span id="L100" class="LineNr">100 </span><span class="traceContains">+mem: storing 2 in location 1</span> <span id="L101" class="LineNr">101 </span> <span id="L102" class="LineNr">102 </span><span class="Delimiter">:(scenario transform_fills_in_missing_label_type)</span> -<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> main [ +<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L104" class="LineNr">104 </span> jump +target <span id="L105" class="LineNr">105 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L106" class="LineNr">106 </span> +target @@ -169,39 +169,39 @@ if ('onhashchange' in window) { <span id="L109" class="LineNr">109 </span> <span id="L110" class="LineNr">110 </span><span class="Delimiter">:(scenario transform_fails_on_missing_types_in_first_mention)</span> <span id="L111" class="LineNr">111 </span><span class="Special">% Hide_errors = true;</span> -<span id="L112" class="LineNr">112 </span><span class="muRecipe">def</span> main [ +<span id="L112" class="LineNr">112 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L113" class="LineNr">113 </span> x<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L114" class="LineNr">114 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">2</span> <span id="L115" class="LineNr">115 </span>] -<span id="L116" class="LineNr">116 </span><span class="traceContains">+error: main: missing type for 'x' in 'x <- copy 1'</span> +<span id="L116" class="LineNr">116 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: missing type for 'x' in 'x <- copy 1'</span> <span id="L117" class="LineNr">117 </span> <span id="L118" class="LineNr">118 </span><span class="Delimiter">:(scenario transform_fails_on_wrong_type_for_label)</span> <span id="L119" class="LineNr">119 </span><span class="Special">% Hide_errors = true;</span> -<span id="L120" class="LineNr">120 </span><span class="muRecipe">def</span> main [ +<span id="L120" class="LineNr">120 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L121" class="LineNr">121 </span> +foo:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L122" class="LineNr">122 </span>] -<span id="L123" class="LineNr">123 </span><span class="traceContains">+error: main: non-label '+foo' must begin with a letter</span> +<span id="L123" class="LineNr">123 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: non-label '+foo' must begin with a letter</span> <span id="L124" class="LineNr">124 </span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">:(scenario typo_in_address_type_fails)</span> <span id="L126" class="LineNr">126 </span><span class="Special">% Hide_errors = true;</span> -<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> main [ +<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L128" class="LineNr">128 </span> <span class="Normal">y</span>:&:charcter<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">character:type</span> <span id="L129" class="LineNr">129 </span> *y<span class="Special"> <- </span>copy <span class="Constant">67</span> <span id="L130" class="LineNr">130 </span>] -<span id="L131" class="LineNr">131 </span><span class="traceContains">+error: main: unknown type charcter in 'y:&:charcter <- new character:type'</span> +<span id="L131" class="LineNr">131 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: unknown type charcter in 'y:&:charcter <- new character:type'</span> <span id="L132" class="LineNr">132 </span> <span id="L133" class="LineNr">133 </span><span class="Delimiter">:(scenario array_type_without_size_fails)</span> <span id="L134" class="LineNr">134 </span><span class="Special">% Hide_errors = true;</span> -<span id="L135" class="LineNr">135 </span><span class="muRecipe">def</span> main [ +<span id="L135" class="LineNr">135 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L136" class="LineNr">136 </span> <span class="Normal">x</span>:@:num<span class="Special"> <- </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 id="L137" class="LineNr">137 </span>] -<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> +<span id="L138" class="LineNr">138 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a> 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 id="L139" class="LineNr">139 </span> <span id="L140" class="LineNr">140 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L141" class="LineNr">141 </span><span class="Delimiter">:(scenario transform_checks_types_of_identical_reagents_in_multiple_spaces)</span> <span id="L142" class="LineNr">142 </span><span class="muRecipe">def</span> foo [ <span class="Comment"># dummy</span> <span id="L143" class="LineNr">143 </span>] -<span id="L144" class="LineNr">144 </span><span class="muRecipe">def</span> main [ +<span id="L144" class="LineNr">144 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L145" class="LineNr">145 </span> local-scope <span id="L146" class="LineNr">146 </span> <span class="Constant">0</span>:space/names:foo<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># specify surrounding space</span> <span id="L147" class="LineNr">147 </span> <span class="Normal">x</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span>/<span class="Constant">true</span> @@ -212,7 +212,7 @@ if ('onhashchange' in window) { <span id="L152" class="LineNr">152 </span> <span id="L153" class="LineNr">153 </span><span class="Delimiter">:(scenario transform_handles_empty_reagents)</span> <span id="L154" class="LineNr">154 </span><span class="Special">% Hide_errors = true;</span> -<span id="L155" class="LineNr">155 </span><span class="muRecipe">def</span> main [ +<span id="L155" class="LineNr">155 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L156" class="LineNr">156 </span> add * <span id="L157" class="LineNr">157 </span>] <span id="L158" class="LineNr">158 </span><span class="traceContains">+error: illegal name '*'</span> diff --git a/html/050scenario.cc.html b/html/050scenario.cc.html index eefb97bc..71157ba9 100644 --- a/html/050scenario.cc.html +++ b/html/050scenario.cc.html @@ -68,7 +68,7 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span><span class="Comment">//: handy to check the values of specific variables</span> <span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario scenario_block)</span> -<span id="L8" class="LineNr"> 8 </span><span class="muScenario">scenario</span> foo [ +<span id="L8" class="LineNr"> 8 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ <span id="L9" class="LineNr"> 9 </span> run [ <span id="L10" class="LineNr"> 10 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> <span id="L11" class="LineNr"> 11 </span> ] @@ -79,7 +79,7 @@ if ('onhashchange' in window) { <span id="L16" class="LineNr"> 16 </span><span class="Comment"># checks are inside scenario</span> <span id="L17" class="LineNr"> 17 </span> <span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario scenario_multiple_blocks)</span> -<span id="L19" class="LineNr"> 19 </span><span class="muScenario">scenario</span> foo [ +<span id="L19" class="LineNr"> 19 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ <span id="L20" class="LineNr"> 20 </span> run [ <span id="L21" class="LineNr"> 21 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> <span id="L22" class="LineNr"> 22 </span> ] @@ -97,10 +97,10 @@ if ('onhashchange' in window) { <span id="L34" class="LineNr"> 34 </span><span class="Comment"># checks are inside scenario</span> <span id="L35" class="LineNr"> 35 </span> <span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(scenario scenario_check_memory_and_trace)</span> -<span id="L37" class="LineNr"> 37 </span><span class="muScenario">scenario</span> foo [ +<span id="L37" class="LineNr"> 37 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ <span id="L38" class="LineNr"> 38 </span> run [ <span id="L39" class="LineNr"> 39 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> -<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] +<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [a b c] <span id="L41" class="LineNr"> 41 </span> ] <span id="L42" class="LineNr"> 42 </span> memory-should-contain [ <span id="L43" class="LineNr"> 43 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">13</span> @@ -117,12 +117,12 @@ if ('onhashchange' in window) { <span id="L54" class="LineNr"> 54 </span><span class="SalientComment">//:: Core data structure</span> <span id="L55" class="LineNr"> 55 </span> <span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(before "End Types")</span> -<span id="L57" class="LineNr"> 57 </span><span class="Normal">struct</span> scenario <span class="Delimiter">{</span> +<span id="L57" class="LineNr"> 57 </span><span class="Normal">struct</span> <a href='050scenario.cc.html#L57'>scenario</a> <span class="Delimiter">{</span> <span id="L58" class="LineNr"> 58 </span> string name<span class="Delimiter">;</span> <span id="L59" class="LineNr"> 59 </span> string to_run<span class="Delimiter">;</span> -<span id="L60" class="LineNr"> 60 </span> <span class="Normal">void</span> clear<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L61" class="LineNr"> 61 </span> name<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L62" class="LineNr"> 62 </span> to_run<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L60" class="LineNr"> 60 </span> <span class="Normal">void</span> <a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L61" class="LineNr"> 61 </span> name<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L62" class="LineNr"> 62 </span> to_run<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L63" class="LineNr"> 63 </span> <span class="Delimiter">}</span> <span id="L64" class="LineNr"> 64 </span><span class="Delimiter">};</span> <span id="L65" class="LineNr"> 65 </span> @@ -134,57 +134,57 @@ if ('onhashchange' in window) { <span id="L71" class="LineNr"> 71 </span> <span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(before "End Command Handlers")</span> <span id="L73" class="LineNr"> 73 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"scenario"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L74" class="LineNr"> 74 </span> scenario result = parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L74" class="LineNr"> 74 </span> <a href='050scenario.cc.html#L57'>scenario</a> result = <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L75" class="LineNr"> 75 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span id="L76" class="LineNr"> 76 </span> Scenarios<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span> <span id="L77" class="LineNr"> 77 </span><span class="Delimiter">}</span> <span id="L78" class="LineNr"> 78 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"pending-scenario"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L79" class="LineNr"> 79 </span> <span class="Comment">// for temporary use only</span> -<span id="L80" class="LineNr"> 80 </span> parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span class="Comment">// discard</span> +<span id="L80" class="LineNr"> 80 </span> <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span class="Comment">// discard</span> <span id="L81" class="LineNr"> 81 </span><span class="Delimiter">}</span> <span id="L82" class="LineNr"> 82 </span> <span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(code)</span> -<span id="L84" class="LineNr"> 84 </span><span class="muScenario">scenario</span> parse_scenario<span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L85" class="LineNr"> 85 </span> scenario result<span class="Delimiter">;</span> -<span id="L86" class="LineNr"> 86 </span> result<span class="Delimiter">.</span>name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L84" class="LineNr"> 84 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L85" class="LineNr"> 85 </span> <a href='050scenario.cc.html#L57'>scenario</a> result<span class="Delimiter">;</span> +<span id="L86" class="LineNr"> 86 </span> result<span class="Delimiter">.</span>name = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L87" class="LineNr"> 87 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L88" class="LineNr"> 88 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L89" class="LineNr"> 89 </span> raise << <span class="Constant">"incomplete scenario at end of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L89" class="LineNr"> 89 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='050scenario.cc.html#L57'>scenario</a> at <a href='003trace.cc.html#L195'>end</a> of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L90" class="LineNr"> 90 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> -<span id="L92" class="LineNr"> 92 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L92" class="LineNr"> 92 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L94" class="LineNr"> 94 </span> raise << <span class="Constant">"Expected '[' after scenario '"</span> << result<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L94" class="LineNr"> 94 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"Expected '[' after <a href='050scenario.cc.html#L57'>scenario</a> '"</span> << result<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L95" class="LineNr"> 95 </span> exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> <span id="L97" class="LineNr"> 97 </span> <span class="Comment">// scenarios are take special 'code' strings so we need to ignore brackets</span> <span id="L98" class="LineNr"> 98 </span> <span class="Comment">// inside comments</span> -<span id="L99" class="LineNr"> 99 </span> result<span class="Delimiter">.</span>to_run = slurp_quoted<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L99" class="LineNr"> 99 </span> result<span class="Delimiter">.</span>to_run = <a href='014literal_string.cc.html#L33'>slurp_quoted</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L100" class="LineNr">100 </span> <span class="Comment">// delete [] delimiters</span> <span id="L101" class="LineNr">101 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">,</span> <span class="Constant">"["</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L102" class="LineNr">102 </span> raise << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" should start with '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L103" class="LineNr">103 </span> result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" should start with '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L103" class="LineNr">103 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L104" class="LineNr">104 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span> <span id="L106" class="LineNr">106 </span> result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> -<span id="L107" class="LineNr">107 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>at<span class="Delimiter">(</span>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> -<span id="L108" class="LineNr">108 </span> raise << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" has an unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L109" class="LineNr">109 </span> result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L107" class="LineNr">107 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>at<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L108" class="LineNr">108 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" has an unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L109" class="LineNr">109 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L110" class="LineNr">110 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L111" class="LineNr">111 </span> <span class="Delimiter">}</span> -<span id="L112" class="LineNr">112 </span> result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>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 id="L112" class="LineNr">112 </span> result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span> <span id="L113" class="LineNr">113 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span> <span id="L115" class="LineNr">115 </span> <span id="L116" class="LineNr">116 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment)</span> -<span id="L117" class="LineNr">117 </span><span class="muScenario">scenario</span> foo [ +<span id="L117" class="LineNr">117 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ <span id="L118" class="LineNr">118 </span> <span class="Comment"># ']' in comment</span> <span id="L119" class="LineNr">119 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L120" class="LineNr">120 </span>] <span id="L121" class="LineNr">121 </span><span class="traceContains">+run: {1: "number"} <- copy {0: "literal"}</span> <span id="L122" class="LineNr">122 </span> <span id="L123" class="LineNr">123 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment_in_nested_string)</span> -<span id="L124" class="LineNr">124 </span><span class="muScenario">scenario</span> foo [ +<span id="L124" class="LineNr">124 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ <span id="L125" class="LineNr">125 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [<span class="Comment"># not a comment]</span> <span id="L126" class="LineNr">126 </span>] <span id="L127" class="LineNr">127 </span><span class="traceContains">+run: {1: ("address" "array" "character")} <- new {"# not a comment": "literal-string"}</span> @@ -195,7 +195,7 @@ if ('onhashchange' in window) { <span id="L132" class="LineNr">132 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L133" class="LineNr">133 </span><span class="Normal">int</span> Num_core_mu_scenarios = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L134" class="LineNr">134 </span><span class="Delimiter">:(after "Check For .mu Files")</span> -<span id="L135" class="LineNr">135 </span>Num_core_mu_scenarios = SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> +<span id="L135" class="LineNr">135 </span>Num_core_mu_scenarios = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> <span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before "End Tests")</span> <span id="L137" class="LineNr">137 </span>Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L138" class="LineNr">138 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -210,10 +210,10 @@ if ('onhashchange' in window) { <span id="L147" class="LineNr">147 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> <span id="L148" class="LineNr">148 </span><span class="Delimiter">}</span> <span id="L149" class="LineNr">149 </span><span class="Normal">run_app_scenarios</span>: -<span id="L150" class="LineNr">150 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios != SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L150" class="LineNr">150 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L151" class="LineNr">151 </span> time<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> <span id="L152" class="LineNr">152 </span> cerr << <span class="Constant">"App tests: "</span> << ctime<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> -<span id="L153" class="LineNr">153 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = Num_core_mu_scenarios<span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L153" class="LineNr">153 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = Num_core_mu_scenarios<span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L154" class="LineNr">154 </span><span class="CommentedCode">//? cerr << '\n' << i << ": " << Scenarios.at(i).name;</span> <span id="L155" class="LineNr">155 </span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span id="L156" class="LineNr">156 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">"."</span><span class="Delimiter">;</span> @@ -227,17 +227,17 @@ if ('onhashchange' in window) { <span id="L164" class="LineNr">164 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L165" class="LineNr">165 </span><span class="Normal">bool</span> Test_only_app = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L166" class="LineNr">166 </span><span class="Delimiter">:(before "End Commandline Options(*arg)")</span> -<span id="L167" class="LineNr">167 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_equal<span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">"--test-only-app"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L167" class="LineNr">167 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L70'>is_equal</a><span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">"--test-only-app"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L168" class="LineNr">168 </span> Test_only_app = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">:(after "End Test Run Initialization")</span> -<span id="L171" class="LineNr">171 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Test_only_app && Num_core_mu_scenarios < SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L171" class="LineNr">171 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Test_only_app && Num_core_mu_scenarios < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L172" class="LineNr">172 </span> <span class="Identifier">goto</span> run_app_scenarios<span class="Delimiter">;</span> <span id="L173" class="LineNr">173 </span><span class="Delimiter">}</span> <span id="L174" class="LineNr">174 </span> <span id="L175" class="LineNr">175 </span><span class="Comment">//: Convenience: run a single named scenario.</span> <span id="L176" class="LineNr">176 </span><span class="Delimiter">:(after "Test Runs")</span> -<span id="L177" class="LineNr">177 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L177" class="LineNr">177 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L178" class="LineNr">178 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == argv[argc-<span class="Constant">1</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L179" class="LineNr">179 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Start_tracing<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L180" class="LineNr">180 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> @@ -259,22 +259,22 @@ if ('onhashchange' in window) { <span id="L196" class="LineNr">196 </span><span class="CommentedCode">//? cerr << s.name << '\n';</span> <span id="L197" class="LineNr">197 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L198" class="LineNr">198 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> -<span id="L199" class="LineNr">199 </span> setup<span class="Delimiter">();</span> +<span id="L199" class="LineNr">199 </span> <a href='000organization.cc.html#L134'>setup</a><span class="Delimiter">();</span> <span id="L200" class="LineNr">200 </span> <span class="Delimiter">}</span> <span id="L201" class="LineNr">201 </span> vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span><span class="Constant">"recipe scenario_"</span>+s<span class="Delimiter">.</span>name+<span class="Constant">" [ "</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">" ]"</span><span class="Delimiter">);</span> <span id="L202" class="LineNr">202 </span> mark_autogenerated<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <span id="L203" class="LineNr">203 </span> bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L204" class="LineNr">204 </span> transform_all<span class="Delimiter">();</span> +<span id="L204" class="LineNr">204 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> <span id="L205" class="LineNr">205 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">())</span> <span id="L206" class="LineNr">206 </span> run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span> <span id="L207" class="LineNr">207 </span> <span class="Comment">// End Mu Test Teardown</span> -<span id="L208" class="LineNr">208 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors && trace_contains_errors<span class="Delimiter">()</span> && !Scenario_testing_scenario<span class="Delimiter">)</span> +<span id="L208" class="LineNr">208 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors && <a href='003trace.cc.html#L190'>trace_contains_errors</a><span class="Delimiter">()</span> && !Scenario_testing_scenario<span class="Delimiter">)</span> <span id="L209" class="LineNr">209 </span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L210" class="LineNr">210 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test && Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L211" class="LineNr">211 </span> teardown<span class="Delimiter">();</span> +<span id="L211" class="LineNr">211 </span> <a href='000organization.cc.html#L138'>teardown</a><span class="Delimiter">();</span> <span id="L212" class="LineNr">212 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L213" class="LineNr">213 </span> ofstream fout<span class="Delimiter">(</span><span class="Constant">"last_trace"</span><span class="Delimiter">);</span> -<span id="L214" class="LineNr">214 </span> fout << Trace_stream<span class="Delimiter">-></span>readable_contents<span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L214" class="LineNr">214 </span> fout << Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> <span id="L215" class="LineNr">215 </span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> <span id="L216" class="LineNr">216 </span> <span class="Delimiter">}</span> <span id="L217" class="LineNr">217 </span> <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span> @@ -293,7 +293,7 @@ if ('onhashchange' in window) { <span id="L230" class="LineNr">230 </span> <span id="L231" class="LineNr">231 </span><span class="Delimiter">:(code)</span> <span id="L232" class="LineNr">232 </span><span class="Comment">// Should contain everything passed by is_special_name but failed by is_disqualified.</span> -<span id="L233" class="LineNr">233 </span><span class="Normal">void</span> bind_special_scenario_names<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L233" class="LineNr">233 </span><span class="Normal">void</span> bind_special_scenario_names<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L234" class="LineNr">234 </span> <span class="Comment">// Special Scenario Variable Names(r)</span> <span id="L235" class="LineNr">235 </span> <span class="Comment">// End Special Scenario Variable Names(r)</span> <span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span> @@ -304,13 +304,13 @@ if ('onhashchange' in window) { <span id="L241" class="LineNr">241 </span><span class="Delimiter">:(code)</span> <span id="L242" class="LineNr">242 </span><span class="Normal">void</span> maybe_make_raw<span class="Delimiter">(</span>reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L243" class="LineNr">243 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_special_name<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L244" class="LineNr">244 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">"scenario_"</span><span class="Delimiter">))</span> +<span id="L244" class="LineNr">244 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">"scenario_"</span><span class="Delimiter">))</span> <span id="L245" class="LineNr">245 </span> r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"raw"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> <span id="L246" class="LineNr">246 </span> <span class="Comment">// End maybe_make_raw</span> <span id="L247" class="LineNr">247 </span><span class="Delimiter">}</span> <span id="L248" class="LineNr">248 </span> <span id="L249" class="LineNr">249 </span><span class="Comment">//: Test.</span> -<span id="L250" class="LineNr">250 </span><span class="Delimiter">:(before "End is_special_name Special-cases")</span> +<span id="L250" class="LineNr">250 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> <span id="L251" class="LineNr">251 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"__maybe_make_raw_test__"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L252" class="LineNr">252 </span><span class="Delimiter">:(before "End Special Scenario Variable Names(r)")</span> <span id="L253" class="LineNr">253 </span><span class="Comment">//: ugly: we only need this for this one test, but need to define it for all time</span> @@ -325,9 +325,9 @@ if ('onhashchange' in window) { <span id="L262" class="LineNr">262 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L263" class="LineNr">263 </span> mark_autogenerated<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <span id="L264" class="LineNr">264 </span> bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L265" class="LineNr">265 </span> transform_all<span class="Delimiter">();</span> +<span id="L265" class="LineNr">265 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> <span id="L266" class="LineNr">266 </span> run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L267" class="LineNr">267 </span> CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span> +<span id="L267" class="LineNr">267 </span> <a href='003trace.cc.html#L231'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><span class="Delimiter">();</span> <span id="L268" class="LineNr">268 </span><span class="Delimiter">}</span> <span id="L269" class="LineNr">269 </span> <span id="L270" class="LineNr">270 </span><span class="Comment">//: Watch out for redefinitions of scenario routines. We should never ever be</span> @@ -342,11 +342,11 @@ if ('onhashchange' in window) { <span id="L279" class="LineNr">279 </span><span class="muRecipe">def</span> scenario-foo [ <span id="L280" class="LineNr">280 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L281" class="LineNr">281 </span>] -<span id="L282" class="LineNr">282 </span><span class="traceContains">+error: redefining recipe scenario-foo</span> +<span id="L282" class="LineNr">282 </span><span class="traceContains">+error: redefining <a href='010vm.cc.html#L19'>recipe</a> scenario-foo</span> <span id="L283" class="LineNr">283 </span> <span id="L284" class="LineNr">284 </span><span class="Delimiter">:(scenario scenario_containing_parse_error)</span> <span id="L285" class="LineNr">285 </span><span class="Special">% Hide_errors = true;</span> -<span id="L286" class="LineNr">286 </span><span class="muScenario">scenario</span> foo [ +<span id="L286" class="LineNr">286 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ <span id="L287" class="LineNr">287 </span> memory-should-contain [ <span id="L288" class="LineNr">288 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> <span id="L289" class="LineNr">289 </span> <span class="Comment"># missing ']'</span> @@ -355,7 +355,7 @@ if ('onhashchange' in window) { <span id="L292" class="LineNr">292 </span> <span id="L293" class="LineNr">293 </span><span class="Delimiter">:(scenario scenario_containing_transform_error)</span> <span id="L294" class="LineNr">294 </span><span class="Special">% Hide_errors = true;</span> -<span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> main [ +<span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L296" class="LineNr">296 </span> local-scope <span id="L297" class="LineNr">297 </span> add x<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L298" class="LineNr">298 </span>] @@ -372,24 +372,24 @@ if ('onhashchange' in window) { <span id="L309" class="LineNr">309 </span><span class="Comment">//: tested from any setup or teardown</span> <span id="L310" class="LineNr">310 </span> <span id="L311" class="LineNr">311 </span><span class="Delimiter">:(scenario run)</span> -<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> main [ +<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L313" class="LineNr">313 </span> run [ <span id="L314" class="LineNr">314 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> <span id="L315" class="LineNr">315 </span> ] <span id="L316" class="LineNr">316 </span>] <span id="L317" class="LineNr">317 </span><span class="traceContains">+mem: storing 13 in location 1</span> <span id="L318" class="LineNr">318 </span> -<span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, recipe result)")</span> +<span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> <span id="L320" class="LineNr">320 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">"run"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L321" class="LineNr">321 </span> <span class="Comment">// Just inline all instructions inside the run block in the containing</span> <span id="L322" class="LineNr">322 </span> <span class="Comment">// recipe. 'run' is basically a comment; pretend it doesn't exist.</span> <span id="L323" class="LineNr">323 </span> istringstream in2<span class="Delimiter">(</span><span class="Constant">"[</span><span class="cSpecial">\n</span><span class="Constant">"</span>+curr<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name+<span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L324" class="LineNr">324 </span> slurp_body<span class="Delimiter">(</span>in2<span class="Delimiter">,</span> result<span class="Delimiter">);</span> -<span id="L325" class="LineNr">325 </span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L324" class="LineNr">324 </span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>in2<span class="Delimiter">,</span> result<span class="Delimiter">);</span> +<span id="L325" class="LineNr">325 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L326" class="LineNr">326 </span><span class="Delimiter">}</span> <span id="L327" class="LineNr">327 </span> <span id="L328" class="LineNr">328 </span><span class="Delimiter">:(scenario run_multiple)</span> -<span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> main [ +<span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L330" class="LineNr">330 </span> run [ <span id="L331" class="LineNr">331 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> <span id="L332" class="LineNr">332 </span> ] @@ -411,7 +411,7 @@ if ('onhashchange' in window) { <span id="L348" class="LineNr">348 </span><span class="Delimiter">:(scenario memory_check)</span> <span id="L349" class="LineNr">349 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L350" class="LineNr">350 </span><span class="Special">% Hide_errors = true;</span> -<span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> main [ +<span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L352" class="LineNr">352 </span> memory-should-contain [ <span id="L353" class="LineNr">353 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">13</span> <span id="L354" class="LineNr">354 </span> ] @@ -422,7 +422,7 @@ if ('onhashchange' in window) { <span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L360" class="LineNr">360 </span>MEMORY_SHOULD_CONTAIN<span class="Delimiter">,</span> <span id="L361" class="LineNr">361 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L362" class="LineNr">362 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"memory-should-contain"</span><span class="Delimiter">,</span> MEMORY_SHOULD_CONTAIN<span class="Delimiter">);</span> +<span id="L362" class="LineNr">362 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"memory-should-contain"</span><span class="Delimiter">,</span> MEMORY_SHOULD_CONTAIN<span class="Delimiter">);</span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L364" class="LineNr">364 </span><span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span> <span id="L365" class="LineNr">365 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -440,109 +440,109 @@ if ('onhashchange' in window) { <span id="L377" class="LineNr">377 </span> in >> std::noskipws<span class="Delimiter">;</span> <span id="L378" class="LineNr">378 </span> set<<span class="Normal">int</span>> locations_checked<span class="Delimiter">;</span> <span id="L379" class="LineNr">379 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L380" class="LineNr">380 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L380" class="LineNr">380 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L381" class="LineNr">381 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L382" class="LineNr">382 </span> string lhs = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L382" class="LineNr">382 </span> string lhs = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L383" class="LineNr">383 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L384" class="LineNr">384 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L385" class="LineNr">385 </span> raise << <span class="Constant">"incomplete 'memory-should-contain' block at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L385" class="LineNr">385 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L386" class="LineNr">386 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L387" class="LineNr">387 </span> <span class="Delimiter">}</span> <span id="L388" class="LineNr">388 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>lhs<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L389" class="LineNr">389 </span> check_type<span class="Delimiter">(</span>lhs<span class="Delimiter">,</span> in<span class="Delimiter">);</span> +<span id="L389" class="LineNr">389 </span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><span class="Delimiter">(</span>lhs<span class="Delimiter">,</span> in<span class="Delimiter">);</span> <span id="L390" class="LineNr">390 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L391" class="LineNr">391 </span> <span class="Delimiter">}</span> -<span id="L392" class="LineNr">392 </span> <span class="Normal">int</span> address = to_integer<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> -<span id="L393" class="LineNr">393 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L392" class="LineNr">392 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> +<span id="L393" class="LineNr">393 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L394" class="LineNr">394 </span> string _assign<span class="Delimiter">;</span> in >> _assign<span class="Delimiter">;</span> assert<span class="Delimiter">(</span>_assign == <span class="Constant">"<-"</span><span class="Delimiter">);</span> -<span id="L395" class="LineNr">395 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L396" class="LineNr">396 </span> string rhs = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L395" class="LineNr">395 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L396" class="LineNr">396 </span> string rhs = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L397" class="LineNr">397 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L398" class="LineNr">398 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L399" class="LineNr">399 </span> raise << <span class="Constant">"incomplete 'memory-should-contain' block at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L399" class="LineNr">399 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L400" class="LineNr">400 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L401" class="LineNr">401 </span> <span class="Delimiter">}</span> <span id="L402" class="LineNr">402 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>rhs<span class="Delimiter">)</span> && !is_noninteger<span class="Delimiter">(</span>rhs<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L403" class="LineNr">403 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span id="L404" class="LineNr">404 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L405" class="LineNr">405 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L405" class="LineNr">405 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L406" class="LineNr">406 </span> <span class="Normal">else</span> <span id="L407" class="LineNr">407 </span> <span class="Comment">// just testing scenario support</span> -<span id="L408" class="LineNr">408 </span> raise << <span class="Constant">"location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L408" class="LineNr">408 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span id="L409" class="LineNr">409 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L410" class="LineNr">410 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L411" class="LineNr">411 </span> <span class="Delimiter">}</span> -<span id="L412" class="LineNr">412 </span> <span class="Normal">double</span> value = to_double<span class="Delimiter">(</span>rhs<span class="Delimiter">);</span> -<span id="L413" class="LineNr">413 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>locations_checked<span class="Delimiter">,</span> address<span class="Delimiter">))</span> -<span id="L414" class="LineNr">414 </span> raise << <span class="Constant">"duplicate expectation for location '"</span> << address << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L415" class="LineNr">415 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << address << end<span class="Delimiter">();</span> -<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> +<span id="L412" class="LineNr">412 </span> <span class="Normal">double</span> value = <a href='015literal_noninteger.cc.html#L26'>to_double</a><span class="Delimiter">(</span>rhs<span class="Delimiter">);</span> +<span id="L413" class="LineNr">413 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>locations_checked<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> +<span id="L414" class="LineNr">414 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"duplicate expectation for location '"</span> << address << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L415" class="LineNr">415 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L416" class="LineNr">416 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> != value<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L417" class="LineNr">417 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L418" class="LineNr">418 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L419" class="LineNr">419 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L419" class="LineNr">419 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L420" class="LineNr">420 </span> <span class="Delimiter">}</span> <span id="L421" class="LineNr">421 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L422" class="LineNr">422 </span> <span class="Comment">// just testing scenario support</span> -<span id="L423" class="LineNr">423 </span> raise << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L423" class="LineNr">423 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L424" class="LineNr">424 </span> <span class="Delimiter">}</span> <span id="L425" class="LineNr">425 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L426" class="LineNr">426 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L427" class="LineNr">427 </span> <span class="Delimiter">}</span> -<span id="L428" class="LineNr">428 </span> locations_checked<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>address<span class="Delimiter">);</span> +<span id="L428" class="LineNr">428 </span> locations_checked<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> <span id="L429" class="LineNr">429 </span> <span class="Delimiter">}</span> <span id="L430" class="LineNr">430 </span><span class="Delimiter">}</span> <span id="L431" class="LineNr">431 </span> -<span id="L432" class="LineNr">432 </span><span class="Normal">void</span> check_type<span class="Delimiter">(</span><span class="Normal">const</span> string& lhs<span class="Delimiter">,</span> istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L432" class="LineNr">432 </span><span class="Normal">void</span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><span class="Delimiter">(</span><span class="Normal">const</span> string& lhs<span class="Delimiter">,</span> istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L433" class="LineNr">433 </span> reagent x<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> -<span id="L434" class="LineNr">434 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> && is_mu_character<span class="Delimiter">(</span>array_element<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L435" class="LineNr">435 </span> x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>to_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">));</span> -<span id="L436" class="LineNr">436 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L437" class="LineNr">437 </span> string _assign = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L434" class="LineNr">434 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> && is_mu_character<span class="Delimiter">(</span><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)))</span> <span class="Delimiter">{</span> +<span id="L435" class="LineNr">435 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">));</span> +<span id="L436" class="LineNr">436 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L437" class="LineNr">437 </span> string _assign = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L438" class="LineNr">438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>_assign<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L439" class="LineNr">439 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L440" class="LineNr">440 </span> raise << <span class="Constant">"incomplete 'memory-should-contain' block at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L440" class="LineNr">440 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L441" class="LineNr">441 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L442" class="LineNr">442 </span> <span class="Delimiter">}</span> <span id="L443" class="LineNr">443 </span> assert<span class="Delimiter">(</span>_assign == <span class="Constant">"<-"</span><span class="Delimiter">);</span> -<span id="L444" class="LineNr">444 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L445" class="LineNr">445 </span> string literal = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L444" class="LineNr">444 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L445" class="LineNr">445 </span> string literal = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L446" class="LineNr">446 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>literal<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L447" class="LineNr">447 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L448" class="LineNr">448 </span> raise << <span class="Constant">"incomplete 'memory-should-contain' block at end of file (3)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L448" class="LineNr">448 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (3)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L449" class="LineNr">449 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L450" class="LineNr">450 </span> <span class="Delimiter">}</span> -<span id="L451" class="LineNr">451 </span> <span class="Normal">int</span> address = x<span class="Delimiter">.</span>value<span class="Delimiter">;</span> +<span id="L451" class="LineNr">451 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = x<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <span id="L452" class="LineNr">452 </span> <span class="Comment">// exclude quoting brackets</span> <span id="L453" class="LineNr">453 </span> assert<span class="Delimiter">(</span>*literal<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> == <span class="Constant">'['</span><span class="Delimiter">);</span> literal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>literal<span class="Delimiter">.</span>begin<span class="Delimiter">());</span> -<span id="L454" class="LineNr">454 </span> assert<span class="Delimiter">(</span>*--literal<span class="Delimiter">.</span>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> -<span id="L455" class="LineNr">455 </span> check_string<span class="Delimiter">(</span>address<span class="Delimiter">,</span> literal<span class="Delimiter">);</span> +<span id="L454" class="LineNr">454 </span> assert<span class="Delimiter">(</span>*--literal<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()</span> == <span class="Constant">']'</span><span class="Delimiter">);</span> literal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>--literal<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> +<span id="L455" class="LineNr">455 </span> check_string<span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> literal<span class="Delimiter">);</span> <span id="L456" class="LineNr">456 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L457" class="LineNr">457 </span> <span class="Delimiter">}</span> <span id="L458" class="LineNr">458 </span> <span class="Comment">// End Scenario Type Special-cases</span> -<span id="L459" class="LineNr">459 </span> raise << <span class="Constant">"don't know how to check memory for '"</span> << lhs << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L459" class="LineNr">459 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"don't know how to check memory for '"</span> << lhs << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L460" class="LineNr">460 </span><span class="Delimiter">}</span> <span id="L461" class="LineNr">461 </span> -<span id="L462" class="LineNr">462 </span><span class="Normal">void</span> check_string<span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">,</span> <span class="Normal">const</span> string& literal<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L463" class="LineNr">463 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking string length at "</span> << address << end<span class="Delimiter">();</span> -<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> +<span id="L462" class="LineNr">462 </span><span class="Normal">void</span> check_string<span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> <span class="Normal">const</span> string& literal<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L463" class="LineNr">463 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking string length at "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L464" class="LineNr">464 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L465" class="LineNr">465 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> -<span id="L466" class="LineNr">466 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> << <span class="Constant">" ("</span> << 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> << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L466" class="LineNr">466 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="Constant">" ("</span> << <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span>address-<span class="Comment">/*</span><span class="Comment">fake refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L467" class="LineNr">467 </span> <span class="Normal">else</span> -<span id="L468" class="LineNr">468 </span> raise << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L468" class="LineNr">468 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L469" class="LineNr">469 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L470" class="LineNr">470 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L471" class="LineNr">471 </span> <span class="Delimiter">}</span> <span id="L472" class="LineNr">472 </span> ++address<span class="Delimiter">;</span> <span class="Comment">// now skip length</span> -<span id="L473" class="LineNr">473 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>literal<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L474" class="LineNr">474 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << address+i << end<span class="Delimiter">();</span> -<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> +<span id="L473" class="LineNr">473 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L474" class="LineNr">474 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << address+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L475" class="LineNr">475 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">)</span> != literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L476" class="LineNr">476 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L477" class="LineNr">477 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L478" class="LineNr">478 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">" ('"</span> << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L478" class="LineNr">478 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">" ('"</span> << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L479" class="LineNr">479 </span> <span class="Delimiter">}</span> <span id="L480" class="LineNr">480 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L481" class="LineNr">481 </span> <span class="Comment">// just testing scenario support</span> -<span id="L482" class="LineNr">482 </span> raise << <span class="Constant">"expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L482" class="LineNr">482 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L483" class="LineNr">483 </span> <span class="Delimiter">}</span> <span id="L484" class="LineNr">484 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L485" class="LineNr">485 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> @@ -553,7 +553,7 @@ if ('onhashchange' in window) { <span id="L490" class="LineNr">490 </span><span class="Delimiter">:(scenario memory_check_multiple)</span> <span id="L491" class="LineNr">491 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L492" class="LineNr">492 </span><span class="Special">% Hide_errors = true;</span> -<span id="L493" class="LineNr">493 </span><span class="muRecipe">def</span> main [ +<span id="L493" class="LineNr">493 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L494" class="LineNr">494 </span> memory-should-contain [ <span id="L495" class="LineNr">495 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> <span id="L496" class="LineNr">496 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> @@ -564,7 +564,7 @@ if ('onhashchange' in window) { <span id="L501" class="LineNr">501 </span><span class="Delimiter">:(scenario memory_check_string_length)</span> <span id="L502" class="LineNr">502 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L503" class="LineNr">503 </span><span class="Special">% Hide_errors = true;</span> -<span id="L504" class="LineNr">504 </span><span class="muRecipe">def</span> main [ +<span id="L504" class="LineNr">504 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L505" class="LineNr">505 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> <span id="L506" class="LineNr">506 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span id="L507" class="LineNr">507 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">98</span> <span class="Comment"># 'b'</span> @@ -576,7 +576,7 @@ if ('onhashchange' in window) { <span id="L513" class="LineNr">513 </span><span class="traceContains">+error: expected location '1' to contain length 2 of string [ab] but saw 3</span> <span id="L514" class="LineNr">514 </span> <span id="L515" class="LineNr">515 </span><span class="Delimiter">:(scenario memory_check_string)</span> -<span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> main [ +<span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L517" class="LineNr">517 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> <span id="L518" class="LineNr">518 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">97</span> <span class="Comment"># 'a'</span> <span id="L519" class="LineNr">519 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">98</span> <span class="Comment"># 'b'</span> @@ -593,7 +593,7 @@ if ('onhashchange' in window) { <span id="L530" class="LineNr">530 </span><span class="Delimiter">:(scenario memory_invalid_string_check)</span> <span id="L531" class="LineNr">531 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L532" class="LineNr">532 </span><span class="Special">% Hide_errors = true;</span> -<span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> main [ +<span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L534" class="LineNr">534 </span> memory-should-contain [ <span id="L535" class="LineNr">535 </span> <span class="Constant">1</span><span class="Special"> <- </span>[abc] <span id="L536" class="LineNr">536 </span> ] @@ -603,7 +603,7 @@ if ('onhashchange' in window) { <span id="L540" class="LineNr">540 </span><span class="Delimiter">:(scenario memory_check_with_comment)</span> <span id="L541" class="LineNr">541 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L542" class="LineNr">542 </span><span class="Special">% Hide_errors = true;</span> -<span id="L543" class="LineNr">543 </span><span class="muRecipe">def</span> main [ +<span id="L543" class="LineNr">543 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L544" class="LineNr">544 </span> memory-should-contain [ <span id="L545" class="LineNr">545 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">34</span> <span class="Comment"># comment</span> <span id="L546" class="LineNr">546 </span> ] @@ -619,18 +619,18 @@ if ('onhashchange' in window) { <span id="L556" class="LineNr">556 </span><span class="Delimiter">:(scenario trace_check_fails)</span> <span id="L557" class="LineNr">557 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L558" class="LineNr">558 </span><span class="Special">% Hide_errors = true;</span> -<span id="L559" class="LineNr">559 </span><span class="muRecipe">def</span> main [ +<span id="L559" class="LineNr">559 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L560" class="LineNr">560 </span> trace-should-contain [ <span id="L561" class="LineNr">561 </span> <span class="Normal">a</span>: b <span id="L562" class="LineNr">562 </span> <span class="Normal">a</span>: d <span id="L563" class="LineNr">563 </span> ] <span id="L564" class="LineNr">564 </span>] -<span id="L565" class="LineNr">565 </span><span class="traceContains">+error: missing [b] in trace with label 'a'</span> +<span id="L565" class="LineNr">565 </span><span class="traceContains">+error: missing [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> <span id="L566" class="LineNr">566 </span> <span id="L567" class="LineNr">567 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L568" class="LineNr">568 </span>TRACE_SHOULD_CONTAIN<span class="Delimiter">,</span> <span id="L569" class="LineNr">569 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L570" class="LineNr">570 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_CONTAIN<span class="Delimiter">);</span> +<span id="L570" class="LineNr">570 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_CONTAIN<span class="Delimiter">);</span> <span id="L571" class="LineNr">571 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L572" class="LineNr">572 </span><span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span> <span id="L573" class="LineNr">573 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -646,41 +646,41 @@ if ('onhashchange' in window) { <span id="L583" class="LineNr">583 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span> <span id="L584" class="LineNr">584 </span><span class="Comment">// than just printing to stderr</span> <span id="L585" class="LineNr">585 </span><span class="Normal">void</span> check_trace<span class="Delimiter">(</span><span class="Normal">const</span> string& expected<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L586" class="LineNr">586 </span> Trace_stream<span class="Delimiter">-></span>newline<span class="Delimiter">();</span> +<span id="L586" class="LineNr">586 </span> Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> <span id="L587" class="LineNr">587 </span> vector<trace_line> expected_lines = parse_trace<span class="Delimiter">(</span>expected<span class="Delimiter">);</span> <span id="L588" class="LineNr">588 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L589" class="LineNr">589 </span> <span class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L590" class="LineNr">590 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L590" class="LineNr">590 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L591" class="LineNr">591 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label != p<span class="Delimiter">-></span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L592" class="LineNr">592 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents != trim<span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L592" class="LineNr">592 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents != <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L593" class="LineNr">593 </span> <span class="Comment">// match</span> <span id="L594" class="LineNr">594 </span> ++curr_expected_line<span class="Delimiter">;</span> -<span id="L595" class="LineNr">595 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == SIZE<span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L595" class="LineNr">595 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L596" class="LineNr">596 </span> <span class="Delimiter">}</span> <span id="L597" class="LineNr">597 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> -<span id="L598" class="LineNr">598 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> -<span id="L599" class="LineNr">599 </span> << <span class="Constant">"in trace with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L598" class="LineNr">598 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> +<span id="L599" class="LineNr">599 </span> << <span class="Constant">"in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L600" class="LineNr">600 </span> <span class="Normal">else</span> -<span id="L601" class="LineNr">601 </span> raise << <span class="Constant">"missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> -<span id="L602" class="LineNr">602 </span> << <span class="Constant">"in trace with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L601" class="LineNr">601 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> +<span id="L602" class="LineNr">602 </span> << <span class="Constant">"in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L603" class="LineNr">603 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors<span class="Delimiter">)</span> -<span id="L604" class="LineNr">604 </span> 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 id="L604" class="LineNr">604 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label<span class="Delimiter">);</span> <span id="L605" class="LineNr">605 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L606" class="LineNr">606 </span><span class="Delimiter">}</span> <span id="L607" class="LineNr">607 </span> <span id="L608" class="LineNr">608 </span>vector<trace_line> parse_trace<span class="Delimiter">(</span><span class="Normal">const</span> string& expected<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L609" class="LineNr">609 </span> vector<string> buf = split<span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> +<span id="L609" class="LineNr">609 </span> vector<string> buf = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L610" class="LineNr">610 </span> vector<trace_line> result<span class="Delimiter">;</span> -<span id="L611" class="LineNr">611 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>buf<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L612" class="LineNr">612 </span> buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> = trim<span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> +<span id="L611" class="LineNr">611 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>buf<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L612" class="LineNr">612 </span> buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> = <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span id="L613" class="LineNr">613 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L614" class="LineNr">614 </span> <span class="Normal">int</span> delim = buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>find<span class="Delimiter">(</span><span class="Constant">": "</span><span class="Delimiter">);</span> <span id="L615" class="LineNr">615 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>delim == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L616" class="LineNr">616 </span> raise << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": lines in 'trace-should-contain' should be of the form <label>: <contents>. Both parts are required.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L617" class="LineNr">617 </span> result<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L616" class="LineNr">616 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": lines in 'trace-should-contain' should be of the form <label>: <contents>. Both parts are required.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L617" class="LineNr">617 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L618" class="LineNr">618 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L619" class="LineNr">619 </span> <span class="Delimiter">}</span> -<span id="L620" class="LineNr">620 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span>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 id="L620" class="LineNr">620 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> delim<span class="Delimiter">)),</span> <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>substr<span class="Delimiter">(</span>delim+<span class="Constant">2</span><span class="Delimiter">))));</span> <span id="L621" class="LineNr">621 </span> <span class="Delimiter">}</span> <span id="L622" class="LineNr">622 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L623" class="LineNr">623 </span><span class="Delimiter">}</span> @@ -688,28 +688,28 @@ if ('onhashchange' in window) { <span id="L625" class="LineNr">625 </span><span class="Delimiter">:(scenario trace_check_fails_in_nonfirst_line)</span> <span id="L626" class="LineNr">626 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L627" class="LineNr">627 </span><span class="Special">% Hide_errors = true;</span> -<span id="L628" class="LineNr">628 </span><span class="muRecipe">def</span> main [ +<span id="L628" class="LineNr">628 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L629" class="LineNr">629 </span> run [ -<span id="L630" class="LineNr">630 </span> trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] +<span id="L630" class="LineNr">630 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] <span id="L631" class="LineNr">631 </span> ] <span id="L632" class="LineNr">632 </span> trace-should-contain [ <span id="L633" class="LineNr">633 </span> <span class="Normal">a</span>: b <span id="L634" class="LineNr">634 </span> <span class="Normal">a</span>: d <span id="L635" class="LineNr">635 </span> ] <span id="L636" class="LineNr">636 </span>] -<span id="L637" class="LineNr">637 </span><span class="traceContains">+error: missing [d] in trace with label 'a'</span> +<span id="L637" class="LineNr">637 </span><span class="traceContains">+error: missing [d] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> <span id="L638" class="LineNr">638 </span> <span id="L639" class="LineNr">639 </span><span class="Delimiter">:(scenario trace_check_passes_silently)</span> <span id="L640" class="LineNr">640 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L641" class="LineNr">641 </span><span class="muRecipe">def</span> main [ +<span id="L641" class="LineNr">641 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L642" class="LineNr">642 </span> run [ -<span id="L643" class="LineNr">643 </span> trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] +<span id="L643" class="LineNr">643 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] <span id="L644" class="LineNr">644 </span> ] <span id="L645" class="LineNr">645 </span> trace-should-contain [ <span id="L646" class="LineNr">646 </span> <span class="Normal">a</span>: b <span id="L647" class="LineNr">647 </span> ] <span id="L648" class="LineNr">648 </span>] -<span id="L649" class="LineNr">649 </span><span class="traceAbsent">-error: missing [b] in trace with label 'a'</span> +<span id="L649" class="LineNr">649 </span><span class="traceAbsent">-error: missing [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> <span id="L650" class="LineNr">650 </span>$error: <span class="Constant">0</span> <span id="L651" class="LineNr">651 </span> <span id="L652" class="LineNr">652 </span><span class="Comment">//: 'trace-should-not-contain' is like the '-' lines in our scenarios so far</span> @@ -719,20 +719,20 @@ if ('onhashchange' in window) { <span id="L656" class="LineNr">656 </span><span class="Delimiter">:(scenario trace_negative_check_fails)</span> <span id="L657" class="LineNr">657 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L658" class="LineNr">658 </span><span class="Special">% Hide_errors = true;</span> -<span id="L659" class="LineNr">659 </span><span class="muRecipe">def</span> main [ +<span id="L659" class="LineNr">659 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L660" class="LineNr">660 </span> run [ -<span id="L661" class="LineNr">661 </span> trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] +<span id="L661" class="LineNr">661 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] <span id="L662" class="LineNr">662 </span> ] <span id="L663" class="LineNr">663 </span> trace-should-<span class="Normal">not</span>-contain [ <span id="L664" class="LineNr">664 </span> <span class="Normal">a</span>: b <span id="L665" class="LineNr">665 </span> ] <span id="L666" class="LineNr">666 </span>] -<span id="L667" class="LineNr">667 </span><span class="traceContains">+error: unexpected [b] in trace with label 'a'</span> +<span id="L667" class="LineNr">667 </span><span class="traceContains">+error: unexpected [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> <span id="L668" class="LineNr">668 </span> <span id="L669" class="LineNr">669 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L670" class="LineNr">670 </span>TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">,</span> <span id="L671" class="LineNr">671 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L672" class="LineNr">672 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-not-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">);</span> +<span id="L672" class="LineNr">672 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-not-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">);</span> <span id="L673" class="LineNr">673 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L674" class="LineNr">674 </span><span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span> <span id="L675" class="LineNr">675 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -748,11 +748,11 @@ if ('onhashchange' in window) { <span id="L685" class="LineNr">685 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span> <span id="L686" class="LineNr">686 </span><span class="Comment">// than just printing to stderr</span> <span id="L687" class="LineNr">687 </span><span class="Normal">bool</span> check_trace_missing<span class="Delimiter">(</span><span class="Normal">const</span> string& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L688" class="LineNr">688 </span> Trace_stream<span class="Delimiter">-></span>newline<span class="Delimiter">();</span> +<span id="L688" class="LineNr">688 </span> Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> <span id="L689" class="LineNr">689 </span> vector<trace_line> lines = parse_trace<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L690" class="LineNr">690 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L690" class="LineNr">690 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L691" class="LineNr">691 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span>lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label<span class="Delimiter">,</span> lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents<span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L692" class="LineNr">692 </span> raise << <span class="Constant">"unexpected ["</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents << <span class="Constant">"] in trace with label '"</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L692" class="LineNr">692 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unexpected ["</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents << <span class="Constant">"] in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L693" class="LineNr">693 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L694" class="LineNr">694 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L695" class="LineNr">695 </span> <span class="Delimiter">}</span> @@ -762,32 +762,32 @@ if ('onhashchange' in window) { <span id="L699" class="LineNr">699 </span> <span id="L700" class="LineNr">700 </span><span class="Delimiter">:(scenario trace_negative_check_passes_silently)</span> <span id="L701" class="LineNr">701 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L702" class="LineNr">702 </span><span class="muRecipe">def</span> main [ +<span id="L702" class="LineNr">702 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L703" class="LineNr">703 </span> trace-should-<span class="Normal">not</span>-contain [ <span id="L704" class="LineNr">704 </span> <span class="Normal">a</span>: b <span id="L705" class="LineNr">705 </span> ] <span id="L706" class="LineNr">706 </span>] -<span id="L707" class="LineNr">707 </span><span class="traceAbsent">-error: unexpected [b] in trace with label 'a'</span> +<span id="L707" class="LineNr">707 </span><span class="traceAbsent">-error: unexpected [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> <span id="L708" class="LineNr">708 </span>$error: <span class="Constant">0</span> <span id="L709" class="LineNr">709 </span> <span id="L710" class="LineNr">710 </span><span class="Delimiter">:(scenario trace_negative_check_fails_on_any_unexpected_line)</span> <span id="L711" class="LineNr">711 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L712" class="LineNr">712 </span><span class="Special">% Hide_errors = true;</span> -<span id="L713" class="LineNr">713 </span><span class="muRecipe">def</span> main [ +<span id="L713" class="LineNr">713 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L714" class="LineNr">714 </span> run [ -<span id="L715" class="LineNr">715 </span> trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [d] +<span id="L715" class="LineNr">715 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [d] <span id="L716" class="LineNr">716 </span> ] <span id="L717" class="LineNr">717 </span> trace-should-<span class="Normal">not</span>-contain [ <span id="L718" class="LineNr">718 </span> <span class="Normal">a</span>: b <span id="L719" class="LineNr">719 </span> <span class="Normal">a</span>: d <span id="L720" class="LineNr">720 </span> ] <span id="L721" class="LineNr">721 </span>] -<span id="L722" class="LineNr">722 </span><span class="traceContains">+error: unexpected [d] in trace with label 'a'</span> +<span id="L722" class="LineNr">722 </span><span class="traceContains">+error: unexpected [d] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> <span id="L723" class="LineNr">723 </span> <span id="L724" class="LineNr">724 </span><span class="Delimiter">:(scenario trace_count_check)</span> -<span id="L725" class="LineNr">725 </span><span class="muRecipe">def</span> main [ +<span id="L725" class="LineNr">725 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L726" class="LineNr">726 </span> run [ -<span id="L727" class="LineNr">727 </span> trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] +<span id="L727" class="LineNr">727 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] <span id="L728" class="LineNr">728 </span> ] <span id="L729" class="LineNr">729 </span> check-trace-count-<span class="Normal">for</span>-label <span class="Constant">1</span><span class="Delimiter">,</span> [a] <span id="L730" class="LineNr">730 </span>] @@ -796,19 +796,19 @@ if ('onhashchange' in window) { <span id="L733" class="LineNr">733 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L734" class="LineNr">734 </span>CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">,</span> <span id="L735" class="LineNr">735 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L736" class="LineNr">736 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"check-trace-count-for-label"</span><span class="Delimiter">,</span> CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">);</span> +<span id="L736" class="LineNr">736 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"check-trace-count-for-label"</span><span class="Delimiter">,</span> CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">);</span> <span id="L737" class="LineNr">737 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L738" class="LineNr">738 </span><span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span> -<span id="L739" class="LineNr">739 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L740" class="LineNr">740 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'check-trace-count-for-label' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L739" class="LineNr">739 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L740" class="LineNr">740 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'check-trace-count-for-label' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L741" class="LineNr">741 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L742" class="LineNr">742 </span> <span class="Delimiter">}</span> <span id="L743" class="LineNr">743 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L744" class="LineNr">744 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'check-trace-count-for-label' should be a number (count), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L744" class="LineNr">744 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'check-trace-count-for-label' should be a number (count), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L745" class="LineNr">745 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L746" class="LineNr">746 </span> <span class="Delimiter">}</span> <span id="L747" class="LineNr">747 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L748" class="LineNr">748 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L748" class="LineNr">748 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L749" class="LineNr">749 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L750" class="LineNr">750 </span> <span class="Delimiter">}</span> <span id="L751" class="LineNr">751 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -822,12 +822,12 @@ if ('onhashchange' in window) { <span id="L759" class="LineNr">759 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>count != expected_count<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L760" class="LineNr">760 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L761" class="LineNr">761 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L762" class="LineNr">762 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": "</span> << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in trace with label '"</span> << label << <span class="Constant">"' in trace: "</span> << end<span class="Delimiter">();</span> -<span id="L763" class="LineNr">763 </span> DUMP<span class="Delimiter">(</span>label<span class="Delimiter">);</span> +<span id="L762" class="LineNr">762 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": "</span> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << label << <span class="Constant">"' in <a href='003trace.cc.html#L171'>trace</a>: "</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L763" class="LineNr">763 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>label<span class="Delimiter">);</span> <span id="L764" class="LineNr">764 </span> <span class="Delimiter">}</span> <span id="L765" class="LineNr">765 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L766" class="LineNr">766 </span> <span class="Comment">// just testing scenario support</span> -<span id="L767" class="LineNr">767 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in trace with label '"</span> << label << <span class="Constant">"' in trace</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L767" class="LineNr">767 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << label << <span class="Constant">"' in <a href='003trace.cc.html#L171'>trace</a></span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L768" class="LineNr">768 </span> <span class="Delimiter">}</span> <span id="L769" class="LineNr">769 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L770" class="LineNr">770 </span> <span class="Delimiter">}</span> @@ -837,13 +837,13 @@ if ('onhashchange' in window) { <span id="L774" class="LineNr">774 </span><span class="Delimiter">:(scenario trace_count_check_2)</span> <span id="L775" class="LineNr">775 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L776" class="LineNr">776 </span><span class="Special">% Hide_errors = true;</span> -<span id="L777" class="LineNr">777 </span><span class="muRecipe">def</span> main [ +<span id="L777" class="LineNr">777 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L778" class="LineNr">778 </span> run [ -<span id="L779" class="LineNr">779 </span> trace <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] +<span id="L779" class="LineNr">779 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] <span id="L780" class="LineNr">780 </span> ] <span id="L781" class="LineNr">781 </span> check-trace-count-<span class="Normal">for</span>-label <span class="Constant">2</span><span class="Delimiter">,</span> [a] <span id="L782" class="LineNr">782 </span>] -<span id="L783" class="LineNr">783 </span><span class="traceContains">+error: main: expected 2 lines in trace with label 'a' in trace</span> +<span id="L783" class="LineNr">783 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: expected 2 lines in <a href='003trace.cc.html#L171'>trace</a> with label 'a' in <a href='003trace.cc.html#L171'>trace</a></span> <span id="L784" class="LineNr">784 </span> <span id="L785" class="LineNr">785 </span><span class="Comment">//: Minor detail: ignore 'system' calls in scenarios, since anything we do</span> <span id="L786" class="LineNr">786 </span><span class="Comment">//: with them is by definition impossible to test through Mu.</span> @@ -858,21 +858,21 @@ if ('onhashchange' in window) { <span id="L795" class="LineNr">795 </span>] <span id="L796" class="LineNr">796 </span><span class="traceContains">+error: foo_bar: don't create recipes with '_' in the name</span> <span id="L797" class="LineNr">797 </span> -<span id="L798" class="LineNr">798 </span><span class="Delimiter">:(before "End recipe Fields")</span> +<span id="L798" class="LineNr">798 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Fields")</span> <span id="L799" class="LineNr">799 </span><span class="Normal">bool</span> is_autogenerated<span class="Delimiter">;</span> -<span id="L800" class="LineNr">800 </span><span class="Delimiter">:(before "End recipe Constructor")</span> +<span id="L800" class="LineNr">800 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Constructor")</span> <span id="L801" class="LineNr">801 </span>is_autogenerated = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L802" class="LineNr">802 </span><span class="Delimiter">:(code)</span> -<span id="L803" class="LineNr">803 </span><span class="Normal">void</span> mark_autogenerated<span class="Delimiter">(</span>recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L803" class="LineNr">803 </span><span class="Normal">void</span> mark_autogenerated<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L804" class="LineNr">804 </span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L805" class="LineNr">805 </span><span class="Delimiter">}</span> <span id="L806" class="LineNr">806 </span> <span id="L807" class="LineNr">807 </span><span class="Delimiter">:(after "void transform_all()")</span> -<span id="L808" class="LineNr">808 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L808" class="LineNr">808 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L809" class="LineNr">809 </span> <span class="Normal">const</span> recipe& r = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <span id="L810" class="LineNr">810 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'_'</span><span class="Delimiter">)</span> == string::npos<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L811" class="LineNr">811 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>is_autogenerated<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// created by previous call to transform_all()</span> -<span id="L812" class="LineNr">812 </span> raise << r<span class="Delimiter">.</span>name << <span class="Constant">": don't create recipes with '_' in the name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L812" class="LineNr">812 </span> <a href='003trace.cc.html#L178'>raise</a> << r<span class="Delimiter">.</span>name << <span class="Constant">": don't create recipes with '_' in the name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L813" class="LineNr">813 </span> <span class="Delimiter">}</span> <span id="L814" class="LineNr">814 </span> <span id="L815" class="LineNr">815 </span><span class="SalientComment">//:: Helpers</span> @@ -882,15 +882,15 @@ if ('onhashchange' in window) { <span id="L819" class="LineNr">819 </span><span class="Normal">void</span> run_mu_scenario<span class="Delimiter">(</span><span class="Normal">const</span> string& form<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L820" class="LineNr">820 </span> istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span> <span id="L821" class="LineNr">821 </span> in >> std::noskipws<span class="Delimiter">;</span> -<span id="L822" class="LineNr">822 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L823" class="LineNr">823 </span> string _scenario = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L822" class="LineNr">822 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L823" class="LineNr">823 </span> string _scenario = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L824" class="LineNr">824 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>_scenario<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> <span id="L825" class="LineNr">825 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L826" class="LineNr">826 </span> raise << <span class="Constant">"no scenario in string passed into run_mu_scenario()</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L826" class="LineNr">826 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"no <a href='050scenario.cc.html#L57'>scenario</a> in string passed into run_mu_scenario()</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L827" class="LineNr">827 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L828" class="LineNr">828 </span> <span class="Delimiter">}</span> <span id="L829" class="LineNr">829 </span> assert<span class="Delimiter">(</span>_scenario == <span class="Constant">"scenario"</span><span class="Delimiter">);</span> -<span id="L830" class="LineNr">830 </span> scenario s = parse_scenario<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L830" class="LineNr">830 </span> <a href='050scenario.cc.html#L57'>scenario</a> s = <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L831" class="LineNr">831 </span> run_mu_scenario<span class="Delimiter">(</span>s<span class="Delimiter">);</span> <span id="L832" class="LineNr">832 </span><span class="Delimiter">}</span> </pre> diff --git a/html/052tangle.cc.html b/html/052tangle.cc.html index e12ee4a4..48085f22 100644 --- a/html/052tangle.cc.html +++ b/html/052tangle.cc.html @@ -66,16 +66,16 @@ if ('onhashchange' in window) { <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> <span id="L7" class="LineNr"> 7 </span><span class="Comment">//: outside the recipe. However, waypoints are global: a recipe can have</span> <span id="L8" class="LineNr"> 8 </span><span class="Comment">//: multiple of them, you can't use them as jump targets.</span> -<span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before "End is_jump_target Special-cases")</span> -<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> +<span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before "End <a href='041jump_target.cc.html#L11'>is_jump_target</a> Special-cases")</span> +<span id="L10" class="LineNr"> 10 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='052tangle.cc.html#L13'>is_waypoint</a><span class="Delimiter">(</span>label<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L11" class="LineNr"> 11 </span><span class="Comment">//: Waypoints are always surrounded by '<>', e.g. <handle-request>.</span> <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L13" class="LineNr"> 13 </span><span class="Normal">bool</span> <a href='052tangle.cc.html#L13'>is_waypoint</a><span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">'<'</span> && *label<span class="Delimiter">.</span>rbegin<span class="Delimiter">()</span> == <span class="Constant">'>'</span><span class="Delimiter">;</span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">}</span> <span id="L16" class="LineNr"> 16 </span> <span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(scenario tangle_before)</span> -<span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> main [ +<span id="L18" class="LineNr"> 18 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L19" class="LineNr"> 19 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L20" class="LineNr"> 20 </span> <label1> <span id="L21" class="LineNr"> 21 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -95,39 +95,39 @@ if ('onhashchange' in window) { <span id="L35" class="LineNr"> 35 </span>map<string <span class="Comment">/*</span><span class="Comment">label</span><span class="Comment">*/</span><span class="Delimiter">,</span> recipe> Before_fragments<span class="Delimiter">,</span> After_fragments<span class="Delimiter">;</span> <span id="L36" class="LineNr"> 36 </span>set<string <span class="Comment">/*</span><span class="Comment">label</span><span class="Comment">*/</span>> Fragments_used<span class="Delimiter">;</span> <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(before "End Setup")</span> -<span id="L38" class="LineNr"> 38 </span>Before_fragments<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L39" class="LineNr"> 39 </span>After_fragments<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L40" class="LineNr"> 40 </span>Fragments_used<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L38" class="LineNr"> 38 </span>Before_fragments<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L39" class="LineNr"> 39 </span>After_fragments<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L40" class="LineNr"> 40 </span>Fragments_used<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L41" class="LineNr"> 41 </span> <span id="L42" class="LineNr"> 42 </span><span class="Delimiter">:(before "End Command Handlers")</span> <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">"before"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L44" class="LineNr"> 44 </span> string label = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L44" class="LineNr"> 44 </span> string label = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L46" class="LineNr"> 46 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L47" class="LineNr"> 47 </span> raise << <span class="Constant">"incomplete 'before' block at end of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L47" class="LineNr"> 47 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'before' block at <a href='003trace.cc.html#L195'>end</a> of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L48" class="LineNr"> 48 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L49" class="LineNr"> 49 </span> <span class="Delimiter">}</span> -<span id="L50" class="LineNr"> 50 </span> recipe tmp<span class="Delimiter">;</span> -<span id="L51" class="LineNr"> 51 </span> slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> -<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> -<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> +<span id="L50" class="LineNr"> 50 </span> <a href='010vm.cc.html#L19'>recipe</a> tmp<span class="Delimiter">;</span> +<span id="L51" class="LineNr"> 51 </span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> +<span id="L52" class="LineNr"> 52 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='052tangle.cc.html#L13'>is_waypoint</a><span class="Delimiter">(</span>label<span class="Delimiter">))</span> +<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><a href='003trace.cc.html#L195'>end</a><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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> <span id="L54" class="LineNr"> 54 </span> <span class="Normal">else</span> -<span id="L55" class="LineNr"> 55 </span> raise << <span class="Constant">"can't tangle before non-waypoint "</span> << label << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L55" class="LineNr"> 55 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't tangle before non-waypoint "</span> << label << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span id="L56" class="LineNr"> 56 </span> <span class="Comment">// End before Command Handler</span> <span id="L57" class="LineNr"> 57 </span><span class="Delimiter">}</span> <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">"after"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L59" class="LineNr"> 59 </span> string label = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L59" class="LineNr"> 59 </span> string label = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L61" class="LineNr"> 61 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L62" class="LineNr"> 62 </span> raise << <span class="Constant">"incomplete 'after' block at end of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'after' block at <a href='003trace.cc.html#L195'>end</a> of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L63" class="LineNr"> 63 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L64" class="LineNr"> 64 </span> <span class="Delimiter">}</span> -<span id="L65" class="LineNr"> 65 </span> recipe tmp<span class="Delimiter">;</span> -<span id="L66" class="LineNr"> 66 </span> slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> -<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> -<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> +<span id="L65" class="LineNr"> 65 </span> <a href='010vm.cc.html#L19'>recipe</a> tmp<span class="Delimiter">;</span> +<span id="L66" class="LineNr"> 66 </span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> +<span id="L67" class="LineNr"> 67 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='052tangle.cc.html#L13'>is_waypoint</a><span class="Delimiter">(</span>label<span class="Delimiter">))</span> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> <span id="L69" class="LineNr"> 69 </span> <span class="Normal">else</span> -<span id="L70" class="LineNr"> 70 </span> raise << <span class="Constant">"can't tangle after non-waypoint "</span> << label << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L70" class="LineNr"> 70 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"can't tangle after non-waypoint "</span> << label << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> <span id="L71" class="LineNr"> 71 </span> <span class="Comment">// End after Command Handler</span> <span id="L72" class="LineNr"> 72 </span><span class="Delimiter">}</span> <span id="L73" class="LineNr"> 73 </span> @@ -139,25 +139,25 @@ if ('onhashchange' in window) { <span id="L79" class="LineNr"> 79 </span><span class="Comment">//: We might need to perform multiple passes, in case inserted fragments</span> <span id="L80" class="LineNr"> 80 </span><span class="Comment">//: include more labels that need further insertions. Track which labels we've</span> <span id="L81" class="LineNr"> 81 </span><span class="Comment">//: already processed using an extra field.</span> -<span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(before "End instruction Fields")</span> +<span id="L82" class="LineNr"> 82 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L32'>instruction</a> Fields")</span> <span id="L83" class="LineNr"> 83 </span><span class="Normal">mutable</span> <span class="Normal">bool</span> tangle_done<span class="Delimiter">;</span> -<span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before "End instruction Constructor")</span> +<span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L32'>instruction</a> Constructor")</span> <span id="L85" class="LineNr"> 85 </span>tangle_done = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L86" class="LineNr"> 86 </span> <span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L88" class="LineNr"> 88 </span><span class="Normal">void</span> insert_fragments<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L90" class="LineNr"> 90 </span><span class="Delimiter">}</span> <span id="L91" class="LineNr"> 91 </span> <span id="L92" class="LineNr"> 92 </span><span class="Normal">void</span> insert_fragments<span class="Delimiter">(</span>recipe& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L93" class="LineNr"> 93 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- insert fragments into recipe "</span> << r<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L93" class="LineNr"> 93 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- insert fragments into <a href='010vm.cc.html#L19'>recipe</a> "</span> << r<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L94" class="LineNr"> 94 </span> <span class="Normal">bool</span> made_progress = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L95" class="LineNr"> 95 </span> <span class="Normal">int</span> pass = <span class="Constant">0</span><span class="Delimiter">;</span> <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> <span id="L97" class="LineNr"> 97 </span> made_progress = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L98" class="LineNr"> 98 </span> <span class="Comment">// create a new vector because insertions invalidate iterators</span> <span id="L99" class="LineNr"> 99 </span> vector<instruction> result<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L101" class="LineNr">101 </span> <span class="Normal">const</span> instruction& inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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> <span id="L103" class="LineNr">103 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span> @@ -171,13 +171,13 @@ if ('onhashchange' in window) { <span id="L111" class="LineNr">111 </span> <span class="Comment">// ok to use contains_key even though Before_fragments uses [],</span> <span id="L112" class="LineNr">112 </span> <span class="Comment">// because appending an empty recipe is a noop</span> <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> -<span id="L114" class="LineNr">114 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"insert fragments before label "</span> << inst<span class="Delimiter">.</span>label << end<span class="Delimiter">();</span> -<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> +<span id="L114" class="LineNr">114 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"insert fragments before label "</span> << inst<span class="Delimiter">.</span>label << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L115" class="LineNr">115 </span> <a href='052tangle.cc.html#L128'>append_fragment</a><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 id="L116" class="LineNr">116 </span> <span class="Delimiter">}</span> <span id="L117" class="LineNr">117 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span> <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> -<span id="L119" class="LineNr">119 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"insert fragments after label "</span> << inst<span class="Delimiter">.</span>label << end<span class="Delimiter">();</span> -<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> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"insert fragments after label "</span> << inst<span class="Delimiter">.</span>label << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L120" class="LineNr">120 </span> <a href='052tangle.cc.html#L128'>append_fragment</a><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 id="L121" class="LineNr">121 </span> <span class="Delimiter">}</span> <span id="L122" class="LineNr">122 </span> <span class="Delimiter">}</span> <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> @@ -185,7 +185,7 @@ if ('onhashchange' in window) { <span id="L125" class="LineNr">125 </span> <span class="Delimiter">}</span> <span id="L126" class="LineNr">126 </span><span class="Delimiter">}</span> <span id="L127" class="LineNr">127 </span> -<span id="L128" class="LineNr">128 </span><span class="Normal">void</span> append_fragment<span class="Delimiter">(</span>vector<instruction>& base<span class="Delimiter">,</span> <span class="Normal">const</span> vector<instruction>& patch<span class="Delimiter">,</span> <span class="Normal">const</span> string prefix<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L128" class="LineNr">128 </span><span class="Normal">void</span> <a href='052tangle.cc.html#L128'>append_fragment</a><span class="Delimiter">(</span>vector<instruction>& base<span class="Delimiter">,</span> <span class="Normal">const</span> vector<instruction>& patch<span class="Delimiter">,</span> <span class="Normal">const</span> string prefix<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L129" class="LineNr">129 </span> <span class="Comment">// append 'patch' to 'base' while keeping 'base' oblivious to any new jump</span> <span id="L130" class="LineNr">130 </span> <span class="Comment">// targets in 'patch' oblivious to 'base' by prepending 'prefix' to them.</span> <span id="L131" class="LineNr">131 </span> <span class="Comment">// we might tangle the same fragment at multiple points in a single recipe,</span> @@ -193,22 +193,22 @@ if ('onhashchange' in window) { <span id="L133" class="LineNr">133 </span> <span class="Comment">// so we'll keep jump targets local to the specific before/after fragment</span> <span id="L134" class="LineNr">134 </span> <span class="Comment">// that introduces them.</span> <span id="L135" class="LineNr">135 </span> set<string> jump_targets<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>patch<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>patch<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L137" class="LineNr">137 </span> <span class="Normal">const</span> instruction& inst = patch<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L138" class="LineNr">138 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label && is_jump_target<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> +<span id="L138" class="LineNr">138 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>is_label && <a href='041jump_target.cc.html#L11'>is_jump_target</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <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> <span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span> -<span id="L141" class="LineNr">141 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>patch<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L142" class="LineNr">142 </span> instruction inst = patch<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> +<span id="L141" class="LineNr">141 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>patch<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L142" class="LineNr">142 </span> <a href='010vm.cc.html#L32'>instruction</a> inst = patch<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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> <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> <span id="L145" class="LineNr">145 </span> inst<span class="Delimiter">.</span>label = prefix+inst<span class="Delimiter">.</span>label<span class="Delimiter">;</span> <span id="L146" class="LineNr">146 </span> base<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span> <span id="L147" class="LineNr">147 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L148" class="LineNr">148 </span> <span class="Delimiter">}</span> -<span id="L149" class="LineNr">149 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L150" class="LineNr">150 </span> reagent& x = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span> -<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> && contains_key<span class="Delimiter">(</span>jump_targets<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> +<span id="L151" class="LineNr">151 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='041jump_target.cc.html#L11'>is_jump_target</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> && contains_key<span class="Delimiter">(</span>jump_targets<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span id="L152" class="LineNr">152 </span> x<span class="Delimiter">.</span>name = prefix+x<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L153" class="LineNr">153 </span> <span class="Delimiter">}</span> <span id="L154" class="LineNr">154 </span> base<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span> @@ -222,21 +222,21 @@ if ('onhashchange' in window) { <span id="L162" class="LineNr">162 </span><span class="Comment">//: spurious errors, run this check right at the end, after all code is</span> <span id="L163" class="LineNr">163 </span><span class="Comment">//: loaded, right before we run main.</span> <span id="L164" class="LineNr">164 </span><span class="Delimiter">:(before "End Commandline Parsing")</span> -<span id="L165" class="LineNr">165 </span>check_insert_fragments<span class="Delimiter">();</span> +<span id="L165" class="LineNr">165 </span><a href='052tangle.cc.html#L167'>check_insert_fragments</a><span class="Delimiter">();</span> <span id="L166" class="LineNr">166 </span><span class="Delimiter">:(code)</span> -<span id="L167" class="LineNr">167 </span><span class="Normal">void</span> check_insert_fragments<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L168" class="LineNr">168 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> recipe>::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 id="L167" class="LineNr">167 </span><span class="Normal">void</span> <a href='052tangle.cc.html#L167'>check_insert_fragments</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L168" class="LineNr">168 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> recipe>::iterator p = Before_fragments<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Before_fragments<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>first<span class="Delimiter">))</span> -<span id="L170" class="LineNr">170 </span> raise << <span class="Constant">"could not locate insert before label "</span> << p<span class="Delimiter">-></span>first << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L170" class="LineNr">170 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"could not locate insert before label "</span> << p<span class="Delimiter">-></span>first << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L171" class="LineNr">171 </span> <span class="Delimiter">}</span> -<span id="L172" class="LineNr">172 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> recipe>::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 id="L172" class="LineNr">172 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> recipe>::iterator p = After_fragments<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != After_fragments<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>first<span class="Delimiter">))</span> -<span id="L174" class="LineNr">174 </span> raise << <span class="Constant">"could not locate insert after label "</span> << p<span class="Delimiter">-></span>first << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"could not locate insert after label "</span> << p<span class="Delimiter">-></span>first << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L175" class="LineNr">175 </span> <span class="Delimiter">}</span> <span id="L176" class="LineNr">176 </span><span class="Delimiter">}</span> <span id="L177" class="LineNr">177 </span> <span id="L178" class="LineNr">178 </span><span class="Delimiter">:(scenario tangle_before_and_after)</span> -<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> main [ +<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L180" class="LineNr">180 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L181" class="LineNr">181 </span> <label1> <span id="L182" class="LineNr">182 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -257,7 +257,7 @@ if ('onhashchange' in window) { <span id="L197" class="LineNr">197 </span> <span id="L198" class="LineNr">198 </span><span class="Delimiter">:(scenario tangle_ignores_jump_target)</span> <span id="L199" class="LineNr">199 </span><span class="Special">% Hide_errors = true;</span> -<span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> main [ +<span id="L200" class="LineNr">200 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L201" class="LineNr">201 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L202" class="LineNr">202 </span> +label1 <span id="L203" class="LineNr">203 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -268,7 +268,7 @@ if ('onhashchange' in window) { <span id="L208" class="LineNr">208 </span><span class="traceContains">+error: can't tangle before non-waypoint +label1</span> <span id="L209" class="LineNr">209 </span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(scenario tangle_keeps_labels_separate)</span> -<span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> main [ +<span id="L211" class="LineNr">211 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L212" class="LineNr">212 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L213" class="LineNr">213 </span> <label1> <span id="L214" class="LineNr">214 </span> <label2> @@ -299,7 +299,7 @@ if ('onhashchange' in window) { <span id="L239" class="LineNr">239 </span>$mem: <span class="Constant">6</span> <span id="L240" class="LineNr">240 </span> <span id="L241" class="LineNr">241 </span><span class="Delimiter">:(scenario tangle_stacks_multiple_fragments)</span> -<span id="L242" class="LineNr">242 </span><span class="muRecipe">def</span> main [ +<span id="L242" class="LineNr">242 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L243" class="LineNr">243 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L244" class="LineNr">244 </span> <label1> <span id="L245" class="LineNr">245 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -329,7 +329,7 @@ if ('onhashchange' in window) { <span id="L269" class="LineNr">269 </span>$mem: <span class="Constant">6</span> <span id="L270" class="LineNr">270 </span> <span id="L271" class="LineNr">271 </span><span class="Delimiter">:(scenario tangle_supports_fragments_with_multiple_instructions)</span> -<span id="L272" class="LineNr">272 </span><span class="muRecipe">def</span> main [ +<span id="L272" class="LineNr">272 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L273" class="LineNr">273 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L274" class="LineNr">274 </span> <label1> <span id="L275" class="LineNr">275 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -353,7 +353,7 @@ if ('onhashchange' in window) { <span id="L293" class="LineNr">293 </span>$mem: <span class="Constant">6</span> <span id="L294" class="LineNr">294 </span> <span id="L295" class="LineNr">295 </span><span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name)</span> -<span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> main [ +<span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L297" class="LineNr">297 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L298" class="LineNr">298 </span> <label1> <span id="L299" class="LineNr">299 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> @@ -385,7 +385,7 @@ if ('onhashchange' in window) { <span id="L325" class="LineNr">325 </span>$mem: <span class="Constant">8</span> <span id="L326" class="LineNr">326 </span> <span id="L327" class="LineNr">327 </span><span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name_2)</span> -<span id="L328" class="LineNr">328 </span><span class="muRecipe">def</span> main [ +<span id="L328" class="LineNr">328 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L329" class="LineNr">329 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L330" class="LineNr">330 </span> <label1> <span id="L331" class="LineNr">331 </span> <label1> @@ -409,7 +409,7 @@ if ('onhashchange' in window) { <span id="L349" class="LineNr">349 </span>$mem: <span class="Constant">6</span> <span id="L350" class="LineNr">350 </span> <span id="L351" class="LineNr">351 </span><span class="Delimiter">:(scenario tangle_tangles_into_all_labels_with_same_name_3)</span> -<span id="L352" class="LineNr">352 </span><span class="muRecipe">def</span> main [ +<span id="L352" class="LineNr">352 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L353" class="LineNr">353 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L354" class="LineNr">354 </span> <label1> <span id="L355" class="LineNr">355 </span> <foo> @@ -436,7 +436,7 @@ if ('onhashchange' in window) { <span id="L376" class="LineNr">376 </span>$mem: <span class="Constant">6</span> <span id="L377" class="LineNr">377 </span> <span id="L378" class="LineNr">378 </span><span class="Delimiter">:(scenario tangle_handles_jump_target_inside_fragment)</span> -<span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> main [ +<span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L380" class="LineNr">380 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L381" class="LineNr">381 </span> <label1> <span id="L382" class="LineNr">382 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> @@ -457,7 +457,7 @@ if ('onhashchange' in window) { <span id="L397" class="LineNr">397 </span>$mem: <span class="Constant">3</span> <span id="L398" class="LineNr">398 </span> <span id="L399" class="LineNr">399 </span><span class="Delimiter">:(scenario tangle_renames_jump_target)</span> -<span id="L400" class="LineNr">400 </span><span class="muRecipe">def</span> main [ +<span id="L400" class="LineNr">400 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L401" class="LineNr">401 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L402" class="LineNr">402 </span> <label1> <span id="L403" class="LineNr">403 </span> +label2 @@ -479,7 +479,7 @@ if ('onhashchange' in window) { <span id="L419" class="LineNr">419 </span>$mem: <span class="Constant">3</span> <span id="L420" class="LineNr">420 </span> <span id="L421" class="LineNr">421 </span><span class="Delimiter">:(scenario tangle_jump_to_base_recipe)</span> -<span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> main [ +<span id="L422" class="LineNr">422 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L423" class="LineNr">423 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L424" class="LineNr">424 </span> <label1> <span id="L425" class="LineNr">425 </span> +label2 @@ -502,7 +502,7 @@ if ('onhashchange' in window) { <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> <span id="L443" class="LineNr">443 </span> <span id="L444" class="LineNr">444 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L445" class="LineNr">445 </span><span class="Normal">void</span> <a href='052tangle.cc.html#L445'>test_new_fragment_after_tangle</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L446" class="LineNr">446 </span> <span class="Comment">// define a recipe</span> <span id="L447" class="LineNr">447 </span> load<span class="Delimiter">(</span><span class="Constant">"def foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L448" class="LineNr">448 </span> <span class="Constant">" local-scope</span><span class="cSpecial">\n</span><span class="Constant">"</span> @@ -511,22 +511,22 @@ if ('onhashchange' in window) { <span id="L451" class="LineNr">451 </span> <span class="Constant">"after <label> [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L452" class="LineNr">452 </span> <span class="Constant">" 1:num/raw <- copy 34</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L453" class="LineNr">453 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L454" class="LineNr">454 </span> transform_all<span class="Delimiter">();</span> -<span id="L455" class="LineNr">455 </span> CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span> +<span id="L454" class="LineNr">454 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> +<span id="L455" class="LineNr">455 </span> <a href='003trace.cc.html#L231'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><span class="Delimiter">();</span> <span id="L456" class="LineNr">456 </span> Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L457" class="LineNr">457 </span> <span class="Comment">// try to tangle into recipe foo after transform</span> <span id="L458" class="LineNr">458 </span> load<span class="Delimiter">(</span><span class="Constant">"before <label> [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L459" class="LineNr">459 </span> <span class="Constant">" 2:num/raw <- copy 35</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L460" class="LineNr">460 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L461" class="LineNr">461 </span> CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span> +<span id="L461" class="LineNr">461 </span> <a href='003trace.cc.html#L230'>CHECK_TRACE_CONTAINS_ERRORS</a><span class="Delimiter">();</span> <span id="L462" class="LineNr">462 </span><span class="Delimiter">}</span> <span id="L463" class="LineNr">463 </span> <span id="L464" class="LineNr">464 </span><span class="Delimiter">:(before "End before Command Handler")</span> <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> -<span id="L466" class="LineNr">466 </span> raise << <span class="Constant">"we've already tangled some code at label "</span> << label << <span class="Constant">" in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L466" class="LineNr">466 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"we've already tangled some code at label "</span> << label << <span class="Constant">" in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L467" class="LineNr">467 </span><span class="Delimiter">:(before "End after Command Handler")</span> <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> -<span id="L469" class="LineNr">469 </span> raise << <span class="Constant">"we've already tangled some code at label "</span> << label << <span class="Constant">" in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L469" class="LineNr">469 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"we've already tangled some code at label "</span> << label << <span class="Constant">" in a previous call to transform_all(). Those locations won't be updated.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> </pre> </body> </html> diff --git a/html/053recipe_header.cc.html b/html/053recipe_header.cc.html index 50479877..07f94784 100644 --- a/html/053recipe_header.cc.html +++ b/html/053recipe_header.cc.html @@ -64,7 +64,7 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span><span class="Comment">//: number of ingredients and yields some fixed number of products.</span> <span id="L3" class="LineNr"> 3 </span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario recipe_with_header)</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -> </span>z:num [ @@ -77,52 +77,52 @@ if ('onhashchange' in window) { <span id="L15" class="LineNr"> 15 </span> <span id="L16" class="LineNr"> 16 </span><span class="Comment">//: When loading recipes save any header.</span> <span id="L17" class="LineNr"> 17 </span> -<span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(before "End recipe Fields")</span> +<span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Fields")</span> <span id="L19" class="LineNr"> 19 </span><span class="Normal">bool</span> has_header<span class="Delimiter">;</span> <span id="L20" class="LineNr"> 20 </span>vector<reagent> ingredients<span class="Delimiter">;</span> <span id="L21" class="LineNr"> 21 </span>vector<reagent> products<span class="Delimiter">;</span> -<span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before "End recipe Constructor")</span> +<span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Constructor")</span> <span id="L23" class="LineNr"> 23 </span>has_header = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L24" class="LineNr"> 24 </span> <span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "End Recipe Refinements")</span> <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> -<span id="L27" class="LineNr"> 27 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"recipe has a header; parsing"</span> << end<span class="Delimiter">();</span> -<span id="L28" class="LineNr"> 28 </span> load_recipe_header<span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span> +<span id="L27" class="LineNr"> 27 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"recipe has a header; parsing"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L28" class="LineNr"> 28 </span> <a href='053recipe_header.cc.html#L32'>load_recipe_header</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> result<span class="Delimiter">);</span> <span id="L29" class="LineNr"> 29 </span><span class="Delimiter">}</span> <span id="L30" class="LineNr"> 30 </span> <span id="L31" class="LineNr"> 31 </span><span class="Delimiter">:(code)</span> -<span id="L32" class="LineNr"> 32 </span><span class="Normal">void</span> load_recipe_header<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> recipe& result<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L32" class="LineNr"> 32 </span><span class="Normal">void</span> <a href='053recipe_header.cc.html#L32'>load_recipe_header</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> recipe& result<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L33" class="LineNr"> 33 </span> result<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span> -<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> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L35" class="LineNr"> 35 </span> string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L34" class="LineNr"> 34 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L35" class="LineNr"> 35 </span> string s = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L37" class="LineNr"> 37 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L38" class="LineNr"> 38 </span> raise << <span class="Constant">"incomplete recipe header at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L38" class="LineNr"> 38 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='010vm.cc.html#L19'>recipe</a> header at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L39" class="LineNr"> 39 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L40" class="LineNr"> 40 </span> <span class="Delimiter">}</span> <span id="L41" class="LineNr"> 41 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"<-"</span><span class="Delimiter">)</span> -<span id="L42" class="LineNr"> 42 </span> raise << <span class="Constant">"recipe "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" should say '->' and not '<-'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L42" class="LineNr"> 42 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"recipe "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" should say '->' and not '<-'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"->"</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <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> -<span id="L45" class="LineNr"> 45 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"header ingredient: "</span> << result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string << end<span class="Delimiter">();</span> +<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"header ingredient: "</span> << result<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L46" class="LineNr"> 46 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L47" class="LineNr"> 47 </span> <span class="Delimiter">}</span> -<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> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L49" class="LineNr"> 49 </span> string s = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L48" class="LineNr"> 48 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span> && in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L49" class="LineNr"> 49 </span> string s = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L51" class="LineNr"> 51 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L52" class="LineNr"> 52 </span> raise << <span class="Constant">"incomplete recipe header at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L52" class="LineNr"> 52 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='010vm.cc.html#L19'>recipe</a> header at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L53" class="LineNr"> 53 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L54" class="LineNr"> 54 </span> <span class="Delimiter">}</span> <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> -<span id="L56" class="LineNr"> 56 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"header product: "</span> << result<span class="Delimiter">.</span>products<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string << end<span class="Delimiter">();</span> +<span id="L56" class="LineNr"> 56 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"header product: "</span> << result<span class="Delimiter">.</span>products<span class="Delimiter">.</span>back<span class="Delimiter">().</span>original_string << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L57" class="LineNr"> 57 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L58" class="LineNr"> 58 </span> <span class="Delimiter">}</span> <span id="L59" class="LineNr"> 59 </span> <span class="Comment">// End Load Recipe Header(result)</span> <span id="L60" class="LineNr"> 60 </span><span class="Delimiter">}</span> <span id="L61" class="LineNr"> 61 </span> <span id="L62" class="LineNr"> 62 </span><span class="Delimiter">:(scenario recipe_handles_stray_comma)</span> -<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> main [ +<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L64" class="LineNr"> 64 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L65" class="LineNr"> 65 </span>] <span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -> </span>z:num<span class="Delimiter">,</span> [ @@ -134,7 +134,7 @@ if ('onhashchange' in window) { <span id="L72" class="LineNr"> 72 </span><span class="traceContains">+mem: storing 8 in location 1</span> <span id="L73" class="LineNr"> 73 </span> <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(scenario recipe_handles_stray_comma_2)</span> -<span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> main [ +<span id="L75" class="LineNr"> 75 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L76" class="LineNr"> 76 </span> foo <span id="L77" class="LineNr"> 77 </span>] <span id="L78" class="LineNr"> 78 </span><span class="muRecipe">def</span> foo<span class="Delimiter">,</span> [ @@ -149,42 +149,42 @@ if ('onhashchange' in window) { <span id="L87" class="LineNr"> 87 </span><span class="Special">% Hide_errors = true;</span> <span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> foo a:num<span class="Special"> <- </span>b:num [ <span id="L89" class="LineNr"> 89 </span>] -<span id="L90" class="LineNr"> 90 </span><span class="traceContains">+error: recipe foo should say '->' and not '<-'</span> +<span id="L90" class="LineNr"> 90 </span><span class="traceContains">+error: <a href='010vm.cc.html#L19'>recipe</a> foo should say '->' and not '<-'</span> <span id="L91" class="LineNr"> 91 </span> <span id="L92" class="LineNr"> 92 </span><span class="Delimiter">:(scenario recipe_handles_missing_bracket)</span> <span id="L93" class="LineNr"> 93 </span><span class="Special">% Hide_errors = true;</span> -<span id="L94" class="LineNr"> 94 </span><span class="muRecipe">def</span> main +<span id="L94" class="LineNr"> 94 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> <span id="L95" class="LineNr"> 95 </span><span class="Error">]</span> -<span id="L96" class="LineNr"> 96 </span><span class="traceContains">+error: main: recipe body must begin with '['</span> +<span id="L96" class="LineNr"> 96 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L19'>recipe</a> body must begin with '['</span> <span id="L97" class="LineNr"> 97 </span> <span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(scenario recipe_handles_missing_bracket_2)</span> <span id="L99" class="LineNr"> 99 </span><span class="Special">% Hide_errors = true;</span> -<span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> main +<span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> <span id="L101" class="LineNr">101 </span> local-scope <span id="L102" class="LineNr">102 </span> <span class="Delimiter">{</span> <span id="L103" class="LineNr">103 </span> <span class="Delimiter">}</span> <span id="L104" class="LineNr">104 </span><span class="Error">]</span> <span id="L105" class="LineNr">105 </span><span class="Comment"># doesn't overflow line when reading header</span> <span id="L106" class="LineNr">106 </span><span class="traceAbsent">-parse: header ingredient: local-scope</span> -<span id="L107" class="LineNr">107 </span><span class="traceContains">+error: main: recipe body must begin with '['</span> +<span id="L107" class="LineNr">107 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L19'>recipe</a> body must begin with '['</span> <span id="L108" class="LineNr">108 </span> <span id="L109" class="LineNr">109 </span><span class="Delimiter">:(scenario recipe_handles_missing_bracket_3)</span> <span id="L110" class="LineNr">110 </span><span class="Special">% Hide_errors = true;</span> -<span id="L111" class="LineNr">111 </span><span class="muRecipe">def</span> main <span class="Comment"># comment</span> +<span id="L111" class="LineNr">111 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> <span class="Comment"># comment</span> <span id="L112" class="LineNr">112 </span> local-scope <span id="L113" class="LineNr">113 </span> <span class="Delimiter">{</span> <span id="L114" class="LineNr">114 </span> <span class="Delimiter">}</span> <span id="L115" class="LineNr">115 </span><span class="Error">]</span> <span id="L116" class="LineNr">116 </span><span class="Comment"># doesn't overflow line when reading header</span> <span id="L117" class="LineNr">117 </span><span class="traceAbsent">-parse: header ingredient: local-scope</span> -<span id="L118" class="LineNr">118 </span><span class="traceContains">+error: main: recipe body must begin with '['</span> +<span id="L118" class="LineNr">118 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L19'>recipe</a> body must begin with '['</span> <span id="L119" class="LineNr">119 </span> <span id="L120" class="LineNr">120 </span><span class="Delimiter">:(after "Begin debug_string(recipe x)")</span> <span id="L121" class="LineNr">121 </span>out << <span class="Constant">"ingredients:</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L123" class="LineNr">123 </span> out << <span class="Constant">" "</span> << 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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L124" class="LineNr">124 </span>out << <span class="Constant">"products:</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L125" class="LineNr">125 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>x<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L125" class="LineNr">125 </span><span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L126" class="LineNr">126 </span> out << <span class="Constant">" "</span> << 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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L127" class="LineNr">127 </span> <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> @@ -193,12 +193,12 @@ if ('onhashchange' in window) { <span id="L131" class="LineNr">131 </span><span class="muRecipe">def</span> test [ <span id="L132" class="LineNr">132 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L133" class="LineNr">133 </span>] -<span id="L134" class="LineNr">134 </span><span class="traceContains">+parse: recipe test has a header</span> +<span id="L134" class="LineNr">134 </span><span class="traceContains">+parse: <a href='010vm.cc.html#L19'>recipe</a> test has a header</span> <span id="L135" class="LineNr">135 </span> <span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before "End Recipe Body(result)")</span> <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> <span id="L138" class="LineNr">138 </span> result<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L140" class="LineNr">140 </span> <span class="Normal">const</span> instruction& inst = result<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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">"reply"</span> && !inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span id="L142" class="LineNr">142 </span> || <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"return"</span> && !inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> @@ -211,13 +211,13 @@ if ('onhashchange' in window) { <span id="L149" class="LineNr">149 </span> <span class="Delimiter">}</span> <span id="L150" class="LineNr">150 </span><span class="Delimiter">}</span> <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> -<span id="L152" class="LineNr">152 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"recipe "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" has a header"</span> << end<span class="Delimiter">();</span> +<span id="L152" class="LineNr">152 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"recipe "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" has a header"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span> <span id="L154" class="LineNr">154 </span> <span id="L155" class="LineNr">155 </span><span class="Comment">//: Support type abbreviations in headers.</span> <span id="L156" class="LineNr">156 </span> <span id="L157" class="LineNr">157 </span><span class="Delimiter">:(scenario type_abbreviations_in_recipe_headers)</span> -<span id="L158" class="LineNr">158 </span><span class="muRecipe">def</span> main [ +<span id="L158" class="LineNr">158 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L159" class="LineNr">159 </span> local-scope <span id="L160" class="LineNr">160 </span> <span class="Normal">a</span>:text<span class="Special"> <- </span>foo <span id="L161" class="LineNr">161 </span> <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw <- </span>index *a<span class="Delimiter">,</span> <span class="Constant">0</span> @@ -230,35 +230,35 @@ if ('onhashchange' in window) { <span id="L168" class="LineNr">168 </span><span class="traceContains">+mem: storing 97 in location 1</span> <span id="L169" class="LineNr">169 </span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">:(before "End Expand Type Abbreviations(caller)")</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <span id="L175" class="LineNr">175 </span> <span id="L176" class="LineNr">176 </span><span class="Comment">//: Rewrite 'load-ingredients' to instructions to create all reagents in the header.</span> <span id="L177" class="LineNr">177 </span> -<span id="L178" class="LineNr">178 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, recipe result)")</span> +<span id="L178" class="LineNr">178 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> <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">"load-ingredients"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L180" class="LineNr">180 </span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L181" class="LineNr">181 </span> recipe_ordinal op = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"next-ingredient-without-typechecking"</span><span class="Delimiter">);</span> -<span id="L182" class="LineNr">182 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>result<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L180" class="LineNr">180 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L181" class="LineNr">181 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> op = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"next-ingredient-without-typechecking"</span><span class="Delimiter">);</span> +<span id="L182" class="LineNr">182 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L183" class="LineNr">183 </span> curr<span class="Delimiter">.</span>operation = op<span class="Delimiter">;</span> <span id="L184" class="LineNr">184 </span> curr<span class="Delimiter">.</span>name = <span class="Constant">"next-ingredient-without-typechecking"</span><span class="Delimiter">;</span> <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> <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> -<span id="L187" class="LineNr">187 </span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L187" class="LineNr">187 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L188" class="LineNr">188 </span> <span class="Delimiter">}</span> <span id="L189" class="LineNr">189 </span><span class="Delimiter">}</span> <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">"next-ingredient-without-typechecking"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L191" class="LineNr">191 </span> raise << maybe<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"never call 'next-ingredient-without-typechecking' directly</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L192" class="LineNr">192 </span> curr<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L191" class="LineNr">191 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"never call 'next-ingredient-without-typechecking' directly</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L192" class="LineNr">192 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L193" class="LineNr">193 </span><span class="Delimiter">}</span> <span id="L194" class="LineNr">194 </span> <span id="L195" class="LineNr">195 </span><span class="Comment">//: internal version of next-ingredient; don't call this directly</span> <span id="L196" class="LineNr">196 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L197" class="LineNr">197 </span>NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">,</span> <span id="L198" class="LineNr">198 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L199" class="LineNr">199 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"next-ingredient-without-typechecking"</span><span class="Delimiter">,</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">);</span> +<span id="L199" class="LineNr">199 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"next-ingredient-without-typechecking"</span><span class="Delimiter">,</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING<span class="Delimiter">);</span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L201" class="LineNr">201 </span><span class="Normal">case</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING: <span class="Delimiter">{</span> <span id="L202" class="LineNr">202 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -266,10 +266,10 @@ if ('onhashchange' in window) { <span id="L204" class="LineNr">204 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L205" class="LineNr">205 </span><span class="Normal">case</span> NEXT_INGREDIENT_WITHOUT_TYPECHECKING: <span class="Delimiter">{</span> <span id="L206" class="LineNr">206 </span> assert<span class="Delimiter">(</span>!Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> -<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 < SIZE<span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>current_call<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L208" class="LineNr">208 </span> products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span> <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> -<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> +<span id="L210" class="LineNr">210 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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> <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> <span id="L212" class="LineNr">212 </span> ++current_call<span class="Delimiter">().</span>next_ingredient_to_process<span class="Delimiter">;</span> <span id="L213" class="LineNr">213 </span> <span class="Delimiter">}</span> @@ -295,7 +295,7 @@ if ('onhashchange' in window) { <span id="L233" class="LineNr">233 </span> <span id="L234" class="LineNr">234 </span><span class="Delimiter">:(after "use-before-set Error")</span> <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> -<span id="L236" class="LineNr">236 </span> raise << <span class="Constant">" did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L236" class="LineNr">236 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L237" class="LineNr">237 </span> <span id="L238" class="LineNr">238 </span><span class="Delimiter">:(scenario load_ingredients_missing_error_2)</span> <span id="L239" class="LineNr">239 </span><span class="Special">% Hide_errors = true;</span> @@ -308,11 +308,11 @@ if ('onhashchange' in window) { <span id="L246" class="LineNr">246 </span> <span id="L247" class="LineNr">247 </span><span class="Delimiter">:(after "missing-type Error 1")</span> <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> -<span id="L249" class="LineNr">249 </span> raise << <span class="Constant">" did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L249" class="LineNr">249 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L250" class="LineNr">250 </span> <span id="L251" class="LineNr">251 </span><span class="Delimiter">:(code)</span> <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& callee<span class="Delimiter">,</span> <span class="Normal">const</span> string& ingredient_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L255" class="LineNr">255 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L256" class="LineNr">256 </span> <span class="Delimiter">}</span> @@ -323,7 +323,7 @@ if ('onhashchange' in window) { <span id="L261" class="LineNr">261 </span> <span id="L262" class="LineNr">262 </span><span class="Delimiter">:(scenario show_clear_error_on_bad_call)</span> <span id="L263" class="LineNr">263 </span><span class="Special">% Hide_errors = true;</span> -<span id="L264" class="LineNr">264 </span><span class="muRecipe">def</span> main [ +<span id="L264" class="LineNr">264 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L265" class="LineNr">265 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>foo <span class="Constant">34</span> <span id="L266" class="LineNr">266 </span>] <span id="L267" class="LineNr">267 </span><span class="muRecipe">def</span> foo x:point<span class="muRecipe"> -> </span>y:num [ @@ -331,11 +331,11 @@ if ('onhashchange' in window) { <span id="L269" class="LineNr">269 </span> load-ingredients <span id="L270" class="LineNr">270 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L271" class="LineNr">271 </span>] -<span id="L272" class="LineNr">272 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num <- foo 34'</span> +<span id="L272" class="LineNr">272 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: ingredient 0 has the wrong type at '1:num <- foo 34'</span> <span id="L273" class="LineNr">273 </span> <span id="L274" class="LineNr">274 </span><span class="Delimiter">:(scenario show_clear_error_on_bad_call_2)</span> <span id="L275" class="LineNr">275 </span><span class="Special">% Hide_errors = true;</span> -<span id="L276" class="LineNr">276 </span><span class="muRecipe">def</span> main [ +<span id="L276" class="LineNr">276 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L277" class="LineNr">277 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>foo <span class="Constant">34</span> <span id="L278" class="LineNr">278 </span>] <span id="L279" class="LineNr">279 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -> </span>y:num [ @@ -343,29 +343,29 @@ if ('onhashchange' in window) { <span id="L281" class="LineNr">281 </span> load-ingredients <span id="L282" class="LineNr">282 </span> <span class="Identifier">return</span> x <span id="L283" class="LineNr">283 </span>] -<span id="L284" class="LineNr">284 </span><span class="traceContains">+error: main: product 0 has the wrong type at '1:point <- foo 34'</span> +<span id="L284" class="LineNr">284 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product 0 has the wrong type at '1:point <- foo 34'</span> <span id="L285" class="LineNr">285 </span> <span id="L286" class="LineNr">286 </span><span class="Delimiter">:(after "Transform.push_back(check_instruction)")</span> <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> <span id="L288" class="LineNr">288 </span><span class="Delimiter">:(code)</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L290" class="LineNr">290 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L291" class="LineNr">291 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- type-check calls inside recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- type-check calls inside <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L293" class="LineNr">293 </span> <span class="Normal">const</span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L294" class="LineNr">294 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation < MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L294" class="LineNr">294 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation < <a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L295" class="LineNr">295 </span> <span class="Normal">const</span> recipe& callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span> <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> -<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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L298" class="LineNr">298 </span> <span class="Comment">// ingredients coerced from call to callee</span> <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> -<span id="L300" class="LineNr">300 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient "</span> << i << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L300" class="LineNr">300 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient "</span> << i << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L301" class="LineNr">301 </span> <span class="Delimiter">}</span> -<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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L304" class="LineNr">304 </span> <span class="Comment">// products coerced from callee to call</span> <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> -<span id="L306" class="LineNr">306 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product "</span> << i << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L306" class="LineNr">306 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product "</span> << i << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L307" class="LineNr">307 </span> <span class="Delimiter">}</span> <span id="L308" class="LineNr">308 </span> <span class="Delimiter">}</span> <span id="L309" class="LineNr">309 </span><span class="Delimiter">}</span> @@ -387,20 +387,20 @@ if ('onhashchange' in window) { <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> <span id="L326" class="LineNr">326 </span> <span id="L327" class="LineNr">327 </span><span class="Delimiter">:(code)</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L329" class="LineNr">329 </span> <span class="Normal">const</span> recipe& caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<span id="L331" class="LineNr">331 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- checking return instructions against header for "</span> << caller_recipe<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < 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 id="L331" class="LineNr">331 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- checking return instructions against header for "</span> << caller_recipe<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L333" class="LineNr">333 </span> <span class="Normal">const</span> instruction& inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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">"reply"</span> && inst<span class="Delimiter">.</span>name != <span class="Constant">"return"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<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> -<span id="L336" class="LineNr">336 </span> raise << maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"replied with the wrong number of products at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L335" class="LineNr">335 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L336" class="LineNr">336 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"replied with the wrong number of products at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L337" class="LineNr">337 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L338" class="LineNr">338 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 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> -<span id="L341" class="LineNr">341 </span> raise << maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"replied with the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L341" class="LineNr">341 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"replied with the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L342" class="LineNr">342 </span> <span class="Delimiter">}</span> <span id="L343" class="LineNr">343 </span> <span class="Delimiter">}</span> <span id="L344" class="LineNr">344 </span><span class="Delimiter">}</span> @@ -434,22 +434,22 @@ if ('onhashchange' in window) { <span id="L372" class="LineNr">372 </span>] <span id="L373" class="LineNr">373 </span><span class="traceContains">+error: add2: 'x' can't repeat in the ingredients</span> <span id="L374" class="LineNr">374 </span> -<span id="L375" class="LineNr">375 </span><span class="Delimiter">:(before "End recipe Fields")</span> +<span id="L375" class="LineNr">375 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Fields")</span> <span id="L376" class="LineNr">376 </span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>> ingredient_index<span class="Delimiter">;</span> <span id="L377" class="LineNr">377 </span> <span id="L378" class="LineNr">378 </span><span class="Delimiter">:(after "Begin Instruction Modifying Transforms")</span> <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> <span id="L380" class="LineNr">380 </span> <span id="L381" class="LineNr">381 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L382" class="LineNr">382 </span><span class="Normal">void</span> check_header_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L383" class="LineNr">383 </span> recipe& caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<span id="L385" class="LineNr">385 </span> caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L386" class="LineNr">386 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- checking return instructions against header for "</span> << caller_recipe<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < 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 id="L385" class="LineNr">385 </span> caller_recipe<span class="Delimiter">.</span>ingredient_index<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L386" class="LineNr">386 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- checking return instructions against header for "</span> << caller_recipe<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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 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> -<span id="L389" class="LineNr">389 </span> raise << maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</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="Constant">"' can't repeat in the ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L389" class="LineNr">389 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"'"</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="Constant">"' can't repeat in the ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L390" class="LineNr">390 </span> <a href='001help.cc.html#L218'>put</a><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 id="L391" class="LineNr">391 </span> <span class="Delimiter">}</span> <span id="L392" class="LineNr">392 </span><span class="Delimiter">}</span> <span id="L393" class="LineNr">393 </span> @@ -457,7 +457,7 @@ if ('onhashchange' in window) { <span id="L395" class="LineNr">395 </span> <span id="L396" class="LineNr">396 </span><span class="Delimiter">:(scenarios run)</span> <span id="L397" class="LineNr">397 </span><span class="Delimiter">:(scenario deduce_instruction_types_from_recipe_header)</span> -<span id="L398" class="LineNr">398 </span><span class="muRecipe">def</span> main [ +<span id="L398" class="LineNr">398 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L399" class="LineNr">399 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L400" class="LineNr">400 </span>] <span id="L401" class="LineNr">401 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -> </span>z:num [ @@ -472,40 +472,40 @@ if ('onhashchange' in window) { <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> <span id="L411" class="LineNr">411 </span> <span id="L412" class="LineNr">412 </span><span class="Delimiter">:(code)</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L414" class="LineNr">414 </span> recipe& caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<span id="L416" class="LineNr">416 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- deduce types from header for "</span> << caller_recipe<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L416" class="LineNr">416 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- deduce types from header for "</span> << caller_recipe<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L417" class="LineNr">417 </span> map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*> header_type<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 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> -<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> -<span id="L421" class="LineNr">421 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</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="Constant">" is "</span> << 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> << end<span class="Delimiter">();</span> +<span id="L420" class="LineNr">420 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L421" class="LineNr">421 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</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="Constant">" is "</span> << 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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L422" class="LineNr">422 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 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> -<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> -<span id="L426" class="LineNr">426 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</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="Constant">" is "</span> << 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> << end<span class="Delimiter">();</span> +<span id="L425" class="LineNr">425 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L426" class="LineNr">426 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</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="Constant">" is "</span> << 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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L427" class="LineNr">427 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L429" class="LineNr">429 </span> instruction& inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L430" class="LineNr">430 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction: "</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<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 < 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 id="L430" class="LineNr">430 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span id="L434" class="LineNr">434 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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> <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> -<span id="L437" class="LineNr">437 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name << <span class="Constant">" is "</span> << 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> << end<span class="Delimiter">();</span> +<span id="L437" class="LineNr">437 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name << <span class="Constant">" is "</span> << 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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L438" class="LineNr">438 </span> <span class="Delimiter">}</span> -<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 < 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 id="L440" class="LineNr">440 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" product: "</span> << 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> << end<span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L440" class="LineNr">440 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" product: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><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 href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span id="L443" class="LineNr">443 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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> <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> -<span id="L446" class="LineNr">446 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name << <span class="Constant">" is "</span> << 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> << end<span class="Delimiter">();</span> +<span id="L446" class="LineNr">446 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of "</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name << <span class="Constant">" is "</span> << 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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L447" class="LineNr">447 </span> <span class="Delimiter">}</span> <span id="L448" class="LineNr">448 </span> <span class="Delimiter">}</span> <span id="L449" class="LineNr">449 </span><span class="Delimiter">}</span> @@ -514,7 +514,7 @@ if ('onhashchange' in window) { <span id="L452" class="LineNr">452 </span><span class="Comment">//: in the header.</span> <span id="L453" class="LineNr">453 </span> <span id="L454" class="LineNr">454 </span><span class="Delimiter">:(scenario return_based_on_header)</span> -<span id="L455" class="LineNr">455 </span><span class="muRecipe">def</span> main [ +<span id="L455" class="LineNr">455 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L456" class="LineNr">456 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L457" class="LineNr">457 </span>] <span id="L458" class="LineNr">458 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -> </span>z:num [ @@ -529,20 +529,20 @@ if ('onhashchange' in window) { <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> <span id="L468" class="LineNr">468 </span> <span id="L469" class="LineNr">469 </span><span class="Delimiter">:(code)</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L471" class="LineNr">471 </span> recipe& caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<span id="L473" class="LineNr">473 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- fill in return ingredients from header for recipe "</span> << caller_recipe<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < 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 id="L473" class="LineNr">473 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- fill in return ingredients from header for <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller_recipe<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L475" class="LineNr">475 </span> instruction& inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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">"reply"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"return"</span><span class="Delimiter">)</span> <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> <span id="L478" class="LineNr">478 </span> <span class="Delimiter">}</span> <span id="L479" class="LineNr">479 </span> <span class="Comment">// fall through return</span> <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> -<span id="L481" class="LineNr">481 </span> <span class="Normal">const</span> instruction& 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 id="L481" class="LineNr">481 </span> <span class="Normal">const</span> instruction& final_instruction = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 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">"reply"</span> && final_instruction<span class="Delimiter">.</span>name != <span class="Constant">"return"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L483" class="LineNr">483 </span> instruction inst<span class="Delimiter">;</span> +<span id="L483" class="LineNr">483 </span> <a href='010vm.cc.html#L32'>instruction</a> inst<span class="Delimiter">;</span> <span id="L484" class="LineNr">484 </span> inst<span class="Delimiter">.</span>name = <span class="Constant">"return"</span><span class="Delimiter">;</span> <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> <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> @@ -552,9 +552,9 @@ if ('onhashchange' in window) { <span id="L490" class="LineNr">490 </span><span class="Normal">void</span> add_header_products<span class="Delimiter">(</span>instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L491" class="LineNr">491 </span> assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"reply"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"return"</span><span class="Delimiter">);</span> <span id="L492" class="LineNr">492 </span> <span class="Comment">// collect any products with the same names as ingredients</span> -<span id="L493" class="LineNr">493 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < 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 id="L493" class="LineNr">493 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L494" class="LineNr">494 </span> <span class="Comment">// if the ingredient is missing, add it from the header</span> -<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> +<span id="L495" class="LineNr">495 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> == i<span class="Delimiter">)</span> <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> <span id="L497" class="LineNr">497 </span> <span class="Comment">// if it's missing /same_as_ingredient, try to fill it in</span> <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> && !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">"same_as_ingredient"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> @@ -566,7 +566,7 @@ if ('onhashchange' in window) { <span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span> <span id="L505" class="LineNr">505 </span> <span id="L506" class="LineNr">506 </span><span class="Delimiter">:(scenario explicit_return_ignores_header)</span> -<span id="L507" class="LineNr">507 </span><span class="muRecipe">def</span> main [ +<span id="L507" class="LineNr">507 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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 <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L509" class="LineNr">509 </span>] <span id="L510" class="LineNr">510 </span><span class="muRecipe">def</span> add2 a:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -> </span>y:num<span class="Delimiter">,</span> z:num [ @@ -580,7 +580,7 @@ if ('onhashchange' in window) { <span id="L518" class="LineNr">518 </span><span class="traceContains">+mem: storing -2 in location 2</span> <span id="L519" class="LineNr">519 </span> <span id="L520" class="LineNr">520 </span><span class="Delimiter">:(scenario return_on_fallthrough_based_on_header)</span> -<span id="L521" class="LineNr">521 </span><span class="muRecipe">def</span> main [ +<span id="L521" class="LineNr">521 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L522" class="LineNr">522 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L523" class="LineNr">523 </span>] <span id="L524" class="LineNr">524 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -> </span>z:num [ @@ -588,11 +588,11 @@ if ('onhashchange' in window) { <span id="L526" class="LineNr">526 </span> load-ingredients <span id="L527" class="LineNr">527 </span> z<span class="Special"> <- </span>add x<span class="Delimiter">,</span> y <span id="L528" class="LineNr">528 </span>] -<span id="L529" class="LineNr">529 </span><span class="traceContains">+transform: instruction: return {z: "number"}</span> +<span id="L529" class="LineNr">529 </span><span class="traceContains">+transform: <a href='010vm.cc.html#L32'>instruction</a>: return {z: "number"}</span> <span id="L530" class="LineNr">530 </span><span class="traceContains">+mem: storing 8 in location 1</span> <span id="L531" class="LineNr">531 </span> <span id="L532" class="LineNr">532 </span><span class="Delimiter">:(scenario return_on_fallthrough_already_exists)</span> -<span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> main [ +<span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L534" class="LineNr">534 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L535" class="LineNr">535 </span>] <span id="L536" class="LineNr">536 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -> </span>z:num [ @@ -601,12 +601,12 @@ if ('onhashchange' in window) { <span id="L539" class="LineNr">539 </span> z<span class="Special"> <- </span>add x<span class="Delimiter">,</span> y <span class="Comment"># no type for z</span> <span id="L540" class="LineNr">540 </span> <span class="Identifier">return</span> z <span id="L541" class="LineNr">541 </span>] -<span id="L542" class="LineNr">542 </span><span class="traceContains">+transform: instruction: return {z: ()}</span> -<span id="L543" class="LineNr">543 </span><span class="traceAbsent">-transform: instruction: return z:num</span> +<span id="L542" class="LineNr">542 </span><span class="traceContains">+transform: <a href='010vm.cc.html#L32'>instruction</a>: return {z: ()}</span> +<span id="L543" class="LineNr">543 </span><span class="traceAbsent">-transform: <a href='010vm.cc.html#L32'>instruction</a>: return z:num</span> <span id="L544" class="LineNr">544 </span><span class="traceContains">+mem: storing 8 in location 1</span> <span id="L545" class="LineNr">545 </span> <span id="L546" class="LineNr">546 </span><span class="Delimiter">:(scenario return_after_conditional_return_based_on_header)</span> -<span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> main [ +<span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L548" class="LineNr">548 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>add2 <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L549" class="LineNr">549 </span>] <span id="L550" class="LineNr">550 </span><span class="muRecipe">def</span> add2 x:num<span class="Delimiter">,</span> y:num<span class="muRecipe"> -> </span>z:num [ @@ -619,7 +619,7 @@ if ('onhashchange' in window) { <span id="L557" class="LineNr">557 </span> <span id="L558" class="LineNr">558 </span><span class="Delimiter">:(scenario recipe_headers_perform_same_ingredient_check)</span> <span id="L559" class="LineNr">559 </span><span class="Special">% Hide_errors = true;</span> -<span id="L560" class="LineNr">560 </span><span class="muRecipe">def</span> main [ +<span id="L560" class="LineNr">560 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L561" class="LineNr">561 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L562" class="LineNr">562 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L563" class="LineNr">563 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>add2 <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -628,48 +628,48 @@ if ('onhashchange' in window) { <span id="L566" class="LineNr">566 </span> local-scope <span id="L567" class="LineNr">567 </span> load-ingredients <span id="L568" class="LineNr">568 </span>] -<span id="L569" class="LineNr">569 </span><span class="traceContains">+error: main: '3:num <- add2 1:num, 2:num' should write to '1:num' rather than '3:num'</span> +<span id="L569" class="LineNr">569 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: '3:num <- add2 1:num, 2:num' should write to '1:num' rather than '3:num'</span> <span id="L570" class="LineNr">570 </span> <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> <span id="L572" class="LineNr">572 </span><span class="Comment">//: ingredients, and returning a single number.</span> <span id="L573" class="LineNr">573 </span> <span id="L574" class="LineNr">574 </span><span class="Delimiter">:(scenario recipe_header_ingredients_constrained_for_main)</span> <span id="L575" class="LineNr">575 </span><span class="Special">% Hide_errors = true;</span> -<span id="L576" class="LineNr">576 </span><span class="muRecipe">def</span> main x:num [ +<span id="L576" class="LineNr">576 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> x:num [ <span id="L577" class="LineNr">577 </span>] -<span id="L578" class="LineNr">578 </span><span class="traceContains">+error: ingredients of recipe 'main' must all be text (address:array:character)</span> +<span id="L578" class="LineNr">578 </span><span class="traceContains">+error: ingredients of <a href='010vm.cc.html#L19'>recipe</a> 'main' must all be text (address:array:character)</span> <span id="L579" class="LineNr">579 </span> <span id="L580" class="LineNr">580 </span><span class="Delimiter">:(scenario recipe_header_products_constrained_for_main)</span> <span id="L581" class="LineNr">581 </span><span class="Special">% Hide_errors = true;</span> -<span id="L582" class="LineNr">582 </span><span class="muRecipe">def</span> main<span class="muRecipe"> -> </span>x:text [ +<span id="L582" class="LineNr">582 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a><span class="muRecipe"> -> </span>x:text [ <span id="L583" class="LineNr">583 </span>] -<span id="L584" class="LineNr">584 </span><span class="traceContains">+error: recipe 'main' must return at most a single product, a number</span> +<span id="L584" class="LineNr">584 </span><span class="traceContains">+error: <a href='010vm.cc.html#L19'>recipe</a> 'main' must return at most a single product, a number</span> <span id="L585" class="LineNr">585 </span> <span id="L586" class="LineNr">586 </span><span class="Delimiter">:(scenario recipe_header_products_constrained_for_main_2)</span> <span id="L587" class="LineNr">587 </span><span class="Special">% Hide_errors = true;</span> -<span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> main<span class="muRecipe"> -> </span>x:num<span class="Delimiter">,</span> y:num [ +<span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a><span class="muRecipe"> -> </span>x:num<span class="Delimiter">,</span> y:num [ <span id="L589" class="LineNr">589 </span>] -<span id="L590" class="LineNr">590 </span><span class="traceContains">+error: recipe 'main' must return at most a single product, a number</span> +<span id="L590" class="LineNr">590 </span><span class="traceContains">+error: <a href='010vm.cc.html#L19'>recipe</a> 'main' must return at most a single product, a number</span> <span id="L591" class="LineNr">591 </span> <span id="L592" class="LineNr">592 </span><span class="Delimiter">:(after "Transform.push_back(expand_type_abbreviations)")</span> <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> <span id="L594" class="LineNr">594 </span><span class="Delimiter">:(code)</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L596" class="LineNr">596 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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">"main"</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <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> -<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">"x:address:array:character"</span><span class="Delimiter">);</span> -<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 < 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 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">"x:<a href='043space.cc.html#L76'>address</a>:array:character"</span><span class="Delimiter">);</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L602" class="LineNr">602 </span> raise << <span class="Constant">"ingredients of recipe 'main' must all be text (address:array:character)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L602" class="LineNr">602 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"ingredients of <a href='010vm.cc.html#L19'>recipe</a> 'main' must all be text (address:array:character)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L603" class="LineNr">603 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L604" class="LineNr">604 </span> <span class="Delimiter">}</span> <span id="L605" class="LineNr">605 </span> <span class="Delimiter">}</span> -<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> +<span id="L606" class="LineNr">606 </span> <span class="Normal">int</span> nprod = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> <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">"x:number"</span><span class="Delimiter">);</span> <span id="L608" class="LineNr">608 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>nprod > <span class="Constant">1</span> <span id="L609" class="LineNr">609 </span> || <span class="Delimiter">(</span>nprod == <span class="Constant">1</span> && !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> -<span id="L610" class="LineNr">610 </span> raise << <span class="Constant">"recipe 'main' must return at most a single product, a number</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L610" class="LineNr">610 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"recipe 'main' must return at most a single product, a number</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L611" class="LineNr">611 </span> <span class="Delimiter">}</span> <span id="L612" class="LineNr">612 </span><span class="Delimiter">}</span> <span id="L613" class="LineNr">613 </span> diff --git a/html/054static_dispatch.cc.html b/html/054static_dispatch.cc.html index 28b84291..aa646652 100644 --- a/html/054static_dispatch.cc.html +++ b/html/054static_dispatch.cc.html @@ -64,7 +64,7 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Comment">//: names like 'print' or 'length' in many mutually extensible ways.</span> <span id="L4" class="LineNr"> 4 </span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(scenario static_dispatch)</span> -<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [ +<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L7" class="LineNr"> 7 </span> <span class="Constant">7</span>:num/<span class="Special">raw <- </span>test <span class="Constant">3</span> <span id="L8" class="LineNr"> 8 </span>] <span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -> </span>z:num [ @@ -81,7 +81,7 @@ if ('onhashchange' in window) { <span id="L20" class="LineNr"> 20 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L21" class="LineNr"> 21 </span>map<string<span class="Delimiter">,</span> vector<recipe_ordinal> > Recipe_variants<span class="Delimiter">;</span> <span id="L22" class="LineNr"> 22 </span><span class="Delimiter">:(before "End One-time Setup")</span> -<span id="L23" class="LineNr"> 23 </span>put<span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">,</span> vector<recipe_ordinal><span class="Delimiter">());</span> <span class="Comment">// since we manually added main to Recipe_ordinal</span> +<span id="L23" class="LineNr"> 23 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">,</span> vector<recipe_ordinal><span class="Delimiter">());</span> <span class="Comment">// since we manually added main to Recipe_ordinal</span> <span id="L24" class="LineNr"> 24 </span> <span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L26" class="LineNr"> 26 </span>map<string<span class="Delimiter">,</span> vector<recipe_ordinal> > Recipe_variants_snapshot<span class="Delimiter">;</span> @@ -93,30 +93,30 @@ if ('onhashchange' in window) { <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before "End Load Recipe Header(result)")</span> <span id="L33" class="LineNr"> 33 </span><span class="Comment">// there can only ever be one variant for main</span> <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">"main"</span> && 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 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> +<span id="L35" class="LineNr"> 35 </span> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">);</span> <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> -<span id="L37" class="LineNr"> 37 </span> string new_name = matching_variant_name<span class="Delimiter">(</span>result<span class="Delimiter">);</span> +<span id="L37" class="LineNr"> 37 </span> string new_name = <a href='054static_dispatch.cc.html#L56'>matching_variant_name</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span> <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> <span id="L39" class="LineNr"> 39 </span> <span class="Comment">// variant doesn't already exist</span> -<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> -<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> -<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> +<span id="L40" class="LineNr"> 40 </span> new_name = <a href='054static_dispatch.cc.html#L111'>next_unused_recipe_name</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<span id="L41" class="LineNr"> 41 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span> +<span id="L42" class="LineNr"> 42 </span> <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L43" class="LineNr"> 43 </span> <span class="Delimiter">}</span> -<span id="L44" class="LineNr"> 44 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"switching "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" to "</span> << new_name << end<span class="Delimiter">();</span> +<span id="L44" class="LineNr"> 44 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"load"</span><span class="Delimiter">)</span> << <span class="Constant">"switching "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" to "</span> << new_name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L45" class="LineNr"> 45 </span> result<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span> <span id="L46" class="LineNr"> 46 </span> result<span class="Delimiter">.</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L47" class="LineNr"> 47 </span> <span class="Delimiter">}</span> <span id="L48" class="LineNr"> 48 </span><span class="Delimiter">}</span> <span id="L49" class="LineNr"> 49 </span><span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L50" class="LineNr"> 50 </span> <span class="Comment">// save first variant</span> -<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> -<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> +<span id="L51" class="LineNr"> 51 </span> <a href='001help.cc.html#L218'>put</a><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 id="L52" class="LineNr"> 52 </span> <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L53" class="LineNr"> 53 </span><span class="Delimiter">}</span> <span id="L54" class="LineNr"> 54 </span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(code)</span> -<span id="L56" class="LineNr"> 56 </span>string matching_variant_name<span class="Delimiter">(</span><span class="Normal">const</span> recipe& rr<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L57" class="LineNr"> 57 </span> <span class="Normal">const</span> vector<recipe_ordinal>& 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 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 < SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L56" class="LineNr"> 56 </span>string <a href='054static_dispatch.cc.html#L56'>matching_variant_name</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& rr<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L57" class="LineNr"> 57 </span> <span class="Normal">const</span> vector<recipe_ordinal>& variants = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Recipe_variants<span class="Delimiter">,</span> rr<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L60" class="LineNr"> 60 </span> <span class="Normal">const</span> recipe& 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 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> @@ -125,16 +125,16 @@ if ('onhashchange' in window) { <span id="L64" class="LineNr"> 64 </span> <span class="Identifier">return</span> <span class="Constant">""</span><span class="Delimiter">;</span> <span id="L65" class="LineNr"> 65 </span><span class="Delimiter">}</span> <span id="L66" class="LineNr"> 66 </span> -<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& r1<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& r2<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<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> -<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 < SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L67" class="LineNr"> 67 </span><span class="Normal">bool</span> <a href='054static_dispatch.cc.html#L67'>all_reagents_match</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& r1<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& r2<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L68" class="LineNr"> 68 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><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 id="L69" class="LineNr"> 69 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r1<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> <span id="L74" class="LineNr"> 74 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L75" class="LineNr"> 75 </span> <span class="Delimiter">}</span> -<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 < SIZE<span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r1<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> @@ -160,16 +160,16 @@ if ('onhashchange' in window) { <span id="L99" class="LineNr"> 99 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-></span>name == <span class="Constant">"literal"</span> && b<span class="Delimiter">-></span>name == <span class="Constant">"literal"</span><span class="Delimiter">)</span> <span id="L100" class="LineNr">100 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L101" class="LineNr">101 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-></span>name == <span class="Constant">"literal"</span><span class="Delimiter">)</span> -<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span> +<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L103" class="LineNr">103 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>b<span class="Delimiter">-></span>name == <span class="Constant">"literal"</span><span class="Delimiter">)</span> -<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span> +<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L105" class="LineNr">105 </span> <span class="Identifier">return</span> a<span class="Delimiter">-></span>name == b<span class="Delimiter">-></span>name<span class="Delimiter">;</span> <span id="L106" class="LineNr">106 </span> <span class="Delimiter">}</span> <span id="L107" class="LineNr">107 </span> <span class="Identifier">return</span> deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">-></span>left<span class="Delimiter">,</span> b<span class="Delimiter">-></span>left<span class="Delimiter">)</span> <span id="L108" class="LineNr">108 </span> && deeply_equal_type_names<span class="Delimiter">(</span>a<span class="Delimiter">-></span>right<span class="Delimiter">,</span> b<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L109" class="LineNr">109 </span><span class="Delimiter">}</span> <span id="L110" class="LineNr">110 </span> -<span id="L111" class="LineNr">111 </span>string next_unused_recipe_name<span class="Delimiter">(</span><span class="Normal">const</span> string& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L111" class="LineNr">111 </span>string <a href='054static_dispatch.cc.html#L111'>next_unused_recipe_name</a><span class="Delimiter">(</span><span class="Normal">const</span> string& recipe_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L113" class="LineNr">113 </span> ostringstream out<span class="Delimiter">;</span> <span id="L114" class="LineNr">114 </span> out << recipe_name << <span class="Constant">'_'</span> << i<span class="Delimiter">;</span> @@ -182,7 +182,7 @@ if ('onhashchange' in window) { <span id="L121" class="LineNr">121 </span><span class="Comment">//: call with the most suitable variant.</span> <span id="L122" class="LineNr">122 </span> <span id="L123" class="LineNr">123 </span><span class="Delimiter">:(scenario static_dispatch_picks_most_similar_variant)</span> -<span id="L124" class="LineNr">124 </span><span class="muRecipe">def</span> main [ +<span id="L124" class="LineNr">124 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L125" class="LineNr">125 </span> <span class="Constant">7</span>:num/<span class="Special">raw <- </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 id="L126" class="LineNr">126 </span>] <span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -> </span>z:num [ @@ -195,14 +195,14 @@ if ('onhashchange' in window) { <span id="L134" class="LineNr">134 </span> <span id="L135" class="LineNr">135 </span><span class="Comment">//: support recipe headers in a previous transform to fill in missing types</span> <span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before "End check_or_set_invalid_types")</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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">"recipe header ingredient"</span><span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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">"recipe header product"</span><span class="Delimiter">);</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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> <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">"recipe header ingredient"</span><span class="Delimiter">);</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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> <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">"recipe header product"</span><span class="Delimiter">);</span> <span id="L141" class="LineNr">141 </span> <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> <span id="L143" class="LineNr">143 </span><span class="Delimiter">:(after "Transform.push_back(transform_names)")</span> -<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> +<span id="L144" class="LineNr">144 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='054static_dispatch.cc.html#L156'>resolve_ambiguous_calls</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L145" class="LineNr">145 </span> <span id="L146" class="LineNr">146 </span><span class="Comment">//: In a later layer we'll introduce recursion in resolve_ambiguous_calls, by</span> <span id="L147" class="LineNr">147 </span><span class="Comment">//: having it generate code for shape-shifting recipes and then transform such</span> @@ -214,14 +214,14 @@ if ('onhashchange' in window) { <span id="L153" class="LineNr">153 </span>list<call> Resolve_stack<span class="Delimiter">;</span> <span id="L154" class="LineNr">154 </span> <span id="L155" class="LineNr">155 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L156" class="LineNr">156 </span><span class="Normal">void</span> <a href='054static_dispatch.cc.html#L156'>resolve_ambiguous_calls</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L157" class="LineNr">157 </span> recipe& caller_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L158" class="LineNr">158 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- resolve ambiguous calls for recipe "</span> << caller_recipe<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < 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> +<span id="L158" class="LineNr">158 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- resolve ambiguous calls for <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller_recipe<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L160" class="LineNr">160 </span> instruction& inst = caller_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <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> -<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> -<span id="L163" class="LineNr">163 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction "</span> << inst<span class="Delimiter">.</span>original_string << end<span class="Delimiter">();</span> +<span id="L162" class="LineNr">162 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='054static_dispatch.cc.html#L370'>non_ghost_size</a><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><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> +<span id="L163" class="LineNr">163 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"instruction "</span> << inst<span class="Delimiter">.</span>original_string << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <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> <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> @@ -238,11 +238,11 @@ if ('onhashchange' in window) { <span id="L177" class="LineNr">177 </span> vector<recipe_ordinal> candidates<span class="Delimiter">;</span> <span id="L178" class="LineNr">178 </span> <span id="L179" class="LineNr">179 </span> <span class="Comment">// Static Dispatch Phase 1</span> -<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> +<span id="L180" class="LineNr">180 </span> candidates = <a href='054static_dispatch.cc.html#L225'>strictly_matching_variants</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span> <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> <span id="L182" class="LineNr">182 </span> <span id="L183" class="LineNr">183 </span> <span class="Comment">// Static Dispatch Phase 2</span> -<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> +<span id="L184" class="LineNr">184 </span> candidates = <a href='054static_dispatch.cc.html#L254'>strictly_matching_variants_except_literal_zero_against_address</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span> <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> <span id="L186" class="LineNr">186 </span> <span id="L187" class="LineNr">187 </span> <span class="Comment">// Static Dispatch Phase 3</span> @@ -250,31 +250,31 @@ if ('onhashchange' in window) { <span id="L189" class="LineNr">189 </span> <span class="Comment">// End Static Dispatch Phase 3</span> <span id="L190" class="LineNr">190 </span> <span id="L191" class="LineNr">191 </span> <span class="Comment">// Static Dispatch Phase 4</span> -<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> +<span id="L192" class="LineNr">192 </span> candidates = <a href='054static_dispatch.cc.html#L289'>strictly_matching_variants_except_literal_against_address_or_boolean</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span> <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> <span id="L194" class="LineNr">194 </span> <span id="L195" class="LineNr">195 </span> <span class="Comment">// Static Dispatch Phase 5</span> -<span id="L196" class="LineNr">196 </span> candidates = matching_variants<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span> +<span id="L196" class="LineNr">196 </span> candidates = <a href='054static_dispatch.cc.html#L324'>matching_variants</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span> <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> <span id="L198" class="LineNr">198 </span> <span id="L199" class="LineNr">199 </span> <span class="Comment">// error messages</span> -<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> >= MAX_PRIMITIVE_RECIPES<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// we currently don't check types for primitive variants</span> -<span id="L201" class="LineNr">201 </span> raise << maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"failed to find a matching call for '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L202" class="LineNr">202 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>list<call>::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 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> >= <a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// we currently don't check types for primitive variants</span> +<span id="L201" class="LineNr">201 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"failed to find a matching call for '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L202" class="LineNr">202 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>list<call>::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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L203" class="LineNr">203 </span> <span class="Normal">const</span> recipe& specializer_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> p<span class="Delimiter">-></span>running_recipe<span class="Delimiter">);</span> <span id="L204" class="LineNr">204 </span> <span class="Normal">const</span> instruction& specializer_inst = specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>p<span class="Delimiter">-></span>running_step_index<span class="Delimiter">);</span> <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">"interactive"</span><span class="Delimiter">)</span> -<span id="L206" class="LineNr">206 </span> raise << <span class="Constant">" (from '"</span> << to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> << <span class="Constant">"' in "</span> << specializer_recipe<span class="Delimiter">.</span>name << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" (from '"</span> << to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> << <span class="Constant">"' in "</span> << specializer_recipe<span class="Delimiter">.</span>name << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L207" class="LineNr">207 </span> <span class="Normal">else</span> -<span id="L208" class="LineNr">208 </span> raise << <span class="Constant">" (from '"</span> << to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L208" class="LineNr">208 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" (from '"</span> << to_original_string<span class="Delimiter">(</span>specializer_inst<span class="Delimiter">)</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L209" class="LineNr">209 </span> <span class="Comment">// One special-case to help with the rewrite_stash transform. (cross-layer)</span> <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">"stash_"</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L211" class="LineNr">211 </span> instruction stash_inst<span class="Delimiter">;</span> -<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> &stash_inst<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L211" class="LineNr">211 </span> <a href='010vm.cc.html#L32'>instruction</a> stash_inst<span class="Delimiter">;</span> +<span id="L212" class="LineNr">212 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='054static_dispatch.cc.html#L377'>next_stash</a><span class="Delimiter">(</span>*p<span class="Delimiter">,</span> &stash_inst<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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">"interactive"</span><span class="Delimiter">)</span> -<span id="L214" class="LineNr">214 </span> raise << <span class="Constant">" (part of '"</span> << stash_inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' in "</span> << specializer_recipe<span class="Delimiter">.</span>name << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L214" class="LineNr">214 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" (part of '"</span> << stash_inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' in "</span> << specializer_recipe<span class="Delimiter">.</span>name << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L215" class="LineNr">215 </span> <span class="Normal">else</span> -<span id="L216" class="LineNr">216 </span> raise << <span class="Constant">" (part of '"</span> << stash_inst<span class="Delimiter">.</span>original_string << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L216" class="LineNr">216 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" (part of '"</span> << stash_inst<span class="Delimiter">.</span>original_string << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L217" class="LineNr">217 </span> <span class="Delimiter">}</span> <span id="L218" class="LineNr">218 </span> <span class="Delimiter">}</span> <span id="L219" class="LineNr">219 </span> <span class="Delimiter">}</span> @@ -283,28 +283,28 @@ if ('onhashchange' in window) { <span id="L222" class="LineNr">222 </span><span class="Delimiter">}</span> <span id="L223" class="LineNr">223 </span> <span id="L224" class="LineNr">224 </span><span class="Comment">// phase 1</span> -<span id="L225" class="LineNr">225 </span>vector<recipe_ordinal> strictly_matching_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L225" class="LineNr">225 </span>vector<recipe_ordinal> <a href='054static_dispatch.cc.html#L225'>strictly_matching_variants</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L226" class="LineNr">226 </span> vector<recipe_ordinal> result<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L229" class="LineNr">229 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant (strict) "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << end<span class="Delimiter">();</span> -<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> +<span id="L229" class="LineNr">229 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant (strict) "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L230" class="LineNr">230 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='054static_dispatch.cc.html#L236'>all_header_reagents_strictly_match</a><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 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> <span id="L232" class="LineNr">232 </span> <span class="Delimiter">}</span> <span id="L233" class="LineNr">233 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L234" class="LineNr">234 </span><span class="Delimiter">}</span> <span id="L235" class="LineNr">235 </span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 id="L236" class="LineNr">236 </span><span class="Normal">bool</span> <a href='054static_dispatch.cc.html#L236'>all_header_reagents_strictly_match</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L239" class="LineNr">239 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"strict match failed: ingredient "</span> << i << end<span class="Delimiter">();</span> +<span id="L239" class="LineNr">239 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"strict match failed: ingredient "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L240" class="LineNr">240 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L241" class="LineNr">241 </span> <span class="Delimiter">}</span> <span id="L242" class="LineNr">242 </span> <span class="Delimiter">}</span> -<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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L246" class="LineNr">246 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"strict match failed: product "</span> << i << end<span class="Delimiter">();</span> +<span id="L246" class="LineNr">246 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"strict match failed: product "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L247" class="LineNr">247 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L248" class="LineNr">248 </span> <span class="Delimiter">}</span> <span id="L249" class="LineNr">249 </span> <span class="Delimiter">}</span> @@ -312,28 +312,28 @@ if ('onhashchange' in window) { <span id="L251" class="LineNr">251 </span><span class="Delimiter">}</span> <span id="L252" class="LineNr">252 </span> <span id="L253" class="LineNr">253 </span><span class="Comment">// phase 2</span> -<span id="L254" class="LineNr">254 </span>vector<recipe_ordinal> strictly_matching_variants_except_literal_zero_against_address<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L254" class="LineNr">254 </span>vector<recipe_ordinal> <a href='054static_dispatch.cc.html#L254'>strictly_matching_variants_except_literal_zero_against_address</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L255" class="LineNr">255 </span> vector<recipe_ordinal> result<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L258" class="LineNr">258 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant (strict except literal-zero-against-address) "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << end<span class="Delimiter">();</span> -<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> +<span id="L258" class="LineNr">258 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant (strict except literal-zero-against-address) "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L259" class="LineNr">259 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='054static_dispatch.cc.html#L265'>all_header_reagents_strictly_match_except_literal_zero_against_address</a><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 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> <span id="L261" class="LineNr">261 </span> <span class="Delimiter">}</span> <span id="L262" class="LineNr">262 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L263" class="LineNr">263 </span><span class="Delimiter">}</span> <span id="L264" class="LineNr">264 </span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 id="L265" class="LineNr">265 </span><span class="Normal">bool</span> <a href='054static_dispatch.cc.html#L265'>all_header_reagents_strictly_match_except_literal_zero_against_address</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L268" class="LineNr">268 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: ingredient "</span> << i << end<span class="Delimiter">();</span> +<span id="L268" class="LineNr">268 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: ingredient "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L269" class="LineNr">269 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L270" class="LineNr">270 </span> <span class="Delimiter">}</span> <span id="L271" class="LineNr">271 </span> <span class="Delimiter">}</span> -<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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L275" class="LineNr">275 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: product "</span> << i << end<span class="Delimiter">();</span> +<span id="L275" class="LineNr">275 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: product "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L276" class="LineNr">276 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L277" class="LineNr">277 </span> <span class="Delimiter">}</span> <span id="L278" class="LineNr">278 </span> <span class="Delimiter">}</span> @@ -347,63 +347,63 @@ if ('onhashchange' in window) { <span id="L286" class="LineNr">286 </span><span class="Delimiter">}</span> <span id="L287" class="LineNr">287 </span> <span id="L288" class="LineNr">288 </span><span class="Comment">// phase 4</span> -<span id="L289" class="LineNr">289 </span>vector<recipe_ordinal> strictly_matching_variants_except_literal_against_address_or_boolean<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L289" class="LineNr">289 </span>vector<recipe_ordinal> <a href='054static_dispatch.cc.html#L289'>strictly_matching_variants_except_literal_against_address_or_boolean</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L290" class="LineNr">290 </span> vector<recipe_ordinal> result<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L293" class="LineNr">293 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant (strict except literal-against-boolean) "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << end<span class="Delimiter">();</span> -<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> +<span id="L293" class="LineNr">293 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant (strict except literal-against-boolean) "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L294" class="LineNr">294 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='054static_dispatch.cc.html#L300'>all_header_reagents_strictly_match_except_literal_against_address_or_boolean</a><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 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> <span id="L296" class="LineNr">296 </span> <span class="Delimiter">}</span> <span id="L297" class="LineNr">297 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L298" class="LineNr">298 </span><span class="Delimiter">}</span> <span id="L299" class="LineNr">299 </span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 id="L300" class="LineNr">300 </span><span class="Normal">bool</span> <a href='054static_dispatch.cc.html#L300'>all_header_reagents_strictly_match_except_literal_against_address_or_boolean</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L303" class="LineNr">303 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: ingredient "</span> << i << end<span class="Delimiter">();</span> +<span id="L303" class="LineNr">303 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: ingredient "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L304" class="LineNr">304 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L305" class="LineNr">305 </span> <span class="Delimiter">}</span> <span id="L306" class="LineNr">306 </span> <span class="Delimiter">}</span> -<span id="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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L310" class="LineNr">310 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: product "</span> << i << end<span class="Delimiter">();</span> +<span id="L310" class="LineNr">310 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: product "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L311" class="LineNr">311 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L312" class="LineNr">312 </span> <span class="Delimiter">}</span> <span id="L313" class="LineNr">313 </span> <span class="Delimiter">}</span> <span id="L314" class="LineNr">314 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L315" class="LineNr">315 </span><span class="Delimiter">}</span> <span id="L316" class="LineNr">316 </span> -<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& to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& from<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> && is_mu_boolean<span class="Delimiter">(</span>to<span class="Delimiter">))</span> +<span id="L317" class="LineNr">317 </span><span class="Normal">bool</span> <a href='054static_dispatch.cc.html#L317'>types_strictly_match_except_literal_against_address_or_boolean</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& to<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& from<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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> && <a href='021check_instruction.cc.html#L199'>is_mu_boolean</a><span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span id="L319" class="LineNr">319 </span> <span class="Identifier">return</span> from<span class="Delimiter">.</span>name == <span class="Constant">"0"</span> || from<span class="Delimiter">.</span>name == <span class="Constant">"1"</span><span class="Delimiter">;</span> <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> <span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span> <span id="L322" class="LineNr">322 </span> <span id="L323" class="LineNr">323 </span><span class="Comment">// phase 5</span> -<span id="L324" class="LineNr">324 </span>vector<recipe_ordinal> matching_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L324" class="LineNr">324 </span>vector<recipe_ordinal> <a href='054static_dispatch.cc.html#L324'>matching_variants</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L325" class="LineNr">325 </span> vector<recipe_ordinal> result<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L328" class="LineNr">328 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << end<span class="Delimiter">();</span> -<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> +<span id="L328" class="LineNr">328 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking variant "</span> << i << <span class="Constant">": "</span> << header_label<span class="Delimiter">(</span>variants<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L329" class="LineNr">329 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='054static_dispatch.cc.html#L335'>all_header_reagents_match</a><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 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> <span id="L331" class="LineNr">331 </span> <span class="Delimiter">}</span> <span id="L332" class="LineNr">332 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L333" class="LineNr">333 </span><span class="Delimiter">}</span> <span id="L334" class="LineNr">334 </span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 id="L335" class="LineNr">335 </span><span class="Normal">bool</span> <a href='054static_dispatch.cc.html#L335'>all_header_reagents_match</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L338" class="LineNr">338 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: ingredient "</span> << i << end<span class="Delimiter">();</span> +<span id="L338" class="LineNr">338 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: ingredient "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L339" class="LineNr">339 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L340" class="LineNr">340 </span> <span class="Delimiter">}</span> <span id="L341" class="LineNr">341 </span> <span class="Delimiter">}</span> -<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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L345" class="LineNr">345 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: product "</span> << i << end<span class="Delimiter">();</span> +<span id="L345" class="LineNr">345 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"match failed: product "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L346" class="LineNr">346 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L347" class="LineNr">347 </span> <span class="Delimiter">}</span> <span id="L348" class="LineNr">348 </span> <span class="Delimiter">}</span> @@ -415,10 +415,10 @@ if ('onhashchange' in window) { <span id="L354" class="LineNr">354 </span> assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L355" class="LineNr">355 </span> <span class="Normal">int</span> min_score = <span class="Constant">999</span><span class="Delimiter">;</span> <span id="L356" class="LineNr">356 </span> <span class="Normal">int</span> min_index = <span class="Constant">0</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L358" class="LineNr">358 </span> <span class="Normal">const</span> recipe& 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 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> -<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> +<span id="L359" class="LineNr">359 </span> <span class="Normal">int</span> score = abs<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L360" class="LineNr">360 </span> + abs<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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> <span id="L361" class="LineNr">361 </span> assert<span class="Delimiter">(</span>score < <span class="Constant">999</span><span class="Delimiter">);</span> <span id="L362" class="LineNr">362 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>score < min_score<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L363" class="LineNr">363 </span> min_score = score<span class="Delimiter">;</span> @@ -428,17 +428,17 @@ if ('onhashchange' in window) { <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> <span id="L368" class="LineNr">368 </span><span class="Delimiter">}</span> <span id="L369" class="LineNr">369 </span> -<span id="L370" class="LineNr">370 </span><span class="Normal">int</span> non_ghost_size<span class="Delimiter">(</span>vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L370" class="LineNr">370 </span><span class="Normal">int</span> <a href='054static_dispatch.cc.html#L370'>non_ghost_size</a><span class="Delimiter">(</span>vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L371" class="LineNr">371 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <span id="L374" class="LineNr">374 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L375" class="LineNr">375 </span><span class="Delimiter">}</span> <span id="L376" class="LineNr">376 </span> -<span id="L377" class="LineNr">377 </span><span class="Normal">bool</span> next_stash<span class="Delimiter">(</span><span class="Normal">const</span> call& c<span class="Delimiter">,</span> instruction* stash_inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L377" class="LineNr">377 </span><span class="Normal">bool</span> <a href='054static_dispatch.cc.html#L377'>next_stash</a><span class="Delimiter">(</span><span class="Normal">const</span> call& c<span class="Delimiter">,</span> instruction* stash_inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L378" class="LineNr">378 </span> <span class="Normal">const</span> recipe& specializer_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> c<span class="Delimiter">.</span>running_recipe<span class="Delimiter">);</span> <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> -<span id="L380" class="LineNr">380 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>++index<span class="Delimiter">;</span> index < 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 id="L380" class="LineNr">380 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>++index<span class="Delimiter">;</span> index < <a href='001help.cc.html#L138'>SIZE</a><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 id="L381" class="LineNr">381 </span> <span class="Normal">const</span> instruction& inst = specializer_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <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">"stash"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L383" class="LineNr">383 </span> *stash_inst = inst<span class="Delimiter">;</span> @@ -449,7 +449,7 @@ if ('onhashchange' in window) { <span id="L388" class="LineNr">388 </span><span class="Delimiter">}</span> <span id="L389" class="LineNr">389 </span> <span id="L390" class="LineNr">390 </span><span class="Delimiter">:(scenario static_dispatch_disabled_in_recipe_without_variants)</span> -<span id="L391" class="LineNr">391 </span><span class="muRecipe">def</span> main [ +<span id="L391" class="LineNr">391 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L392" class="LineNr">392 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>test <span class="Constant">3</span> <span id="L393" class="LineNr">393 </span>] <span id="L394" class="LineNr">394 </span><span class="muRecipe">def</span> test [ @@ -466,7 +466,7 @@ if ('onhashchange' in window) { <span id="L405" class="LineNr">405 </span><span class="muRecipe">def</span> test [ <span id="L406" class="LineNr">406 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L407" class="LineNr">407 </span>] -<span id="L408" class="LineNr">408 </span><span class="traceContains">+error: redefining recipe test</span> +<span id="L408" class="LineNr">408 </span><span class="traceContains">+error: redefining <a href='010vm.cc.html#L19'>recipe</a> test</span> <span id="L409" class="LineNr">409 </span> <span id="L410" class="LineNr">410 </span><span class="Delimiter">:(scenario static_dispatch_disabled_on_headerless_definition_2)</span> <span id="L411" class="LineNr">411 </span><span class="Special">% Hide_errors = true;</span> @@ -476,10 +476,10 @@ if ('onhashchange' in window) { <span id="L415" class="LineNr">415 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -> </span>z:num [ <span id="L416" class="LineNr">416 </span> z<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L417" class="LineNr">417 </span>] -<span id="L418" class="LineNr">418 </span><span class="traceContains">+error: redefining recipe test</span> +<span id="L418" class="LineNr">418 </span><span class="traceContains">+error: redefining <a href='010vm.cc.html#L19'>recipe</a> test</span> <span id="L419" class="LineNr">419 </span> <span id="L420" class="LineNr">420 </span><span class="Delimiter">:(scenario static_dispatch_on_primitive_names)</span> -<span id="L421" class="LineNr">421 </span><span class="muRecipe">def</span> main [ +<span id="L421" class="LineNr">421 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L422" class="LineNr">422 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L423" class="LineNr">423 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L424" class="LineNr">424 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num @@ -499,7 +499,7 @@ if ('onhashchange' in window) { <span id="L438" class="LineNr">438 </span><span class="traceContains">+mem: storing 1 in location 6</span> <span id="L439" class="LineNr">439 </span> <span id="L440" class="LineNr">440 </span><span class="Delimiter">:(scenario static_dispatch_works_with_dummy_results_for_containers)</span> -<span id="L441" class="LineNr">441 </span><span class="muRecipe">def</span> main [ +<span id="L441" class="LineNr">441 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L442" class="LineNr">442 </span> _<span class="Special"> <- </span>test <span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">4</span> <span id="L443" class="LineNr">443 </span>] <span id="L444" class="LineNr">444 </span><span class="muRecipe">def</span> test a:num<span class="muRecipe"> -> </span>z:point [ @@ -515,7 +515,7 @@ if ('onhashchange' in window) { <span id="L454" class="LineNr">454 </span>$error: <span class="Constant">0</span> <span id="L455" class="LineNr">455 </span> <span id="L456" class="LineNr">456 </span><span class="Delimiter">:(scenario static_dispatch_works_with_compound_type_containing_container_defined_after_first_use)</span> -<span id="L457" class="LineNr">457 </span><span class="muRecipe">def</span> main [ +<span id="L457" class="LineNr">457 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L458" class="LineNr">458 </span> <span class="Normal">x</span>:&:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> <span id="L459" class="LineNr">459 </span> test x <span id="L460" class="LineNr">460 </span>] @@ -530,7 +530,7 @@ if ('onhashchange' in window) { <span id="L469" class="LineNr">469 </span>$error: <span class="Constant">0</span> <span id="L470" class="LineNr">470 </span> <span id="L471" class="LineNr">471 </span><span class="Delimiter">:(scenario static_dispatch_works_with_compound_type_containing_container_defined_after_second_use)</span> -<span id="L472" class="LineNr">472 </span><span class="muRecipe">def</span> main [ +<span id="L472" class="LineNr">472 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L473" class="LineNr">473 </span> <span class="Normal">x</span>:&:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> <span id="L474" class="LineNr">474 </span> test x <span id="L475" class="LineNr">475 </span>] @@ -545,7 +545,7 @@ if ('onhashchange' in window) { <span id="L484" class="LineNr">484 </span>$error: <span class="Constant">0</span> <span id="L485" class="LineNr">485 </span> <span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario static_dispatch_prefers_literals_to_be_numbers_rather_than_addresses)</span> -<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [ +<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L488" class="LineNr">488 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>foo <span class="Constant">0</span> <span id="L489" class="LineNr">489 </span>] <span id="L490" class="LineNr">490 </span><span class="muRecipe">def</span> foo x:&:num<span class="muRecipe"> -> </span>y:num [ @@ -558,7 +558,7 @@ if ('onhashchange' in window) { <span id="L497" class="LineNr">497 </span> <span id="L498" class="LineNr">498 </span><span class="Delimiter">:(scenario static_dispatch_on_non_literal_character_ignores_variant_with_numbers)</span> <span id="L499" class="LineNr">499 </span><span class="Special">% Hide_errors = true;</span> -<span id="L500" class="LineNr">500 </span><span class="muRecipe">def</span> main [ +<span id="L500" class="LineNr">500 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L501" class="LineNr">501 </span> local-scope <span id="L502" class="LineNr">502 </span> <span class="Normal">x</span>:<span class="Normal">char</span><span class="Special"> <- </span>copy <span class="Constant">10</span>/newline <span id="L503" class="LineNr">503 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo x @@ -567,11 +567,11 @@ if ('onhashchange' in window) { <span id="L506" class="LineNr">506 </span> load-ingredients <span id="L507" class="LineNr">507 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L508" class="LineNr">508 </span>] -<span id="L509" class="LineNr">509 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num/raw <- foo x'</span> +<span id="L509" class="LineNr">509 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: ingredient 0 has the wrong type at '1:num/raw <- foo x'</span> <span id="L510" class="LineNr">510 </span><span class="traceAbsent">-mem: storing 34 in location 1</span> <span id="L511" class="LineNr">511 </span> <span id="L512" class="LineNr">512 </span><span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_boolean_before_character)</span> -<span id="L513" class="LineNr">513 </span><span class="muRecipe">def</span> main [ +<span id="L513" class="LineNr">513 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L514" class="LineNr">514 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo <span class="Constant">0</span> <span class="Comment"># valid literal for boolean</span> <span id="L515" class="LineNr">515 </span>] <span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -> </span>y:num [ @@ -588,7 +588,7 @@ if ('onhashchange' in window) { <span id="L527" class="LineNr">527 </span><span class="traceContains">+mem: storing 35 in location 1</span> <span id="L528" class="LineNr">528 </span> <span id="L529" class="LineNr">529 </span><span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_character_when_out_of_boolean_range)</span> -<span id="L530" class="LineNr">530 </span><span class="muRecipe">def</span> main [ +<span id="L530" class="LineNr">530 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L531" class="LineNr">531 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo <span class="Constant">97</span> <span class="Comment"># not a valid literal for boolean</span> <span id="L532" class="LineNr">532 </span>] <span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -> </span>y:num [ @@ -605,7 +605,7 @@ if ('onhashchange' in window) { <span id="L544" class="LineNr">544 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L545" class="LineNr">545 </span> <span id="L546" class="LineNr">546 </span><span class="Delimiter">:(scenario static_dispatch_dispatches_literal_to_number_if_at_all_possible)</span> -<span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> main [ +<span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L548" class="LineNr">548 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo <span class="Constant">97</span> <span id="L549" class="LineNr">549 </span>] <span id="L550" class="LineNr">550 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -> </span>y:num [ @@ -622,22 +622,22 @@ if ('onhashchange' in window) { <span id="L561" class="LineNr">561 </span><span class="traceContains">+mem: storing 35 in location 1</span> <span id="L562" class="LineNr">562 </span> <span id="L563" class="LineNr">563 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L564" class="LineNr">564 </span>string header_label<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L566" class="LineNr">566 </span><span class="Delimiter">}</span> <span id="L567" class="LineNr">567 </span>string header_label<span class="Delimiter">(</span><span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L568" class="LineNr">568 </span> ostringstream out<span class="Delimiter">;</span> <span id="L569" class="LineNr">569 </span> out << <span class="Constant">"recipe "</span> << caller<span class="Delimiter">.</span>name<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<span id="L571" class="LineNr">571 </span> out << <span class="Constant">' '</span> << 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L571" class="LineNr">571 </span> out << <span class="Constant">' '</span> << <a href='028call_return.cc.html#L158'>to_string</a><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 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 << <span class="Constant">" ->"</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<span id="L574" class="LineNr">574 </span> out << <span class="Constant">' '</span> << 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L574" class="LineNr">574 </span> out << <span class="Constant">' '</span> << <a href='028call_return.cc.html#L158'>to_string</a><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 id="L575" class="LineNr">575 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L576" class="LineNr">576 </span><span class="Delimiter">}</span> <span id="L577" class="LineNr">577 </span> <span id="L578" class="LineNr">578 </span><span class="Delimiter">:(scenario reload_variant_retains_other_variants)</span> -<span id="L579" class="LineNr">579 </span><span class="muRecipe">def</span> main [ +<span id="L579" class="LineNr">579 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L580" class="LineNr">580 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L581" class="LineNr">581 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>foo <span class="Constant">1</span>:num <span id="L582" class="LineNr">582 </span>] @@ -661,7 +661,7 @@ if ('onhashchange' in window) { <span id="L600" class="LineNr">600 </span> <span id="L601" class="LineNr">601 </span><span class="Delimiter">:(scenario dispatch_errors_come_after_unknown_name_errors)</span> <span id="L602" class="LineNr">602 </span><span class="Special">% Hide_errors = true;</span> -<span id="L603" class="LineNr">603 </span><span class="muRecipe">def</span> main [ +<span id="L603" class="LineNr">603 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L604" class="LineNr">604 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>foo x <span id="L605" class="LineNr">605 </span>] <span id="L606" class="LineNr">606 </span><span class="muRecipe">def</span> foo a:num<span class="muRecipe"> -> </span>b:num [ @@ -674,16 +674,16 @@ if ('onhashchange' in window) { <span id="L613" class="LineNr">613 </span> load-ingredients <span id="L614" class="LineNr">614 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L615" class="LineNr">615 </span>] -<span id="L616" class="LineNr">616 </span><span class="traceContains">+error: main: missing type for 'x' in 'y:num <- foo x'</span> -<span id="L617" class="LineNr">617 </span><span class="traceContains">+error: main: failed to find a matching call for 'y:num <- foo x'</span> +<span id="L616" class="LineNr">616 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: missing type for 'x' in 'y:num <- foo x'</span> +<span id="L617" class="LineNr">617 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: failed to find a matching call for 'y:num <- foo x'</span> <span id="L618" class="LineNr">618 </span> <span id="L619" class="LineNr">619 </span><span class="Delimiter">:(scenario override_methods_with_type_abbreviations)</span> -<span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> main [ +<span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L621" class="LineNr">621 </span> local-scope <span id="L622" class="LineNr">622 </span> <span class="Normal">s</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L623" class="LineNr">623 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo s <span id="L624" class="LineNr">624 </span>] -<span id="L625" class="LineNr">625 </span><span class="muRecipe">def</span> foo a:address:array:character<span class="muRecipe"> -> </span>result:number [ +<span id="L625" class="LineNr">625 </span><span class="muRecipe">def</span> foo a:<a href='043space.cc.html#L76'>address</a>:array:character<span class="muRecipe"> -> </span>result:number [ <span id="L626" class="LineNr">626 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L627" class="LineNr">627 </span>] <span id="L628" class="LineNr">628 </span><span class="Comment"># identical to previous variant once you take type abbreviations into account</span> diff --git a/html/055shape_shifting_container.cc.html b/html/055shape_shifting_container.cc.html index 2ef1e5c9..40d5b834 100644 --- a/html/055shape_shifting_container.cc.html +++ b/html/055shape_shifting_container.cc.html @@ -96,13 +96,13 @@ if ('onhashchange' in window) { <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> <span id="L35" class="LineNr"> 35 </span> <span class="Normal">const</span> type_tree* result = t<span class="Delimiter">-></span>atom ? t : t<span class="Delimiter">-></span>left<span class="Delimiter">;</span> <span id="L36" class="LineNr"> 36 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> -<span id="L37" class="LineNr"> 37 </span> raise << <span class="Constant">"invalid type "</span> << to_string<span class="Delimiter">(</span>t<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L37" class="LineNr"> 37 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"invalid type "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>t<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L38" class="LineNr"> 38 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">}</span> <span id="L40" class="LineNr"> 40 </span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(scenario ill_formed_container)</span> <span id="L42" class="LineNr"> 42 </span><span class="Special">% Hide_errors = true;</span> -<span id="L43" class="LineNr"> 43 </span><span class="muRecipe">def</span> main [ +<span id="L43" class="LineNr"> 43 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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"> <- </span>copy <span class="Constant">0</span> <span id="L45" class="LineNr"> 45 </span>] <span id="L46" class="LineNr"> 46 </span><span class="Comment"># no crash</span> @@ -112,7 +112,7 @@ if ('onhashchange' in window) { <span id="L50" class="LineNr"> 50 </span> <span class="Normal">x</span>:_t <span id="L51" class="LineNr"> 51 </span> <span class="Normal">y</span>:num <span id="L52" class="LineNr"> 52 </span>] -<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> main [ +<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L54" class="LineNr"> 54 </span> <span class="Constant">1</span>:foo:num<span class="Special"> <- </span>merge <span class="Constant">12</span><span class="Delimiter">,</span> <span class="Constant">13</span> <span id="L55" class="LineNr"> 55 </span> <span class="Constant">3</span>:foo:point<span class="Special"> <- </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 id="L56" class="LineNr"> 56 </span>] @@ -128,7 +128,7 @@ if ('onhashchange' in window) { <span id="L66" class="LineNr"> 66 </span> <span class="Normal">x</span>:_a <span id="L67" class="LineNr"> 67 </span> <span class="Normal">y</span>:_b <span id="L68" class="LineNr"> 68 </span>] -<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> main [ +<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L70" class="LineNr"> 70 </span> <span class="Constant">1</span>:foo:num:<span class="Normal">bool</span><span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">1</span>/<span class="Constant">true</span> <span id="L71" class="LineNr"> 71 </span>] <span id="L72" class="LineNr"> 72 </span>$error: <span class="Constant">0</span> @@ -138,10 +138,10 @@ if ('onhashchange' in window) { <span id="L76" class="LineNr"> 76 </span> <span class="Normal">x</span>:_a <span id="L77" class="LineNr"> 77 </span> <span class="Normal">y</span>:_b <span id="L78" class="LineNr"> 78 </span>] -<span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> main [ +<span id="L79" class="LineNr"> 79 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L80" class="LineNr"> 80 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L81" class="LineNr"> 81 </span> <span class="Comment"># compound types for type ingredients</span> -<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"> <- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y +<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><a href='043space.cc.html#L76'>address</a> array character<span class="Delimiter">))}</span><span class="Special"> <- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y <span id="L83" class="LineNr"> 83 </span>] <span id="L84" class="LineNr"> 84 </span>$error: <span class="Constant">0</span> <span id="L85" class="LineNr"> 85 </span> @@ -152,9 +152,9 @@ if ('onhashchange' in window) { <span id="L90" class="LineNr"> 90 </span>] <span id="L91" class="LineNr"> 91 </span><span class="muData">container</span> bar:_a:_b [ <span id="L92" class="LineNr"> 92 </span> <span class="Comment"># dilated element</span> -<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> +<span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">{</span>data: <span class="Delimiter">(</span>foo _a <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> _b<span class="Delimiter">))}</span> <span id="L94" class="LineNr"> 94 </span>] -<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> main [ +<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L96" class="LineNr"> 96 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L97" class="LineNr"> 97 </span> <span class="Constant">2</span>:bar:num:@:<span class="Normal">char</span><span class="Special"> <- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y <span id="L98" class="LineNr"> 98 </span>] @@ -206,10 +206,10 @@ if ('onhashchange' in window) { <span id="L144" class="LineNr">144 </span> <span id="L145" class="LineNr">145 </span><span class="Delimiter">:(before "End container Name Refinements")</span> <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> -<span id="L147" class="LineNr">147 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"container has type ingredients; parsing"</span> << end<span class="Delimiter">();</span> +<span id="L147" class="LineNr">147 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"container has type ingredients; parsing"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L149" class="LineNr">149 </span> <span class="Comment">// error; skip rest of the container definition and continue</span> -<span id="L150" class="LineNr">150 </span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L150" class="LineNr">150 </span> <a href='016dilated_reagent.cc.html#L57'>slurp_balanced_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L151" class="LineNr">151 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L152" class="LineNr">152 </span> <span class="Delimiter">}</span> <span id="L153" class="LineNr">153 </span><span class="Delimiter">}</span> @@ -228,62 +228,62 @@ if ('onhashchange' in window) { <span id="L166" class="LineNr">166 </span> <span class="Normal">const</span> type_info& 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 id="L167" class="LineNr">167 </span> <span class="Comment">// we've already seen this container; make sure type ingredients match</span> <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> -<span id="L169" class="LineNr">169 </span> raise << <span class="Constant">"headers of "</span> << command << <span class="Constant">" '"</span> << name << <span class="Constant">"' must use identical type ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L169" class="LineNr">169 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"headers of "</span> << command << <span class="Constant">" '"</span> << name << <span class="Constant">"' must use identical type ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L170" class="LineNr">170 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L171" class="LineNr">171 </span> <span class="Delimiter">}</span> <span id="L172" class="LineNr">172 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L173" class="LineNr">173 </span> <span class="Delimiter">}</span> <span id="L174" class="LineNr">174 </span> <span class="Comment">// we haven't seen this container before</span> <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> -<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> -<span id="L177" class="LineNr">177 </span> type_info& info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span> +<span id="L176" class="LineNr">176 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L177" class="LineNr">177 </span> type_info& info = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span> <span id="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> <span id="L179" class="LineNr">179 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L180" class="LineNr">180 </span><span class="Delimiter">}</span> <span id="L181" class="LineNr">181 </span> <span id="L182" class="LineNr">182 </span><span class="Normal">bool</span> slurp_type_ingredients<span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> type_ordinal>& out<span class="Delimiter">,</span> <span class="Normal">const</span> string& container_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L183" class="LineNr">183 </span> <span class="Normal">int</span> next_type_ordinal = START_TYPE_INGREDIENTS<span class="Delimiter">;</span> -<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> +<span id="L184" class="LineNr">184 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="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> <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> -<span id="L187" class="LineNr">187 </span> raise << container_name << <span class="Constant">": empty type ingredients not permitted</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L187" class="LineNr">187 </span> <a href='003trace.cc.html#L178'>raise</a> << container_name << <span class="Constant">": empty type ingredients not permitted</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L188" class="LineNr">188 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L189" class="LineNr">189 </span> <span class="Delimiter">}</span> <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">"_"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L191" class="LineNr">191 </span> raise << container_name << <span class="Constant">": type ingredient '"</span> << curr << <span class="Constant">"' must begin with an underscore</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L191" class="LineNr">191 </span> <a href='003trace.cc.html#L178'>raise</a> << container_name << <span class="Constant">": type ingredient '"</span> << curr << <span class="Constant">"' must begin with an underscore</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L192" class="LineNr">192 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L193" class="LineNr">193 </span> <span class="Delimiter">}</span> -<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> -<span id="L195" class="LineNr">195 </span> raise << container_name << <span class="Constant">": can't repeat type ingredient name'"</span> << curr << <span class="Constant">"' in a single container definition</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L195" class="LineNr">195 </span> <a href='003trace.cc.html#L178'>raise</a> << container_name << <span class="Constant">": can't repeat type ingredient name'"</span> << curr << <span class="Constant">"' in a single container definition</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L196" class="LineNr">196 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L197" class="LineNr">197 </span> <span class="Delimiter">}</span> -<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> +<span id="L198" class="LineNr">198 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> next_type_ordinal++<span class="Delimiter">);</span> <span id="L199" class="LineNr">199 </span> <span class="Delimiter">}</span> <span id="L200" class="LineNr">200 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L201" class="LineNr">201 </span><span class="Delimiter">}</span> <span id="L202" class="LineNr">202 </span> <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<string<span class="Delimiter">,</span> type_ordinal>& a<span class="Delimiter">,</span> <span class="Normal">const</span> map<string<span class="Delimiter">,</span> type_ordinal>& b<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<span id="L205" class="LineNr">205 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> type_ordinal>::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 id="L204" class="LineNr">204 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>a<span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>b<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L205" class="LineNr">205 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> type_ordinal>::const_iterator p = a<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != a<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L207" class="LineNr">207 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>second != get<span class="Delimiter">(</span>b<span class="Delimiter">,</span> p<span class="Delimiter">-></span>first<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> <span id="L209" class="LineNr">209 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span> <span id="L211" class="LineNr">211 </span> -<span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before "End insert_container Special-cases")</span> +<span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L662'>insert_container</a> Special-cases")</span> <span id="L213" class="LineNr">213 </span><span class="Comment">// check for use of type ingredients</span> <span id="L214" class="LineNr">214 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L215" class="LineNr">215 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> <span id="L216" class="LineNr">216 </span><span class="Delimiter">}</span> <span id="L217" class="LineNr">217 </span><span class="Delimiter">:(code)</span> <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& type<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">"_"</span><span class="Delimiter">);</span> +<span id="L219" class="LineNr">219 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> <span class="Constant">"_"</span><span class="Delimiter">);</span> <span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span> <span id="L221" class="LineNr">221 </span> <span id="L222" class="LineNr">222 </span><span class="Delimiter">:(before "End Container Type Checks")</span> <span id="L223" class="LineNr">223 </span><span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>value >= START_TYPE_INGREDIENTS -<span id="L224" class="LineNr">224 </span> && <span class="Delimiter">(</span>type<span class="Delimiter">-></span>value - START_TYPE_INGREDIENTS<span class="Delimiter">)</span> < SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>type_ingredient_names<span class="Delimiter">))</span> +<span id="L224" class="LineNr">224 </span> && <span class="Delimiter">(</span>type<span class="Delimiter">-></span>value - START_TYPE_INGREDIENTS<span class="Delimiter">)</span> < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>type_ingredient_names<span class="Delimiter">))</span> <span id="L225" class="LineNr">225 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L226" class="LineNr">226 </span> <span id="L227" class="LineNr">227 </span><span class="Delimiter">:(scenario size_of_shape_shifting_exclusive_container)</span> @@ -291,7 +291,7 @@ if ('onhashchange' in window) { <span id="L229" class="LineNr">229 </span> <span class="Normal">x</span>:_t <span id="L230" class="LineNr">230 </span> <span class="Normal">y</span>:num <span id="L231" class="LineNr">231 </span>] -<span id="L232" class="LineNr">232 </span><span class="muRecipe">def</span> main [ +<span id="L232" class="LineNr">232 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L233" class="LineNr">233 </span> <span class="Constant">1</span>:foo:num<span class="Special"> <- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L234" class="LineNr">234 </span> <span class="Constant">3</span>:foo:point<span class="Special"> <- </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 id="L235" class="LineNr">235 </span> <span class="Constant">6</span>:foo:point<span class="Special"> <- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span> @@ -319,7 +319,7 @@ if ('onhashchange' in window) { <span id="L257" class="LineNr">257 </span> <span class="Normal">x</span>:_t <span id="L258" class="LineNr">258 </span> <span class="Normal">y</span>:num <span id="L259" class="LineNr">259 </span>] -<span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> main [ +<span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L261" class="LineNr">261 </span> <span class="Constant">1</span>:foo:point<span class="Special"> <- </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 id="L262" class="LineNr">262 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span> <span id="L263" class="LineNr">263 </span>] @@ -330,7 +330,7 @@ if ('onhashchange' in window) { <span id="L268" class="LineNr">268 </span> <span class="Normal">x</span>:_t <span id="L269" class="LineNr">269 </span> <span class="Normal">y</span>:num <span id="L270" class="LineNr">270 </span>] -<span id="L271" class="LineNr">271 </span><span class="muRecipe">def</span> main [ +<span id="L271" class="LineNr">271 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L272" class="LineNr">272 </span> <span class="Constant">1</span>:foo:point<span class="Special"> <- </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 id="L273" class="LineNr">273 </span> <span class="Constant">2</span>:point<span class="Special"> <- </span>get <span class="Constant">1</span>:foo:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span id="L274" class="LineNr">274 </span>] @@ -342,7 +342,7 @@ if ('onhashchange' in window) { <span id="L280" class="LineNr">280 </span> <span class="Normal">x</span>:_t <span id="L281" class="LineNr">281 </span> <span class="Normal">y</span>:num <span id="L282" class="LineNr">282 </span>] -<span id="L283" class="LineNr">283 </span><span class="muRecipe">def</span> main [ +<span id="L283" class="LineNr">283 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L284" class="LineNr">284 </span> <span class="Constant">1</span>:foo:&:point<span class="Special"> <- </span>merge <span class="Constant">34</span>/unsafe<span class="Delimiter">,</span> <span class="Constant">48</span> <span id="L285" class="LineNr">285 </span> <span class="Constant">3</span>:&:point<span class="Special"> <- </span>get <span class="Constant">1</span>:foo:&:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span id="L286" class="LineNr">286 </span>] @@ -357,7 +357,7 @@ if ('onhashchange' in window) { <span id="L295" class="LineNr">295 </span> <span class="Normal">x</span>:foo:point <span id="L296" class="LineNr">296 </span> <span class="Normal">y</span>:num <span id="L297" class="LineNr">297 </span>] -<span id="L298" class="LineNr">298 </span><span class="muRecipe">def</span> main [ +<span id="L298" class="LineNr">298 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L299" class="LineNr">299 </span> <span class="Constant">1</span>:bar<span class="Special"> <- </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 id="L300" class="LineNr">300 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:bar<span class="Delimiter">,</span> <span class="Constant">1:offset</span> <span id="L301" class="LineNr">301 </span>] @@ -368,15 +368,15 @@ if ('onhashchange' in window) { <span id="L306" class="LineNr">306 </span> <span class="Normal">x</span>:_a <span id="L307" class="LineNr">307 </span> <span class="Normal">y</span>:_b <span id="L308" class="LineNr">308 </span>] -<span id="L309" class="LineNr">309 </span><span class="muRecipe">def</span> main [ +<span id="L309" class="LineNr">309 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L310" class="LineNr">310 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] -<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"> <- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y -<span id="L312" class="LineNr">312 </span> <span class="Constant">3</span>:text<span class="Special"> <- </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 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><a href='043space.cc.html#L76'>address</a> array character<span class="Delimiter">))}</span><span class="Special"> <- </span>merge <span class="Constant">34</span>/x<span class="Delimiter">,</span> <span class="Constant">1</span>:text/y +<span id="L312" class="LineNr">312 </span> <span class="Constant">3</span>:text<span class="Special"> <- </span>get <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span>foo number <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> array character<span class="Delimiter">))},</span> <span class="Constant">y:offset</span> <span id="L313" class="LineNr">313 </span> <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">3</span>:text <span id="L314" class="LineNr">314 </span>] <span id="L315" class="LineNr">315 </span><span class="traceContains">+mem: storing 1 in location 4</span> <span id="L316" class="LineNr">316 </span> -<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before "End element_type Special-cases")</span> +<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L431'>element_type</a> Special-cases")</span> <span id="L318" class="LineNr">318 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> type<span class="Delimiter">,</span> info<span class="Delimiter">,</span> <span class="Constant">" while computing element type of container"</span><span class="Delimiter">);</span> <span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before "Compute Container Size(element, full_type)")</span> <span id="L320" class="LineNr">320 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> @@ -405,39 +405,39 @@ if ('onhashchange' in window) { <span id="L343" class="LineNr">343 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent& 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& info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L345" class="LineNr">345 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!caller_type<span class="Delimiter">-></span>right<span class="Delimiter">)</span> -<span id="L346" class="LineNr">346 </span> raise << <span class="Constant">"illegal type "</span> << names_to_string<span class="Delimiter">(</span>caller_type<span class="Delimiter">)</span> << <span class="Constant">" seems to be missing a type ingredient or three"</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L346" class="LineNr">346 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"illegal type "</span> << names_to_string<span class="Delimiter">(</span>caller_type<span class="Delimiter">)</span> << <span class="Constant">" seems to be missing a type ingredient or three"</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="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">-></span>right<span class="Delimiter">,</span> info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L348" class="LineNr">348 </span> <span class="Delimiter">}</span> <span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span> <span id="L350" class="LineNr">350 </span> <span id="L351" class="LineNr">351 </span><span class="Comment">// replace all type_ingredients in element_type with corresponding elements of callsite_type</span> -<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* 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& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L353" class="LineNr">353 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!callsite_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// error but it's already been raised above</span> <span id="L354" class="LineNr">354 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L355" class="LineNr">355 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L356" class="LineNr">356 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>element_type<span class="Delimiter">-></span>right == <span class="Constant">NULL</span> && is_type_ingredient<span class="Delimiter">(</span>element_type<span class="Delimiter">-></span>left<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L357" class="LineNr">357 </span> <span class="Normal">int</span> type_ingredient_index = to_type_ingredient_index<span class="Delimiter">(</span>element_type<span class="Delimiter">-></span>left<span class="Delimiter">);</span> +<span id="L356" class="LineNr">356 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>right == <span class="Constant">NULL</span> && is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L357" class="LineNr">357 </span> <span class="Normal">int</span> type_ingredient_index = to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">);</span> <span id="L358" class="LineNr">358 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>corresponding<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">,</span> is_final_type_ingredient<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">))-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L359" class="LineNr">359 </span> <span class="Comment">// replacing type ingredient at end of list, and replacement is a non-degenerate compound type -- (a b) but not (a)</span> -<span id="L360" class="LineNr">360 </span> replace_type_ingredient_at<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> 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 id="L360" class="LineNr">360 </span> replace_type_ingredient_at<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L361" class="LineNr">361 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L362" class="LineNr">362 </span> <span class="Delimiter">}</span> <span id="L363" class="LineNr">363 </span> <span class="Delimiter">}</span> -<span id="L364" class="LineNr">364 </span> replace_type_ingredients<span class="Delimiter">(</span>element_type<span class="Delimiter">-></span>left<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> -<span id="L365" class="LineNr">365 </span> replace_type_ingredients<span class="Delimiter">(</span>element_type<span class="Delimiter">-></span>right<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L364" class="LineNr">364 </span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L365" class="LineNr">365 </span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>right<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L366" class="LineNr">366 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L367" class="LineNr">367 </span> <span class="Delimiter">}</span> -<span id="L368" class="LineNr">368 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient<span class="Delimiter">(</span>element_type<span class="Delimiter">))</span> -<span id="L369" class="LineNr">369 </span> replace_type_ingredient_at<span class="Delimiter">(</span>to_type_ingredient_index<span class="Delimiter">(</span>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 id="L368" class="LineNr">368 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">))</span> +<span id="L369" class="LineNr">369 </span> replace_type_ingredient_at<span class="Delimiter">(</span>to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">),</span> <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span> <span id="L371" class="LineNr">371 </span> <span id="L372" class="LineNr">372 </span><span class="Normal">const</span> type_tree* corresponding<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> index<span class="Delimiter">,</span> <span class="Normal">bool</span> <span class="Normal">final</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">-></span>right<span class="Delimiter">,</span> --index<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L374" class="LineNr">374 </span> assert_for_now<span class="Delimiter">(</span>!curr<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L374" class="LineNr">374 </span> <a href='003trace.cc.html#L181'>assert_for_now</a><span class="Delimiter">(</span>!curr<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <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> <span id="L376" class="LineNr">376 </span> <span class="Identifier">return</span> <span class="Normal">final</span> ? curr : curr<span class="Delimiter">-></span>left<span class="Delimiter">;</span> <span id="L377" class="LineNr">377 </span> <span class="Delimiter">}</span> -<span id="L378" class="LineNr">378 </span> assert_for_now<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span> +<span id="L378" class="LineNr">378 </span> <a href='003trace.cc.html#L181'>assert_for_now</a><span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span> <span id="L379" class="LineNr">379 </span><span class="Delimiter">}</span> <span id="L380" class="LineNr">380 </span> <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> @@ -449,9 +449,9 @@ if ('onhashchange' in window) { <span id="L387" class="LineNr">387 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>value-START_TYPE_INGREDIENTS<span class="Delimiter">;</span> <span id="L388" class="LineNr">388 </span><span class="Delimiter">}</span> <span id="L389" class="LineNr">389 </span> -<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> replace_type_ingredient_at<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> type_tree* 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& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> replace_type_ingredient_at<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> type_tree* <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L391" class="LineNr">391 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_nth_type<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L392" class="LineNr">392 </span> raise << <span class="Constant">"illegal type "</span> << names_to_string<span class="Delimiter">(</span>callsite_type<span class="Delimiter">)</span> << <span class="Constant">" seems to be missing a type ingredient or three"</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L392" class="LineNr">392 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"illegal type "</span> << names_to_string<span class="Delimiter">(</span>callsite_type<span class="Delimiter">)</span> << <span class="Constant">" seems to be missing a type ingredient or three"</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L393" class="LineNr">393 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L394" class="LineNr">394 </span> <span class="Delimiter">}</span> <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> @@ -475,7 +475,7 @@ if ('onhashchange' in window) { <span id="L413" class="LineNr">413 </span> <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& container_info<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L415" class="LineNr">415 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> type_ordinal>::const_iterator p = container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> -<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> +<span id="L416" class="LineNr">416 </span> p != container_info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L417" class="LineNr">417 </span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L418" class="LineNr">418 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>second > 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 id="L419" class="LineNr">419 </span> <span class="Delimiter">}</span> @@ -489,8 +489,8 @@ if ('onhashchange' in window) { <span id="L427" class="LineNr">427 </span> <span class="Constant">" y:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L428" class="LineNr">428 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L429" class="LineNr">429 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:foo:point"</span><span class="Delimiter">);</span> -<span id="L430" class="LineNr">430 </span> reagent element = 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> -<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">"{x: </span><span class="cSpecial">\"</span><span class="Constant">point</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> +<span id="L430" class="LineNr">430 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L431" class="LineNr">431 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: </span><span class="cSpecial">\"</span><span class="Constant">point</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> <span id="L432" class="LineNr">432 </span><span class="Delimiter">}</span> <span id="L433" class="LineNr">433 </span> <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> @@ -501,8 +501,8 @@ if ('onhashchange' in window) { <span id="L439" class="LineNr">439 </span> <span class="Constant">" x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L440" class="LineNr">440 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L441" class="LineNr">441 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:bar:point"</span><span class="Delimiter">);</span> -<span id="L442" class="LineNr">442 </span> reagent element = 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> -<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">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">point</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> +<span id="L442" class="LineNr">442 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L443" class="LineNr">443 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">point</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L444" class="LineNr">444 </span><span class="Delimiter">}</span> <span id="L445" class="LineNr">445 </span> <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> @@ -512,9 +512,9 @@ if ('onhashchange' in window) { <span id="L450" class="LineNr">450 </span> <span class="Constant">"container bar:_elem [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L451" class="LineNr">451 </span> <span class="Constant">" x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L452" class="LineNr">452 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L453" class="LineNr">453 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:bar:address:array:character"</span><span class="Delimiter">);</span> -<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> -<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">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">address</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> +<span id="L453" class="LineNr">453 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:bar:<a href='043space.cc.html#L76'>address</a>:array:character"</span><span class="Delimiter">);</span> +<span id="L454" class="LineNr">454 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L455" class="LineNr">455 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L456" class="LineNr">456 </span><span class="Delimiter">}</span> <span id="L457" class="LineNr">457 </span> <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> @@ -525,8 +525,8 @@ if ('onhashchange' in window) { <span id="L463" class="LineNr">463 </span> <span class="Constant">" x:foo:_elem:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L464" class="LineNr">464 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L465" class="LineNr">465 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:bar:address"</span><span class="Delimiter">);</span> -<span id="L466" class="LineNr">466 </span> reagent element = 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> -<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">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">address</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> +<span id="L466" class="LineNr">466 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L467" class="LineNr">467 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L468" class="LineNr">468 </span><span class="Delimiter">}</span> <span id="L469" class="LineNr">469 </span> <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> @@ -535,10 +535,10 @@ if ('onhashchange' in window) { <span id="L473" class="LineNr">473 </span> <span class="Constant">" y:_b</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L474" class="LineNr">474 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L475" class="LineNr">475 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo number (address array character))}"</span><span class="Delimiter">);</span> -<span id="L476" class="LineNr">476 </span> reagent element1 = 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> -<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">"{x: </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> -<span id="L478" class="LineNr">478 </span> reagent element2 = 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> -<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">"{y: (</span><span class="cSpecial">\"</span><span class="Constant">address</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> +<span id="L476" class="LineNr">476 </span> reagent element1 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L477" class="LineNr">477 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">"{x: </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> +<span id="L478" class="LineNr">478 </span> reagent element2 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L479" class="LineNr">479 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">"{y: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L480" class="LineNr">480 </span><span class="Delimiter">}</span> <span id="L481" class="LineNr">481 </span> <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> @@ -546,8 +546,8 @@ if ('onhashchange' in window) { <span id="L484" class="LineNr">484 </span> <span class="Constant">" {x: (bar _a (address _b))}</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L485" class="LineNr">485 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L486" class="LineNr">486 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"f:foo:number:array:character"</span><span class="Delimiter">);</span> -<span id="L487" class="LineNr">487 </span> reagent element = 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> -<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">"(bar number (address array character))"</span><span class="Delimiter">);</span> +<span id="L487" class="LineNr">487 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L488" class="LineNr">488 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">),</span> <span class="Constant">"(bar number (address array character))"</span><span class="Delimiter">);</span> <span id="L489" class="LineNr">489 </span><span class="Delimiter">}</span> <span id="L490" class="LineNr">490 </span> <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> @@ -557,12 +557,12 @@ if ('onhashchange' in window) { <span id="L495" class="LineNr">495 </span> <span class="Constant">" z:_c</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L496" class="LineNr">496 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L497" class="LineNr">497 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo number (address array character) boolean)}"</span><span class="Delimiter">);</span> -<span id="L498" class="LineNr">498 </span> reagent element1 = 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> -<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">"{x: </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> -<span id="L500" class="LineNr">500 </span> reagent element2 = 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> -<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">"{y: (</span><span class="cSpecial">\"</span><span class="Constant">address</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> -<span id="L502" class="LineNr">502 </span> reagent element3 = 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> -<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">"{z: </span><span class="cSpecial">\"</span><span class="Constant">boolean</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> +<span id="L498" class="LineNr">498 </span> reagent element1 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L499" class="LineNr">499 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">"{x: </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> +<span id="L500" class="LineNr">500 </span> reagent element2 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L501" class="LineNr">501 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">"{y: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> +<span id="L502" class="LineNr">502 </span> reagent element3 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L503" class="LineNr">503 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element3<span class="Delimiter">),</span> <span class="Constant">"{z: </span><span class="cSpecial">\"</span><span class="Constant">boolean</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> <span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span> <span id="L505" class="LineNr">505 </span> <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> @@ -571,8 +571,8 @@ if ('onhashchange' in window) { <span id="L509" class="LineNr">509 </span> <span class="Constant">" value:_value</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L510" class="LineNr">510 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L511" class="LineNr">511 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo (address array character) number)}"</span><span class="Delimiter">);</span> -<span id="L512" class="LineNr">512 </span> reagent element = 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> -<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">"{key: (</span><span class="cSpecial">\"</span><span class="Constant">address</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> +<span id="L512" class="LineNr">512 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L513" class="LineNr">513 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{key: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L514" class="LineNr">514 </span><span class="Delimiter">}</span> <span id="L515" class="LineNr">515 </span> <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> @@ -585,8 +585,8 @@ if ('onhashchange' in window) { <span id="L523" class="LineNr">523 </span> <span class="Constant">" value:_value</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L524" class="LineNr">524 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L525" class="LineNr">525 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo_table (address array character) number)}"</span><span class="Delimiter">);</span> -<span id="L526" class="LineNr">526 </span> reagent element = 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> -<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">"{data: (</span><span class="cSpecial">\"</span><span class="Constant">address</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">foo_table_row</span><span class="cSpecial">\"</span><span class="Constant"> (</span><span class="cSpecial">\"</span><span class="Constant">address</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">) </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> +<span id="L526" class="LineNr">526 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L527" class="LineNr">527 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{data: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">foo_table_row</span><span class="cSpecial">\"</span><span class="Constant"> (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">) </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span> <span id="L529" class="LineNr">529 </span> <span id="L530" class="LineNr">530 </span><span class="Delimiter">:(code)</span> @@ -603,7 +603,7 @@ if ('onhashchange' in window) { <span id="L541" class="LineNr">541 </span> <span class="Normal">x</span>:_t <span id="L542" class="LineNr">542 </span> <span class="Normal">y</span>:num <span id="L543" class="LineNr">543 </span>] -<span id="L544" class="LineNr">544 </span><span class="muRecipe">def</span> main [ +<span id="L544" class="LineNr">544 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L545" class="LineNr">545 </span> <span class="Constant">10</span>:foo:point<span class="Special"> <- </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 id="L546" class="LineNr">546 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>get <span class="Constant">10</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span> <span id="L547" class="LineNr">547 </span>] @@ -618,12 +618,12 @@ if ('onhashchange' in window) { <span id="L556" class="LineNr">556 </span><span class="Delimiter">:(before "End compute_container_sizes Non-atom Special-cases")</span> <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> <span id="L558" class="LineNr">558 </span>type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<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> +<span id="L559" class="LineNr">559 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L561" class="LineNr">561 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L562" class="LineNr">562 </span><span class="Delimiter">}</span> -<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> -<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> +<span id="L563" class="LineNr">563 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L564" class="LineNr">564 </span> <a href='033exclusive_container.cc.html#L44'>compute_exclusive_container_sizes</a><span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L565" class="LineNr">565 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L566" class="LineNr">566 </span><span class="Delimiter">}</span> <span id="L567" class="LineNr">567 </span> @@ -635,7 +635,7 @@ if ('onhashchange' in window) { <span id="L573" class="LineNr">573 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L574" class="LineNr">574 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:foo:point"</span><span class="Delimiter">);</span> <span id="L575" class="LineNr">575 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> +<span id="L576" class="LineNr">576 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span> <span id="L577" class="LineNr">577 </span><span class="Delimiter">}</span> <span id="L578" class="LineNr">578 </span> <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> @@ -645,10 +645,10 @@ if ('onhashchange' in window) { <span id="L583" class="LineNr">583 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L584" class="LineNr">584 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:foo:point"</span><span class="Delimiter">);</span> <span id="L585" class="LineNr">585 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> +<span id="L586" class="LineNr">586 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span> <span id="L587" class="LineNr">587 </span> reagent r2<span class="Delimiter">(</span><span class="Constant">"x:foo:num"</span><span class="Delimiter">);</span> <span id="L588" class="LineNr">588 </span> compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> +<span id="L589" class="LineNr">589 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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 id="L590" class="LineNr">590 </span><span class="Delimiter">}</span> <span id="L591" class="LineNr">591 </span> <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> @@ -658,11 +658,11 @@ if ('onhashchange' in window) { <span id="L596" class="LineNr">596 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L597" class="LineNr">597 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:foo:&:point"</span><span class="Delimiter">);</span> <span id="L598" class="LineNr">598 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> +<span id="L599" class="LineNr">599 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L600" class="LineNr">600 </span> <span class="Comment">// scan also pre-computes metadata for type ingredient</span> <span id="L601" class="LineNr">601 </span> reagent point<span class="Delimiter">(</span><span class="Constant">"x:point"</span><span class="Delimiter">);</span> -<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> -<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> +<span id="L602" class="LineNr">602 </span> <a href='002test.cc.html#L25'>CHECK</a><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> +<span id="L603" class="LineNr">603 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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 id="L604" class="LineNr">604 </span><span class="Delimiter">}</span> <span id="L605" class="LineNr">605 </span> <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> @@ -672,18 +672,18 @@ if ('onhashchange' in window) { <span id="L610" class="LineNr">610 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L611" class="LineNr">611 </span> reagent r2<span class="Delimiter">(</span><span class="Constant">"x:foo:num"</span><span class="Delimiter">);</span> <span id="L612" class="LineNr">612 </span> compute_container_sizes<span class="Delimiter">(</span>r2<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> +<span id="L613" class="LineNr">613 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><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 id="L614" class="LineNr">614 </span><span class="Delimiter">}</span> <span id="L615" class="LineNr">615 </span> <span id="L616" class="LineNr">616 </span><span class="Delimiter">:(before "End compute_container_address_offsets Non-atom Special-cases")</span> <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> <span id="L618" class="LineNr">618 </span>type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> root<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<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> +<span id="L619" class="LineNr">619 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L621" class="LineNr">621 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L622" class="LineNr">622 </span><span class="Delimiter">}</span> -<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> -<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> +<span id="L623" class="LineNr">623 </span><span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L624" class="LineNr">624 </span> <a href='036refcount.cc.html#L342'>compute_exclusive_container_address_offsets</a><span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L625" class="LineNr">625 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L626" class="LineNr">626 </span><span class="Delimiter">}</span> <span id="L627" class="LineNr">627 </span> @@ -696,13 +696,13 @@ if ('onhashchange' in window) { <span id="L634" class="LineNr">634 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:foo:&:num"</span><span class="Delimiter">);</span> <span id="L635" class="LineNr">635 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L636" class="LineNr">636 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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<tag_condition_info><span class="Delimiter">()));</span> -<span id="L639" class="LineNr">639 </span> set<address_element_info>& offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L641" class="LineNr">641 </span> CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">//</span> -<span id="L642" class="LineNr">642 </span> CHECK<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L643" class="LineNr">643 </span> CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L637" class="LineNr">637 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L638" class="LineNr">638 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">()));</span> +<span id="L639" class="LineNr">639 </span> set<address_element_info>& offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L640" class="LineNr">640 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L641" class="LineNr">641 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span class="Comment">//</span> +<span id="L642" class="LineNr">642 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L643" class="LineNr">643 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L644" class="LineNr">644 </span><span class="Delimiter">}</span> <span id="L645" class="LineNr">645 </span> <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> @@ -715,19 +715,19 @@ if ('onhashchange' in window) { <span id="L653" class="LineNr">653 </span> <span class="Constant">" y:foo:_t</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L654" class="LineNr">654 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L655" class="LineNr">655 </span> reagent r<span class="Delimiter">(</span><span class="Constant">"x:bar:&:num"</span><span class="Delimiter">);</span> -<span id="L656" class="LineNr">656 </span> CLEAR_TRACE<span class="Delimiter">;</span> +<span id="L656" class="LineNr">656 </span> <a href='003trace.cc.html#L168'>CLEAR_TRACE</a><span class="Delimiter">;</span> <span id="L657" class="LineNr">657 </span> compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L658" class="LineNr">658 </span> compute_container_address_offsets<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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<tag_condition_info><span class="Delimiter">()));</span> -<span id="L661" class="LineNr">661 </span> set<address_element_info>& offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>address<span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> -<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> -<span id="L663" class="LineNr">663 </span> CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">//</span> -<span id="L664" class="LineNr">664 </span> CHECK<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L665" class="LineNr">665 </span> CHECK_EQ<span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> -<span id="L666" class="LineNr">666 </span> CHECK_EQ<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-></span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">//</span> -<span id="L667" class="LineNr">667 </span> CHECK<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<span id="L668" class="LineNr">668 </span> CHECK_EQ<span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L659" class="LineNr">659 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L660" class="LineNr">660 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">()));</span> +<span id="L661" class="LineNr">661 </span> set<address_element_info>& offset_info = get<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> set<tag_condition_info><span class="Delimiter">());</span> +<span id="L662" class="LineNr">662 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L663" class="LineNr">663 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span>offset<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">//</span> +<span id="L664" class="LineNr">664 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L665" class="LineNr">665 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">()-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> +<span id="L666" class="LineNr">666 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-></span>offset<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span class="Comment">//</span> +<span id="L667" class="LineNr">667 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L668" class="LineNr">668 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">((</span>++offset_info<span class="Delimiter">.</span>begin<span class="Delimiter">())-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"number"</span><span class="Delimiter">);</span> <span id="L669" class="LineNr">669 </span><span class="Delimiter">}</span> <span id="L670" class="LineNr">670 </span> <span id="L671" class="LineNr">671 </span><span class="SalientComment">//:: 'merge' on shape-shifting containers</span> @@ -741,7 +741,7 @@ if ('onhashchange' in window) { <span id="L679" class="LineNr">679 </span> <span class="Normal">x</span>:num <span id="L680" class="LineNr">680 </span> <span class="Normal">y</span>:num <span id="L681" class="LineNr">681 </span>] -<span id="L682" class="LineNr">682 </span><span class="muRecipe">def</span> main [ +<span id="L682" class="LineNr">682 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L683" class="LineNr">683 </span> <span class="Constant">1</span>:foo:bar<span class="Special"> <- </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 id="L684" class="LineNr">684 </span>] <span id="L685" class="LineNr">685 </span><span class="traceContains">+mem: storing 23 in location 1</span> @@ -759,10 +759,10 @@ if ('onhashchange' in window) { <span id="L697" class="LineNr">697 </span> <span class="Normal">x</span>:num <span id="L698" class="LineNr">698 </span> <span class="Normal">y</span>:num <span id="L699" class="LineNr">699 </span>] -<span id="L700" class="LineNr">700 </span><span class="muRecipe">def</span> main [ +<span id="L700" class="LineNr">700 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L701" class="LineNr">701 </span> <span class="Constant">1</span>:foo:bar<span class="Special"> <- </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 id="L702" class="LineNr">702 </span>] -<span id="L703" class="LineNr">703 </span><span class="traceContains">+error: main: too many ingredients in '1:foo:bar <- merge 23, 1/y, 34, 35'</span> +<span id="L703" class="LineNr">703 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too many ingredients in '1:foo:bar <- merge 23, 1/y, 34, 35'</span> <span id="L704" class="LineNr">704 </span> <span id="L705" class="LineNr">705 </span><span class="Delimiter">:(scenario merge_check_shape_shifting_exclusive_container_containing_container)</span> <span id="L706" class="LineNr">706 </span><span class="muData">exclusive-container</span> foo:_elem [ @@ -773,7 +773,7 @@ if ('onhashchange' in window) { <span id="L711" class="LineNr">711 </span> <span class="Normal">x</span>:num <span id="L712" class="LineNr">712 </span> <span class="Normal">y</span>:num <span id="L713" class="LineNr">713 </span>] -<span id="L714" class="LineNr">714 </span><span class="muRecipe">def</span> main [ +<span id="L714" class="LineNr">714 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L715" class="LineNr">715 </span> <span class="Constant">1</span>:foo:bar<span class="Special"> <- </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 id="L716" class="LineNr">716 </span>] <span id="L717" class="LineNr">717 </span><span class="traceContains">+mem: storing 1 in location 1</span> @@ -790,7 +790,7 @@ if ('onhashchange' in window) { <span id="L728" class="LineNr">728 </span> <span class="Normal">x</span>:num <span id="L729" class="LineNr">729 </span> <span class="Normal">y</span>:num <span id="L730" class="LineNr">730 </span>] -<span id="L731" class="LineNr">731 </span><span class="muRecipe">def</span> main [ +<span id="L731" class="LineNr">731 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L732" class="LineNr">732 </span> <span class="Constant">1</span>:foo:bar<span class="Special"> <- </span>merge <span class="Constant">0</span>/x<span class="Delimiter">,</span> <span class="Constant">23</span> <span id="L733" class="LineNr">733 </span>] <span id="L734" class="LineNr">734 </span>$error: <span class="Constant">0</span> @@ -805,10 +805,10 @@ if ('onhashchange' in window) { <span id="L743" class="LineNr">743 </span> <span class="Normal">x</span>:num <span id="L744" class="LineNr">744 </span> <span class="Normal">y</span>:num <span id="L745" class="LineNr">745 </span>] -<span id="L746" class="LineNr">746 </span><span class="muRecipe">def</span> main [ +<span id="L746" class="LineNr">746 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L747" class="LineNr">747 </span> <span class="Constant">1</span>:foo:bar<span class="Special"> <- </span>merge <span class="Constant">1</span>/y<span class="Delimiter">,</span> <span class="Constant">23</span> <span id="L748" class="LineNr">748 </span>] -<span id="L749" class="LineNr">749 </span><span class="traceContains">+error: main: too few ingredients in '1:foo:bar <- merge 1/y, 23'</span> +<span id="L749" class="LineNr">749 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: too few ingredients in '1:foo:bar <- 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 f7a7b392..7210e0eb 100644 --- a/html/056shape_shifting_recipe.cc.html +++ b/html/056shape_shifting_recipe.cc.html @@ -64,7 +64,7 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="SalientComment">//:: Like container definitions, recipes too can contain type parameters.</span> <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario shape_shifting_recipe)</span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [ +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L5" class="LineNr"> 5 </span> <span class="Constant">10</span>:point<span class="Special"> <- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span> <span id="L6" class="LineNr"> 6 </span> <span class="Constant">11</span>:point<span class="Special"> <- </span>foo <span class="Constant">10</span>:point <span id="L7" class="LineNr"> 7 </span>] @@ -94,13 +94,13 @@ if ('onhashchange' in window) { <span id="L31" class="LineNr"> 31 </span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before "End Transform Checks")</span> <span id="L33" class="LineNr"> 33 </span>r<span class="Delimiter">.</span>transformed_until = t<span class="Delimiter">;</span> -<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><transform_fn><span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">)</span> && 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">-></span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<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><transform_fn><span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">)</span> && <a href='056shape_shifting_recipe.cc.html#L157'>any_type_ingredient_in_header</a><span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment"><a href='010vm.cc.html#L14'>recipe_ordinal</a></span><span class="Comment">*/</span>p<span class="Delimiter">-></span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L35" class="LineNr"> 35 </span> <span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(after "Running One Instruction")</span> <span id="L37" class="LineNr"> 37 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_step_index == <span class="Constant">0</span> -<span id="L38" class="LineNr"> 38 </span> && any_type_ingredient_in_header<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L38" class="LineNr"> 38 </span> && <a href='056shape_shifting_recipe.cc.html#L157'>any_type_ingredient_in_header</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L39" class="LineNr"> 39 </span><span class="CommentedCode">//? DUMP("");</span> -<span id="L40" class="LineNr"> 40 </span> raise << <span class="Constant">"ran into unspecialized shape-shifting recipe "</span> << current_recipe_name<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"ran into unspecialized shape-shifting <a href='010vm.cc.html#L19'>recipe</a> "</span> << current_recipe_name<span class="Delimiter">()</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L41" class="LineNr"> 41 </span><span class="CommentedCode">//? exit(0);</span> <span id="L42" class="LineNr"> 42 </span><span class="Delimiter">}</span> <span id="L43" class="LineNr"> 43 </span> @@ -110,33 +110,33 @@ if ('onhashchange' in window) { <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> <span id="L48" class="LineNr"> 48 </span> <span id="L49" class="LineNr"> 49 </span><span class="Comment">//: save original name of specialized recipes</span> -<span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(before "End recipe Fields")</span> +<span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Fields")</span> <span id="L51" class="LineNr"> 51 </span>string original_name<span class="Delimiter">;</span> <span id="L52" class="LineNr"> 52 </span><span class="Comment">//: original name is only set during load</span> <span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before "End Load Recipe Name")</span> <span id="L54" class="LineNr"> 54 </span>result<span class="Delimiter">.</span>original_name = result<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L55" class="LineNr"> 55 </span> <span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(after "Static Dispatch Phase 3")</span> -<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> +<span id="L57" class="LineNr"> 57 </span>candidates = <a href='056shape_shifting_recipe.cc.html#L100'>strictly_matching_shape_shifting_variants</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span> <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> -<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> -<span id="L60" class="LineNr"> 60 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"found variant to specialize: "</span> << exemplar << <span class="Constant">' '</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> -<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> +<span id="L59" class="LineNr"> 59 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> exemplar = <a href='056shape_shifting_recipe.cc.html#L129'>best_shape_shifting_variant</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">);</span> +<span id="L60" class="LineNr"> 60 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"found variant to specialize: "</span> << exemplar << <span class="Constant">' '</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L61" class="LineNr"> 61 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> new_recipe_ordinal = <a href='056shape_shifting_recipe.cc.html#L227'>new_variant</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span> <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> <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> <span id="L64" class="LineNr"> 64 </span> recipe& variant = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">);</span> <span id="L65" class="LineNr"> 65 </span> <span class="Comment">// perform all transforms on the new specialization</span> <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> -<span id="L67" class="LineNr"> 67 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"transforming new specialization: "</span> << variant<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>Transform<span class="Delimiter">);</span> ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L67" class="LineNr"> 67 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"transforming new specialization: "</span> << variant<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Transform<span class="Delimiter">);</span> ++t<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L69" class="LineNr"> 69 </span> <span class="Comment">// one exception: skip tangle, which would have already occurred inside new_variant above</span> <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><transform_fn><span class="Delimiter">(</span>insert_fragments<span class="Delimiter">))</span> <span id="L71" class="LineNr"> 71 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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> <span id="L73" class="LineNr"> 73 </span> <span class="Delimiter">}</span> <span id="L74" class="LineNr"> 74 </span> <span class="Delimiter">}</span> -<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> -<span id="L76" class="LineNr"> 76 </span> trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"new specialization: "</span> << variant<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L75" class="LineNr"> 75 </span> variant<span class="Delimiter">.</span>transformed_until = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Transform<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span> +<span id="L76" class="LineNr"> 76 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"new specialization: "</span> << variant<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L77" class="LineNr"> 77 </span> <span class="Identifier">return</span> variant<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L78" class="LineNr"> 78 </span><span class="Delimiter">}</span> <span id="L79" class="LineNr"> 79 </span><span class="Normal">skip_shape_shifting_variants</span>:<span class="Delimiter">;</span> @@ -145,9 +145,9 @@ if ('onhashchange' in window) { <span id="L82" class="LineNr"> 82 </span><span class="Comment">//: recipes can be called</span> <span id="L83" class="LineNr"> 83 </span> <span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before "End Instruction Operation Checks")</span> -<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> && inst<span class="Delimiter">.</span>operation >= MAX_PRIMITIVE_RECIPES -<span id="L86" class="LineNr"> 86 </span> && any_type_ingredient_in_header<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L87" class="LineNr"> 87 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"instruction '"</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">"' has no valid specialization</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<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> && inst<span class="Delimiter">.</span>operation >= <a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a> +<span id="L86" class="LineNr"> 86 </span> && <a href='056shape_shifting_recipe.cc.html#L157'>any_type_ingredient_in_header</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L87" class="LineNr"> 87 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"instruction '"</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">"' has no valid specialization</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L88" class="LineNr"> 88 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L89" class="LineNr"> 89 </span><span class="Delimiter">}</span> <span id="L90" class="LineNr"> 90 </span> @@ -160,9 +160,9 @@ if ('onhashchange' in window) { <span id="L97" class="LineNr"> 97 </span> <span id="L98" class="LineNr"> 98 </span><span class="Delimiter">:(code)</span> <span id="L99" class="LineNr"> 99 </span><span class="Comment">// phase 3 of static dispatch</span> -<span id="L100" class="LineNr"> 100 </span>vector<recipe_ordinal> strictly_matching_shape_shifting_variants<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L100" class="LineNr"> 100 </span>vector<recipe_ordinal> <a href='056shape_shifting_recipe.cc.html#L100'>strictly_matching_shape_shifting_variants</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L101" class="LineNr"> 101 </span> vector<recipe_ordinal> result<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> @@ -171,17 +171,17 @@ if ('onhashchange' in window) { <span id="L108" class="LineNr"> 108 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L109" class="LineNr"> 109 </span><span class="Delimiter">}</span> <span id="L110" class="LineNr"> 110 </span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 id="L111" class="LineNr"> 111 </span><span class="Normal">bool</span> <a href='056shape_shifting_recipe.cc.html#L111'>all_concrete_header_reagents_strictly_match</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L114" class="LineNr"> 114 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"concrete-type match failed: ingredient "</span> << i << end<span class="Delimiter">();</span> +<span id="L114" class="LineNr"> 114 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"concrete-type match failed: ingredient "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L115" class="LineNr"> 115 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L116" class="LineNr"> 116 </span> <span class="Delimiter">}</span> <span id="L117" class="LineNr"> 117 </span> <span class="Delimiter">}</span> -<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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L121" class="LineNr"> 121 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"concrete-type match failed: product "</span> << i << end<span class="Delimiter">();</span> +<span id="L121" class="LineNr"> 121 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"concrete-type match failed: product "</span> << i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L122" class="LineNr"> 122 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L123" class="LineNr"> 123 </span> <span class="Delimiter">}</span> <span id="L124" class="LineNr"> 124 </span> <span class="Delimiter">}</span> @@ -189,11 +189,11 @@ if ('onhashchange' in window) { <span id="L126" class="LineNr"> 126 </span><span class="Delimiter">}</span> <span id="L127" class="LineNr"> 127 </span> <span id="L128" class="LineNr"> 128 </span><span class="Comment">// tie-breaker for phase 3</span> -<span id="L129" class="LineNr"> 129 </span>recipe_ordinal best_shape_shifting_variant<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L129" class="LineNr"> 129 </span><a href='010vm.cc.html#L14'>recipe_ordinal</a> <a href='056shape_shifting_recipe.cc.html#L129'>best_shape_shifting_variant</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> vector<recipe_ordinal>& candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L130" class="LineNr"> 130 </span> assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L131" class="LineNr"> 131 </span> <span class="Comment">// primary score</span> <span id="L132" class="LineNr"> 132 </span> <span class="Normal">int</span> max_score = -<span class="Constant">1</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L135" class="LineNr"> 135 </span> assert<span class="Delimiter">(</span>score > -<span class="Constant">1</span><span class="Delimiter">);</span> <span id="L136" class="LineNr"> 136 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>score > max_score<span class="Delimiter">)</span> max_score = score<span class="Delimiter">;</span> @@ -201,13 +201,13 @@ if ('onhashchange' in window) { <span id="L138" class="LineNr"> 138 </span> <span class="Comment">// break any ties at max_score by a secondary score</span> <span id="L139" class="LineNr"> 139 </span> <span class="Normal">int</span> min_score2 = <span class="Constant">999</span><span class="Delimiter">;</span> <span id="L140" class="LineNr"> 140 </span> <span class="Normal">int</span> best_index = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L141" class="LineNr"> 141 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L141" class="LineNr"> 141 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L143" class="LineNr"> 143 </span> assert<span class="Delimiter">(</span>score1 <= max_score<span class="Delimiter">);</span> <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> <span id="L145" class="LineNr"> 145 </span> <span class="Normal">const</span> recipe& 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 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> -<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> +<span id="L146" class="LineNr"> 146 </span> <span class="Normal">int</span> score2 = <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L147" class="LineNr"> 147 </span> + <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span>-SIZE<span class="Delimiter">(</span>candidate<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> <span id="L148" class="LineNr"> 148 </span> assert<span class="Delimiter">(</span>score2 < <span class="Constant">999</span><span class="Delimiter">);</span> <span id="L149" class="LineNr"> 149 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>score2 < min_score2<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L150" class="LineNr"> 150 </span> min_score2 = score2<span class="Delimiter">;</span> @@ -217,13 +217,13 @@ if ('onhashchange' in window) { <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> <span id="L155" class="LineNr"> 155 </span><span class="Delimiter">}</span> <span id="L156" class="LineNr"> 156 </span> -<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> +<span id="L157" class="LineNr"> 157 </span><span class="Normal">bool</span> <a href='056shape_shifting_recipe.cc.html#L157'>any_type_ingredient_in_header</a><span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L158" class="LineNr"> 158 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variant<span class="Delimiter">);</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L161" class="LineNr"> 161 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L162" class="LineNr"> 162 </span> <span class="Delimiter">}</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L165" class="LineNr"> 165 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L166" class="LineNr"> 166 </span> <span class="Delimiter">}</span> @@ -249,9 +249,9 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr"> 186 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-></span>atom != to<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L187" class="LineNr"> 187 </span> <span class="Comment">// both from and to are atoms</span> <span id="L188" class="LineNr"> 188 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-></span>name == <span class="Constant">"literal"</span><span class="Delimiter">)</span> -<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span> +<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L190" class="LineNr"> 190 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-></span>name == <span class="Constant">"literal"</span><span class="Delimiter">)</span> -<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span>end<span class="Delimiter">();</span> +<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">-></span>name<span class="Delimiter">)</span> != Literal_type_names<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L192" class="LineNr"> 192 </span> <span class="Identifier">return</span> to<span class="Delimiter">-></span>name == from<span class="Delimiter">-></span>name<span class="Delimiter">;</span> <span id="L193" class="LineNr"> 193 </span><span class="Delimiter">}</span> <span id="L194" class="LineNr"> 194 </span> @@ -265,12 +265,12 @@ if ('onhashchange' in window) { <span id="L202" class="LineNr"> 202 </span> <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">)</span> || contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L203" class="LineNr"> 203 </span><span class="Delimiter">}</span> <span id="L204" class="LineNr"> 204 </span> -<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> +<span id="L205" class="LineNr"> 205 </span><span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L206" class="LineNr"> 206 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L207" class="LineNr"> 207 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <span id="L212" class="LineNr"> 212 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L213" class="LineNr"> 213 </span><span class="Delimiter">}</span> @@ -287,17 +287,17 @@ if ('onhashchange' in window) { <span id="L224" class="LineNr"> 224 </span> + number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L225" class="LineNr"> 225 </span><span class="Delimiter">}</span> <span id="L226" class="LineNr"> 226 </span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L227" class="LineNr"> 227 </span><a href='010vm.cc.html#L14'>recipe_ordinal</a> <a href='056shape_shifting_recipe.cc.html#L227'>new_variant</a><span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L228" class="LineNr"> 228 </span> string new_name = <a href='054static_dispatch.cc.html#L111'>next_unused_recipe_name</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name<span class="Delimiter">);</span> <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> -<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> +<span id="L230" class="LineNr"> 230 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> new_recipe_ordinal = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> Next_recipe_ordinal++<span class="Delimiter">);</span> <span id="L231" class="LineNr"> 231 </span> <span class="Comment">// make a copy</span> <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> <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> -<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> +<span id="L234" class="LineNr"> 234 </span> <a href='010vm.cc.html#L19'>recipe</a> new_recipe = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> exemplar<span class="Delimiter">);</span> <span id="L235" class="LineNr"> 235 </span> new_recipe<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span> <span id="L236" class="LineNr"> 236 </span> new_recipe<span class="Delimiter">.</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L237" class="LineNr"> 237 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"switching "</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">" to specialized "</span> << header_label<span class="Delimiter">(</span>new_recipe<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L237" class="LineNr"> 237 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"switching "</span> << inst<span class="Delimiter">.</span>name << <span class="Constant">" to specialized "</span> << header_label<span class="Delimiter">(</span>new_recipe<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L238" class="LineNr"> 238 </span> <span id="L239" class="LineNr"> 239 </span> <span class="Comment">// Replace type ingredients with concrete types in new_recipe.</span> <span id="L240" class="LineNr"> 240 </span> <span class="Comment">//</span> @@ -308,59 +308,59 @@ if ('onhashchange' in window) { <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> <span id="L246" class="LineNr"> 246 </span> <span class="Comment">// while supporting type-ingredients</span> <span id="L247" class="LineNr"> 247 </span> expand_type_abbreviations<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span> -<span id="L248" class="LineNr"> 248 </span> compute_type_names<span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span> +<span id="L248" class="LineNr"> 248 </span> <a href='056shape_shifting_recipe.cc.html#L265'>compute_type_names</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span> <span id="L249" class="LineNr"> 249 </span> <span class="Comment">// that gives enough information to replace type-ingredients with concrete types</span> <span id="L250" class="LineNr"> 250 </span> <span class="Delimiter">{</span> <span id="L251" class="LineNr"> 251 </span> map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*> mappings<span class="Delimiter">;</span> <span id="L252" class="LineNr"> 252 </span> <span class="Normal">bool</span> error = <span class="Constant">false</span><span class="Delimiter">;</span> -<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> &error<span class="Delimiter">);</span> -<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> +<span id="L253" class="LineNr"> 253 </span> <a href='056shape_shifting_recipe.cc.html#L299'>compute_type_ingredient_mappings</a><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> &error<span class="Delimiter">);</span> +<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><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>mappings<span class="Delimiter">)</span> != <a href='056shape_shifting_recipe.cc.html#L437'>type_ingredient_count_in_header</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">));</span> <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> -<span id="L256" class="LineNr"> 256 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*>::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 id="L256" class="LineNr"> 256 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*>::iterator p = mappings<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != mappings<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span id="L257" class="LineNr"> 257 </span> <span class="Normal">delete</span> p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> <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> <span id="L259" class="LineNr"> 259 </span> <span class="Delimiter">}</span> <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> -<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> +<span id="L261" class="LineNr"> 261 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">,</span> new_recipe<span class="Delimiter">);</span> <span id="L262" class="LineNr"> 262 </span> <span class="Identifier">return</span> new_recipe_ordinal<span class="Delimiter">;</span> <span id="L263" class="LineNr"> 263 </span><span class="Delimiter">}</span> <span id="L264" class="LineNr"> 264 </span> -<span id="L265" class="LineNr"> 265 </span><span class="Normal">void</span> compute_type_names<span class="Delimiter">(</span>recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L266" class="LineNr"> 266 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"-- compute type names: "</span> << variant<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L265" class="LineNr"> 265 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L265'>compute_type_names</a><span class="Delimiter">(</span>recipe& variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L266" class="LineNr"> 266 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"-- compute type names: "</span> << variant<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L267" class="LineNr"> 267 </span> map<string<span class="Delimiter">,</span> type_tree*> type_names<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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">""</span><span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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">""</span><span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L269" class="LineNr"> 269 </span> <a href='056shape_shifting_recipe.cc.html#L282'>save_or_deduce_type_name</a><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">""</span><span class="Delimiter">);</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L271" class="LineNr"> 271 </span> <a href='056shape_shifting_recipe.cc.html#L282'>save_or_deduce_type_name</a><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">""</span><span class="Delimiter">);</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L273" class="LineNr"> 273 </span> instruction& inst = variant<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L274" class="LineNr"> 274 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" instruction: "</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> -<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">" in '"</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">"'"</span><span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> -<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">" in '"</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">"'"</span><span class="Delimiter">);</span> +<span id="L274" class="LineNr"> 274 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" <a href='010vm.cc.html#L32'>instruction</a>: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> +<span id="L276" class="LineNr"> 276 </span> <a href='056shape_shifting_recipe.cc.html#L282'>save_or_deduce_type_name</a><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">" in '"</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">"'"</span><span class="Delimiter">);</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> +<span id="L278" class="LineNr"> 278 </span> <a href='056shape_shifting_recipe.cc.html#L282'>save_or_deduce_type_name</a><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">" in '"</span> + inst<span class="Delimiter">.</span>original_string + <span class="Constant">"'"</span><span class="Delimiter">);</span> <span id="L279" class="LineNr"> 279 </span> <span class="Delimiter">}</span> <span id="L280" class="LineNr"> 280 </span><span class="Delimiter">}</span> <span id="L281" class="LineNr"> 281 </span> -<span id="L282" class="LineNr"> 282 </span><span class="Normal">void</span> save_or_deduce_type_name<span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> type_tree*>& type<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">,</span> <span class="Normal">const</span> string& context<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L283" class="LineNr"> 283 </span> trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" checking "</span> << to_string<span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">": "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L282" class="LineNr"> 282 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L282'>save_or_deduce_type_name</a><span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> type_tree*>& type<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& variant<span class="Delimiter">,</span> <span class="Normal">const</span> string& context<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L283" class="LineNr"> 283 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" checking "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> << <span class="Constant">": "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L284" class="LineNr"> 284 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type && 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> <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> -<span id="L286" class="LineNr"> 286 </span> trace<span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" deducing type to "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L286" class="LineNr"> 286 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">" deducing type to "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L287" class="LineNr"> 287 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L288" class="LineNr"> 288 </span> <span class="Delimiter">}</span> <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> -<span id="L290" class="LineNr"> 290 </span> raise << maybe<span class="Delimiter">(</span>variant<span class="Delimiter">.</span>original_name<span class="Delimiter">)</span> << <span class="Constant">"unknown type for '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'"</span> << context << <span class="Constant">" (check the name for typos)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L290" class="LineNr"> 290 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>original_name<span class="Delimiter">)</span> << <span class="Constant">"unknown type for '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'"</span> << context << <span class="Constant">" (check the name for typos)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L291" class="LineNr"> 291 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L292" class="LineNr"> 292 </span> <span class="Delimiter">}</span> <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> <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">-></span>name == <span class="Constant">"offset"</span> || x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name == <span class="Constant">"variant"</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// special-case for container-access instructions</span> -<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> -<span id="L296" class="LineNr"> 296 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' is "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L295" class="LineNr"> 295 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L296" class="LineNr"> 296 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"type of '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' is "</span> << names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L297" class="LineNr"> 297 </span><span class="Delimiter">}</span> <span id="L298" class="LineNr"> 298 </span> -<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& exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*>& mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L299" class="LineNr"> 299 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L299'>compute_type_ingredient_mappings</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*>& mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L300" class="LineNr"> 300 </span> <span class="Normal">int</span> limit = min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> <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 < limit<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L302" class="LineNr"> 302 </span> <span class="Normal">const</span> reagent& exemplar_reagent = exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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> @@ -368,7 +368,7 @@ if ('onhashchange' in window) { <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> && ingredient<span class="Delimiter">.</span>name == <span class="Constant">"0"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// assume it matches</span> <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> <span id="L307" class="LineNr"> 307 </span> <span class="Delimiter">}</span> -<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> +<span id="L308" class="LineNr"> 308 </span> limit = min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>products<span class="Delimiter">));</span> <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 < limit<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L310" class="LineNr"> 310 </span> <span class="Normal">const</span> reagent& exemplar_reagent = exemplar<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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> @@ -388,13 +388,13 @@ if ('onhashchange' in window) { <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> <span id="L326" class="LineNr"> 326 </span> <span class="Comment">// probably a bug in mu</span> <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> -<span id="L328" class="LineNr"> 328 </span> raise << maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"missing type ingredient for "</span> << exemplar_reagent<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> -<span id="L329" class="LineNr"> 329 </span> raise << <span class="Constant">" (called from '"</span> << to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L328" class="LineNr"> 328 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"missing type ingredient for "</span> << exemplar_reagent<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L329" class="LineNr"> 329 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" (called from '"</span> << to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L330" class="LineNr"> 330 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L331" class="LineNr"> 331 </span> <span class="Delimiter">}</span> <span id="L332" class="LineNr"> 332 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">-></span>atom && exemplar_type<span class="Delimiter">-></span>right == <span class="Constant">NULL</span> && !refinement_type<span class="Delimiter">-></span>atom && refinement_type<span class="Delimiter">-></span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L333" class="LineNr"> 333 </span> exemplar_type = exemplar_type<span class="Delimiter">-></span>left<span class="Delimiter">;</span> -<span id="L334" class="LineNr"> 334 </span> assert_for_now<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> +<span id="L334" class="LineNr"> 334 </span> <a href='003trace.cc.html#L181'>assert_for_now</a><span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> <span id="L335" class="LineNr"> 335 </span> <span class="Delimiter">}</span> <span id="L336" class="LineNr"> 336 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> @@ -406,19 +406,19 @@ if ('onhashchange' in window) { <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">-></span>left<span class="Delimiter">);</span> <span id="L344" class="LineNr"> 344 </span> <span class="Delimiter">}</span> <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">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L346" class="LineNr"> 346 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"adding mapping from "</span> << exemplar_type<span class="Delimiter">-></span>name << <span class="Constant">" to "</span> << to_string<span class="Delimiter">(</span>curr_refinement_type<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<span id="L347" class="LineNr"> 347 </span> put<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-></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 id="L346" class="LineNr"> 346 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"adding mapping from "</span> << exemplar_type<span class="Delimiter">-></span>name << <span class="Constant">" to "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>curr_refinement_type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L347" class="LineNr"> 347 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-></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 id="L348" class="LineNr"> 348 </span> <span class="Delimiter">}</span> <span id="L349" class="LineNr"> 349 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <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">-></span>name<span class="Delimiter">),</span> curr_refinement_type<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L351" class="LineNr"> 351 </span> raise << maybe<span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"no call found for '"</span> << to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L351" class="LineNr"> 351 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"no call found for '"</span> << to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L352" class="LineNr"> 352 </span> *error = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L353" class="LineNr"> 353 </span> <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span> <span id="L354" class="LineNr"> 354 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L355" class="LineNr"> 355 </span> <span class="Delimiter">}</span> <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">-></span>name<span class="Delimiter">)-></span>name == <span class="Constant">"literal"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">-></span>name<span class="Delimiter">);</span> -<span id="L358" class="LineNr"> 358 </span> put<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-></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 id="L358" class="LineNr"> 358 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-></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 id="L359" class="LineNr"> 359 </span> <span class="Delimiter">}</span> <span id="L360" class="LineNr"> 360 </span> <span class="Delimiter">}</span> <span id="L361" class="LineNr"> 361 </span> <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span> @@ -433,23 +433,23 @@ if ('onhashchange' in window) { <span id="L370" class="LineNr"> 370 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>recipe& new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*>& mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L371" class="LineNr"> 371 </span> <span class="Comment">// update its header</span> <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> -<span id="L373" class="LineNr"> 373 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in recipe header ingredients"</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L373" class="LineNr"> 373 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in <a href='010vm.cc.html#L19'>recipe</a> header ingredients"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<span id="L376" class="LineNr"> 376 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in recipe header products"</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L376" class="LineNr"> 376 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in <a href='010vm.cc.html#L19'>recipe</a> header products"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> <span id="L379" class="LineNr"> 379 </span> <span class="Comment">// update its body</span> -<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 < 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L381" class="LineNr"> 381 </span> instruction& inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<span id="L382" class="LineNr"> 382 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in instruction '"</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> +<span id="L382" class="LineNr"> 382 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in <a href='010vm.cc.html#L32'>instruction</a> '"</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <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> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <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> <span id="L387" class="LineNr"> 387 </span> <span class="Comment">// special-case for new: replace type ingredient in first ingredient *value*</span> <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">"new"</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>name != <span class="Constant">"literal-string"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L389" class="LineNr"> 389 </span> type_tree* type = <a href='056shape_shifting_recipe.cc.html#L454'>parse_type_tree</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">);</span> <span id="L390" class="LineNr"> 390 </span> replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span> <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> <span id="L392" class="LineNr"> 392 </span> <span class="Normal">delete</span> type<span class="Delimiter">;</span> @@ -458,10 +458,10 @@ if ('onhashchange' in window) { <span id="L395" class="LineNr"> 395 </span><span class="Delimiter">}</span> <span id="L396" class="LineNr"> 396 </span> <span id="L397" class="LineNr"> 397 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> map<string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*>& mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L398" class="LineNr"> 398 </span> string before = to_string<span class="Delimiter">(</span>x<span class="Delimiter">);</span> -<span id="L399" class="LineNr"> 399 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in ingredient "</span> << x<span class="Delimiter">.</span>original_string << end<span class="Delimiter">();</span> +<span id="L398" class="LineNr"> 398 </span> string before = <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">);</span> +<span id="L399" class="LineNr"> 399 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"replacing in ingredient "</span> << x<span class="Delimiter">.</span>original_string << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<span id="L401" class="LineNr"> 401 </span> raise << <span class="Constant">"specializing "</span> << caller<span class="Delimiter">.</span>original_name << <span class="Constant">": missing type for '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L401" class="LineNr"> 401 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"specializing "</span> << caller<span class="Delimiter">.</span>original_name << <span class="Constant">": missing type for '"</span> << x<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L402" class="LineNr"> 402 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L403" class="LineNr"> 403 </span> <span class="Delimiter">}</span> <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> @@ -483,7 +483,7 @@ if ('onhashchange' in window) { <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">-></span>name<span class="Delimiter">))</span> <span id="L421" class="LineNr"> 421 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <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">-></span>name<span class="Delimiter">);</span> -<span id="L423" class="LineNr"> 423 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << type<span class="Delimiter">-></span>name << <span class="Constant">" => "</span> << names_to_string<span class="Delimiter">(</span>replacement<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L423" class="LineNr"> 423 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << type<span class="Delimiter">-></span>name << <span class="Constant">" => "</span> << names_to_string<span class="Delimiter">(</span>replacement<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L424" class="LineNr"> 424 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>replacement<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L426" class="LineNr"> 426 </span> <span class="Comment">// error in program; should be reported elsewhere</span> @@ -497,14 +497,14 @@ if ('onhashchange' in window) { <span id="L434" class="LineNr"> 434 </span> <span class="Delimiter">}</span> <span id="L435" class="LineNr"> 435 </span><span class="Delimiter">}</span> <span id="L436" class="LineNr"> 436 </span> -<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> +<span id="L437" class="LineNr"> 437 </span><span class="Normal">int</span> <a href='056shape_shifting_recipe.cc.html#L437'>type_ingredient_count_in_header</a><span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L438" class="LineNr"> 438 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> variant<span class="Delimiter">);</span> <span id="L439" class="LineNr"> 439 </span> set<string> type_ingredients<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<span id="L444" class="LineNr"> 444 </span> <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>type_ingredients<span class="Delimiter">);</span> +<span id="L444" class="LineNr"> 444 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>type_ingredients<span class="Delimiter">);</span> <span id="L445" class="LineNr"> 445 </span><span class="Delimiter">}</span> <span id="L446" class="LineNr"> 446 </span> <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<string>& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -514,20 +514,20 @@ if ('onhashchange' in window) { <span id="L451" class="LineNr"> 451 </span> accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L452" class="LineNr"> 452 </span><span class="Delimiter">}</span> <span id="L453" class="LineNr"> 453 </span> -<span id="L454" class="LineNr"> 454 </span>type_tree* parse_type_tree<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L454" class="LineNr"> 454 </span>type_tree* <a href='056shape_shifting_recipe.cc.html#L454'>parse_type_tree</a><span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L455" class="LineNr"> 455 </span> string_tree* s2 = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span> -<span id="L456" class="LineNr"> 456 </span> type_tree* result = new_type_tree<span class="Delimiter">(</span>s2<span class="Delimiter">);</span> +<span id="L456" class="LineNr"> 456 </span> type_tree* result = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>s2<span class="Delimiter">);</span> <span id="L457" class="LineNr"> 457 </span> <span class="Normal">delete</span> s2<span class="Delimiter">;</span> <span id="L458" class="LineNr"> 458 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L459" class="LineNr"> 459 </span><span class="Delimiter">}</span> <span id="L460" class="LineNr"> 460 </span> <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> <span id="L462" class="LineNr"> 462 </span> ostringstream out<span class="Delimiter">;</span> -<span id="L463" class="LineNr"> 463 </span> dump_inspect<span class="Delimiter">(</span>x<span class="Delimiter">,</span> out<span class="Delimiter">);</span> +<span id="L463" class="LineNr"> 463 </span> <a href='056shape_shifting_recipe.cc.html#L467'>dump_inspect</a><span class="Delimiter">(</span>x<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L464" class="LineNr"> 464 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L465" class="LineNr"> 465 </span><span class="Delimiter">}</span> <span id="L466" class="LineNr"> 466 </span> -<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& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L467" class="LineNr"> 467 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L467'>dump_inspect</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L468" class="LineNr"> 468 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">-></span>left && !x<span class="Delimiter">-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L469" class="LineNr"> 469 </span> out << x<span class="Delimiter">-></span>name<span class="Delimiter">;</span> <span id="L470" class="LineNr"> 470 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> @@ -536,7 +536,7 @@ if ('onhashchange' in window) { <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">-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L474" class="LineNr"> 474 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr != x<span class="Delimiter">)</span> out << <span class="Constant">' '</span><span class="Delimiter">;</span> <span id="L475" class="LineNr"> 475 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-></span>left<span class="Delimiter">)</span> -<span id="L476" class="LineNr"> 476 </span> dump_inspect<span class="Delimiter">(</span>curr<span class="Delimiter">-></span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span> +<span id="L476" class="LineNr"> 476 </span> <a href='056shape_shifting_recipe.cc.html#L467'>dump_inspect</a><span class="Delimiter">(</span>curr<span class="Delimiter">-></span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L477" class="LineNr"> 477 </span> <span class="Normal">else</span> <span id="L478" class="LineNr"> 478 </span> out << curr<span class="Delimiter">-></span>name<span class="Delimiter">;</span> <span id="L479" class="LineNr"> 479 </span> <span class="Delimiter">}</span> @@ -544,34 +544,34 @@ if ('onhashchange' in window) { <span id="L481" class="LineNr"> 481 </span><span class="Delimiter">}</span> <span id="L482" class="LineNr"> 482 </span> <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& new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L484" class="LineNr"> 484 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"-- ensure all concrete types in recipe "</span> << new_recipe<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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 < SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L484" class="LineNr"> 484 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"-- ensure all concrete types in <a href='010vm.cc.html#L19'>recipe</a> "</span> << new_recipe<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<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 < SIZE<span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<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 < 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L490" class="LineNr"> 490 </span> instruction& inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <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> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <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> <span id="L495" class="LineNr"> 495 </span> <span class="Delimiter">}</span> <span id="L496" class="LineNr"> 496 </span><span class="Delimiter">}</span> <span id="L497" class="LineNr"> 497 </span> <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& x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L500" class="LineNr"> 500 </span> raise << maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"failed to map a type to "</span> << x<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L500" class="LineNr"> 500 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"failed to map a type to "</span> << x<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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">""</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// just to prevent crashes later</span> <span id="L502" class="LineNr"> 502 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L503" class="LineNr"> 503 </span> <span class="Delimiter">}</span> <span id="L504" class="LineNr"> 504 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-></span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L505" class="LineNr"> 505 </span> raise << maybe<span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"failed to map a type to the unknown "</span> << x<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L505" class="LineNr"> 505 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"failed to map a type to the unknown "</span> << x<span class="Delimiter">.</span>original_string << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L506" class="LineNr"> 506 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L507" class="LineNr"> 507 </span> <span class="Delimiter">}</span> <span id="L508" class="LineNr"> 508 </span><span class="Delimiter">}</span> <span id="L509" class="LineNr"> 509 </span> <span id="L510" class="LineNr"> 510 </span><span class="Delimiter">:(scenario shape_shifting_recipe_2)</span> -<span id="L511" class="LineNr"> 511 </span><span class="muRecipe">def</span> main [ +<span id="L511" class="LineNr"> 511 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L512" class="LineNr"> 512 </span> <span class="Constant">10</span>:point<span class="Special"> <- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span> <span id="L513" class="LineNr"> 513 </span> <span class="Constant">11</span>:point<span class="Special"> <- </span>foo <span class="Constant">10</span>:point <span id="L514" class="LineNr"> 514 </span>] @@ -591,7 +591,7 @@ if ('onhashchange' in window) { <span id="L528" class="LineNr"> 528 </span><span class="traceContains">+mem: storing 15 in location 12</span> <span id="L529" class="LineNr"> 529 </span> <span id="L530" class="LineNr"> 530 </span><span class="Delimiter">:(scenario shape_shifting_recipe_nonroot)</span> -<span id="L531" class="LineNr"> 531 </span><span class="muRecipe">def</span> main [ +<span id="L531" class="LineNr"> 531 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L532" class="LineNr"> 532 </span> <span class="Constant">10</span>:foo:point<span class="Special"> <- </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 id="L533" class="LineNr"> 533 </span> <span class="Constant">20</span>:point/<span class="Special">raw <- </span>bar <span class="Constant">10</span>:foo:point <span id="L534" class="LineNr"> 534 </span>] @@ -613,9 +613,9 @@ if ('onhashchange' in window) { <span id="L550" class="LineNr"> 550 </span> <span class="Normal">a</span>:_a <span id="L551" class="LineNr"> 551 </span> <span class="Normal">b</span>:_b <span id="L552" class="LineNr"> 552 </span>] -<span id="L553" class="LineNr"> 553 </span><span class="muRecipe">def</span> main [ +<span id="L553" class="LineNr"> 553 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L554" class="LineNr"> 554 </span> <span class="Normal">s</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] -<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"> <- </span>merge s<span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L555" class="LineNr"> 555 </span> <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>c <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> array character<span class="Delimiter">)</span> number<span class="Delimiter">)}</span><span class="Special"> <- </span>merge s<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L556" class="LineNr"> 556 </span> foo x <span id="L557" class="LineNr"> 557 </span>] <span id="L558" class="LineNr"> 558 </span><span class="muRecipe">def</span> foo x:c:_bar:_baz [ @@ -625,7 +625,7 @@ if ('onhashchange' in window) { <span id="L562" class="LineNr"> 562 </span><span class="Comment"># no errors</span> <span id="L563" class="LineNr"> 563 </span> <span id="L564" class="LineNr"> 564 </span><span class="Delimiter">:(scenario shape_shifting_recipe_type_deduction_ignores_offsets)</span> -<span id="L565" class="LineNr"> 565 </span><span class="muRecipe">def</span> main [ +<span id="L565" class="LineNr"> 565 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L566" class="LineNr"> 566 </span> <span class="Constant">10</span>:foo:point<span class="Special"> <- </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 id="L567" class="LineNr"> 567 </span> <span class="Constant">20</span>:point/<span class="Special">raw <- </span>bar <span class="Constant">10</span>:foo:point <span id="L568" class="LineNr"> 568 </span>] @@ -643,7 +643,7 @@ if ('onhashchange' in window) { <span id="L580" class="LineNr"> 580 </span><span class="traceContains">+mem: storing 15 in location 21</span> <span id="L581" class="LineNr"> 581 </span> <span id="L582" class="LineNr"> 582 </span><span class="Delimiter">:(scenario shape_shifting_recipe_empty)</span> -<span id="L583" class="LineNr"> 583 </span><span class="muRecipe">def</span> main [ +<span id="L583" class="LineNr"> 583 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L584" class="LineNr"> 584 </span> foo <span class="Constant">1</span> <span id="L585" class="LineNr"> 585 </span>] <span id="L586" class="LineNr"> 586 </span><span class="Comment"># shape-shifting recipe with no body</span> @@ -652,7 +652,7 @@ if ('onhashchange' in window) { <span id="L589" class="LineNr"> 589 </span><span class="Comment"># shouldn't crash</span> <span id="L590" class="LineNr"> 590 </span> <span id="L591" class="LineNr"> 591 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient)</span> -<span id="L592" class="LineNr"> 592 </span><span class="muRecipe">def</span> main [ +<span id="L592" class="LineNr"> 592 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L593" class="LineNr"> 593 </span> <span class="Constant">1</span>:&:foo:point<span class="Special"> <- </span>bar <span class="Constant">3</span> <span id="L594" class="LineNr"> 594 </span> <span class="Constant">11</span>:foo:point<span class="Special"> <- </span>copy *<span class="Constant">1</span>:&:foo:point <span id="L595" class="LineNr"> 595 </span>] @@ -671,7 +671,7 @@ if ('onhashchange' in window) { <span id="L608" class="LineNr"> 608 </span><span class="traceContains">+mem: storing 0 in location 13</span> <span id="L609" class="LineNr"> 609 </span> <span id="L610" class="LineNr"> 610 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient_2)</span> -<span id="L611" class="LineNr"> 611 </span><span class="muRecipe">def</span> main [ +<span id="L611" class="LineNr"> 611 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L612" class="LineNr"> 612 </span> <span class="Constant">1</span>:&:foo:point<span class="Special"> <- </span>bar <span class="Constant">3</span> <span id="L613" class="LineNr"> 613 </span> <span class="Constant">11</span>:foo:point<span class="Special"> <- </span>copy *<span class="Constant">1</span>:&:foo:point <span id="L614" class="LineNr"> 614 </span>] @@ -691,7 +691,7 @@ if ('onhashchange' in window) { <span id="L628" class="LineNr"> 628 </span><span class="traceContains">+mem: storing 0 in location 13</span> <span id="L629" class="LineNr"> 629 </span> <span id="L630" class="LineNr"> 630 </span><span class="Delimiter">:(scenario shape_shifting_recipe_called_with_dummy)</span> -<span id="L631" class="LineNr"> 631 </span><span class="muRecipe">def</span> main [ +<span id="L631" class="LineNr"> 631 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L632" class="LineNr"> 632 </span> _<span class="Special"> <- </span>bar <span class="Constant">34</span> <span id="L633" class="LineNr"> 633 </span>] <span id="L634" class="LineNr"> 634 </span><span class="muRecipe">def</span> bar x:_t<span class="muRecipe"> -> </span>result:&:_t [ @@ -703,9 +703,9 @@ if ('onhashchange' in window) { <span id="L640" class="LineNr"> 640 </span> <span id="L641" class="LineNr"> 641 </span><span class="Delimiter">:(code)</span> <span id="L642" class="LineNr"> 642 </span><span class="Comment">// this one needs a little more fine-grained control</span> -<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> +<span id="L643" class="LineNr"> 643 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L643'>test_shape_shifting_new_ingredient_does_not_pollute_global_namespace</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L644" class="LineNr"> 644 </span> <span class="Comment">// if you specialize a shape-shifting recipe that allocates a type-ingredient..</span> -<span id="L645" class="LineNr"> 645 </span> transform<span class="Delimiter">(</span><span class="Constant">"def barz x:_elem [</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L645" class="LineNr"> 645 </span> <a href='012transform.cc.html#L98'>transform</a><span class="Delimiter">(</span><span class="Constant">"def barz x:_elem [</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L646" class="LineNr"> 646 </span> <span class="Constant">" local-scope</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L647" class="LineNr"> 647 </span> <span class="Constant">" load-ingredients</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L648" class="LineNr"> 648 </span> <span class="Constant">" y:&:num <- new _elem:type</span><span class="cSpecial">\n</span><span class="Constant">"</span> @@ -722,17 +722,17 @@ if ('onhashchange' in window) { <span id="L659" class="LineNr"> 659 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L660" class="LineNr"> 660 </span> <span class="Comment">// then it should work as usual</span> <span id="L661" class="LineNr"> 661 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:foo:point"</span><span class="Delimiter">);</span> -<span id="L662" class="LineNr"> 662 </span> reagent element = 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> -<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">"x"</span><span class="Delimiter">);</span> -<span id="L664" class="LineNr"> 664 </span> CHECK_EQ<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"point"</span><span class="Delimiter">);</span> -<span id="L665" class="LineNr"> 665 </span> CHECK<span class="Delimiter">(</span>!element<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">);</span> +<span id="L662" class="LineNr"> 662 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L663" class="LineNr"> 663 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">"x"</span><span class="Delimiter">);</span> +<span id="L664" class="LineNr"> 664 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"point"</span><span class="Delimiter">);</span> +<span id="L665" class="LineNr"> 665 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!element<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">);</span> <span id="L666" class="LineNr"> 666 </span><span class="Delimiter">}</span> <span id="L667" class="LineNr"> 667 </span> <span id="L668" class="LineNr"> 668 </span><span class="Comment">//: specializing a type ingredient with a compound type</span> <span id="L669" class="LineNr"> 669 </span><span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types)</span> -<span id="L670" class="LineNr"> 670 </span><span class="muRecipe">def</span> main [ +<span id="L670" class="LineNr"> 670 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L671" class="LineNr"> 671 </span> <span class="Constant">1</span>:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> -<span id="L672" class="LineNr"> 672 </span> *<span class="Constant">1</span>:&:point<span class="Special"> <- </span>put *<span class="Constant">1</span>:&:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L672" class="LineNr"> 672 </span> *<span class="Constant">1</span>:&:point<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *<span class="Constant">1</span>:&:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L673" class="LineNr"> 673 </span> <span class="Constant">3</span>:&:point<span class="Special"> <- </span>bar <span class="Constant">1</span>:&:point <span class="Comment"># specialize _t to address:point</span> <span id="L674" class="LineNr"> 674 </span> <span class="Constant">4</span>:point<span class="Special"> <- </span>copy *<span class="Constant">3</span>:&:point <span id="L675" class="LineNr"> 675 </span>] @@ -753,15 +753,15 @@ if ('onhashchange' in window) { <span id="L690" class="LineNr"> 690 </span> load-ingredients <span id="L691" class="LineNr"> 691 </span> result<span class="Special"> <- </span>get *x<span class="Delimiter">,</span> <span class="Constant">value:offset</span> <span id="L692" class="LineNr"> 692 </span>] -<span id="L693" class="LineNr"> 693 </span><span class="muRecipe">def</span> main [ -<span id="L694" class="LineNr"> 694 </span> <span class="Constant">1</span>:&:foo:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo address point<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> +<span id="L693" class="LineNr"> 693 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L694" class="LineNr"> 694 </span> <span class="Constant">1</span>:&:foo:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo <a href='043space.cc.html#L76'>address</a> point<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> <span id="L695" class="LineNr"> 695 </span> <span class="Constant">2</span>:&:point<span class="Special"> <- </span>bar <span class="Constant">1</span>:&:foo:&:point <span id="L696" class="LineNr"> 696 </span>] <span id="L697" class="LineNr"> 697 </span><span class="Comment"># no errors; call to 'bar' successfully specialized</span> <span id="L698" class="LineNr"> 698 </span> <span id="L699" class="LineNr"> 699 </span><span class="Delimiter">:(scenario shape_shifting_recipe_error)</span> <span id="L700" class="LineNr"> 700 </span><span class="Special">% Hide_errors = true;</span> -<span id="L701" class="LineNr"> 701 </span><span class="muRecipe">def</span> main [ +<span id="L701" class="LineNr"> 701 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L702" class="LineNr"> 702 </span> <span class="Normal">a</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> <span id="L703" class="LineNr"> 703 </span> <span class="Normal">b</span>:&:num<span class="Special"> <- </span>foo a <span id="L704" class="LineNr"> 704 </span>] @@ -769,10 +769,10 @@ if ('onhashchange' in window) { <span id="L706" class="LineNr"> 706 </span> load-ingredients <span id="L707" class="LineNr"> 707 </span> b<span class="Special"> <- </span>copy a <span id="L708" class="LineNr"> 708 </span>] -<span id="L709" class="LineNr"> 709 </span><span class="traceContains">+error: main: no call found for 'b:&:num <- foo a'</span> +<span id="L709" class="LineNr"> 709 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: no call found for 'b:&:num <- foo a'</span> <span id="L710" class="LineNr"> 710 </span> <span id="L711" class="LineNr"> 711 </span><span class="Delimiter">:(scenario specialize_inside_recipe_without_header)</span> -<span id="L712" class="LineNr"> 712 </span><span class="muRecipe">def</span> main [ +<span id="L712" class="LineNr"> 712 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L713" class="LineNr"> 713 </span> foo <span class="Constant">3</span> <span id="L714" class="LineNr"> 714 </span>] <span id="L715" class="LineNr"> 715 </span><span class="muRecipe">def</span> foo [ @@ -788,7 +788,7 @@ if ('onhashchange' in window) { <span id="L725" class="LineNr"> 725 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L726" class="LineNr"> 726 </span> <span id="L727" class="LineNr"> 727 </span><span class="Delimiter">:(scenario specialize_with_literal)</span> -<span id="L728" class="LineNr"> 728 </span><span class="muRecipe">def</span> main [ +<span id="L728" class="LineNr"> 728 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L729" class="LineNr"> 729 </span> local-scope <span id="L730" class="LineNr"> 730 </span> <span class="Comment"># permit literal to map to number</span> <span id="L731" class="LineNr"> 731 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo <span class="Constant">3</span> @@ -801,7 +801,7 @@ if ('onhashchange' in window) { <span id="L738" class="LineNr"> 738 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L739" class="LineNr"> 739 </span> <span id="L740" class="LineNr"> 740 </span><span class="Delimiter">:(scenario specialize_with_literal_2)</span> -<span id="L741" class="LineNr"> 741 </span><span class="muRecipe">def</span> main [ +<span id="L741" class="LineNr"> 741 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L742" class="LineNr"> 742 </span> local-scope <span id="L743" class="LineNr"> 743 </span> <span class="Comment"># permit literal to map to character</span> <span id="L744" class="LineNr"> 744 </span> <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw <- </span>foo <span class="Constant">3</span> @@ -814,7 +814,7 @@ if ('onhashchange' in window) { <span id="L751" class="LineNr"> 751 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L752" class="LineNr"> 752 </span> <span id="L753" class="LineNr"> 753 </span><span class="Delimiter">:(scenario specialize_with_literal_3)</span> -<span id="L754" class="LineNr"> 754 </span><span class="muRecipe">def</span> main [ +<span id="L754" class="LineNr"> 754 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L755" class="LineNr"> 755 </span> local-scope <span id="L756" class="LineNr"> 756 </span> <span class="Comment"># permit '0' to map to address to shape-shifting type-ingredient</span> <span id="L757" class="LineNr"> 757 </span> <span class="Constant">1</span>:&:<span class="Normal">char</span>/<span class="Special">raw <- </span>foo <span class="Constant">0</span> @@ -829,7 +829,7 @@ if ('onhashchange' in window) { <span id="L766" class="LineNr"> 766 </span> <span id="L767" class="LineNr"> 767 </span><span class="Delimiter">:(scenario specialize_with_literal_4)</span> <span id="L768" class="LineNr"> 768 </span><span class="Special">% Hide_errors = true;</span> -<span id="L769" class="LineNr"> 769 </span><span class="muRecipe">def</span> main [ +<span id="L769" class="LineNr"> 769 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L770" class="LineNr"> 770 </span> local-scope <span id="L771" class="LineNr"> 771 </span> <span class="Comment"># ambiguous call: what's the type of its ingredient?!</span> <span id="L772" class="LineNr"> 772 </span> foo <span class="Constant">0</span> @@ -839,10 +839,10 @@ if ('onhashchange' in window) { <span id="L776" class="LineNr"> 776 </span> load-ingredients <span id="L777" class="LineNr"> 777 </span> y<span class="Special"> <- </span>copy x <span id="L778" class="LineNr"> 778 </span>] -<span id="L779" class="LineNr"> 779 </span><span class="traceContains">+error: main: instruction 'foo' has no valid specialization</span> +<span id="L779" class="LineNr"> 779 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L32'>instruction</a> 'foo' has no valid specialization</span> <span id="L780" class="LineNr"> 780 </span> <span id="L781" class="LineNr"> 781 </span><span class="Delimiter">:(scenario specialize_with_literal_5)</span> -<span id="L782" class="LineNr"> 782 </span><span class="muRecipe">def</span> main [ +<span id="L782" class="LineNr"> 782 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</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> <span id="L784" class="LineNr"> 784 </span>] <span id="L785" class="LineNr"> 785 </span><span class="muRecipe">def</span> foo x:_elem<span class="Delimiter">,</span> y:_elem [ @@ -854,7 +854,7 @@ if ('onhashchange' in window) { <span id="L791" class="LineNr"> 791 </span> <span id="L792" class="LineNr"> 792 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants)</span> <span id="L793" class="LineNr"> 793 </span><span class="Comment"># try to call two different shape-shifting recipes with the same name</span> -<span id="L794" class="LineNr"> 794 </span><span class="muRecipe">def</span> main [ +<span id="L794" class="LineNr"> 794 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L795" class="LineNr"> 795 </span> <span class="Normal">e1</span>:d1:num<span class="Special"> <- </span>merge <span class="Constant">3</span> <span id="L796" class="LineNr"> 796 </span> <span class="Normal">e2</span>:d2:num<span class="Special"> <- </span>merge <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L797" class="LineNr"> 797 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo e1 @@ -884,7 +884,7 @@ if ('onhashchange' in window) { <span id="L821" class="LineNr"> 821 </span> <span id="L822" class="LineNr"> 822 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants_2)</span> <span id="L823" class="LineNr"> 823 </span><span class="Comment"># static dispatch between shape-shifting variants, _including pointer lookups_</span> -<span id="L824" class="LineNr"> 824 </span><span class="muRecipe">def</span> main [ +<span id="L824" class="LineNr"> 824 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L825" class="LineNr"> 825 </span> <span class="Normal">e1</span>:d1:num<span class="Special"> <- </span>merge <span class="Constant">3</span> <span id="L826" class="LineNr"> 826 </span> <span class="Normal">e2</span>:&:d2:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>d2 number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> <span id="L827" class="LineNr"> 827 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo e1 @@ -912,7 +912,7 @@ if ('onhashchange' in window) { <span id="L849" class="LineNr"> 849 </span> <span id="L850" class="LineNr"> 850 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe)</span> <span id="L851" class="LineNr"> 851 </span><span class="Special">% Hide_errors = true;</span> -<span id="L852" class="LineNr"> 852 </span><span class="muRecipe">def</span> main [ +<span id="L852" class="LineNr"> 852 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L853" class="LineNr"> 853 </span> <span class="Normal">a</span>:d1:num<span class="Special"> <- </span>merge <span class="Constant">3</span> <span id="L854" class="LineNr"> 854 </span> foo a <span id="L855" class="LineNr"> 855 </span>] @@ -931,7 +931,7 @@ if ('onhashchange' in window) { <span id="L868" class="LineNr"> 868 </span> <span id="L869" class="LineNr"> 869 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe_2)</span> <span id="L870" class="LineNr"> 870 </span><span class="Special">% Hide_errors = true;</span> -<span id="L871" class="LineNr"> 871 </span><span class="muRecipe">def</span> main [ +<span id="L871" class="LineNr"> 871 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L872" class="LineNr"> 872 </span> <span class="Normal">a</span>:d1:num<span class="Special"> <- </span>merge <span class="Constant">3</span> <span id="L873" class="LineNr"> 873 </span> foo a <span id="L874" class="LineNr"> 874 </span>] @@ -950,7 +950,7 @@ if ('onhashchange' in window) { <span id="L887" class="LineNr"> 887 </span> <span id="L888" class="LineNr"> 888 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L889" class="LineNr"> 889 </span><span class="Delimiter">:(scenario specialize_recursive_shape_shifting_recipe)</span> -<span id="L890" class="LineNr"> 890 </span><span class="muRecipe">def</span> main [ +<span id="L890" class="LineNr"> 890 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L891" class="LineNr"> 891 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L892" class="LineNr"> 892 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>foo <span class="Constant">1</span>:num <span id="L893" class="LineNr"> 893 </span>] @@ -968,7 +968,7 @@ if ('onhashchange' in window) { <span id="L905" class="LineNr"> 905 </span> <span id="L906" class="LineNr"> 906 </span><span class="Delimiter">:(scenarios run)</span> <span id="L907" class="LineNr"> 907 </span><span class="Delimiter">:(scenario specialize_most_similar_variant)</span> -<span id="L908" class="LineNr"> 908 </span><span class="muRecipe">def</span> main [ +<span id="L908" class="LineNr"> 908 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L909" class="LineNr"> 909 </span> <span class="Constant">1</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L910" class="LineNr"> 910 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>foo <span class="Constant">1</span>:&:num <span id="L911" class="LineNr"> 911 </span>] @@ -986,7 +986,7 @@ if ('onhashchange' in window) { <span id="L923" class="LineNr"> 923 </span> <span id="L924" class="LineNr"> 924 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_2)</span> <span id="L925" class="LineNr"> 925 </span><span class="Comment"># version with headers padded with lots of unrelated concrete types</span> -<span id="L926" class="LineNr"> 926 </span><span class="muRecipe">def</span> main [ +<span id="L926" class="LineNr"> 926 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L927" class="LineNr"> 927 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">23</span> <span id="L928" class="LineNr"> 928 </span> <span class="Constant">2</span>:&:@:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L929" class="LineNr"> 929 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>foo <span class="Constant">2</span>:&:@:num<span class="Delimiter">,</span> <span class="Constant">1</span>:num @@ -1007,7 +1007,7 @@ if ('onhashchange' in window) { <span id="L944" class="LineNr"> 944 </span><span class="traceContains">+mem: storing 34 in location 3</span> <span id="L945" class="LineNr"> 945 </span> <span id="L946" class="LineNr"> 946 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_3)</span> -<span id="L947" class="LineNr"> 947 </span><span class="muRecipe">def</span> main [ +<span id="L947" class="LineNr"> 947 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L948" class="LineNr"> 948 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] <span id="L949" class="LineNr"> 949 </span> foo <span class="Constant">1</span>:text <span id="L950" class="LineNr"> 950 </span>] @@ -1021,7 +1021,7 @@ if ('onhashchange' in window) { <span id="L958" class="LineNr"> 958 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L959" class="LineNr"> 959 </span> <span id="L960" class="LineNr"> 960 </span><span class="Delimiter">:(scenario specialize_literal_as_number)</span> -<span id="L961" class="LineNr"> 961 </span><span class="muRecipe">def</span> main [ +<span id="L961" class="LineNr"> 961 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L962" class="LineNr"> 962 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>foo <span class="Constant">23</span> <span id="L963" class="LineNr"> 963 </span>] <span id="L964" class="LineNr"> 964 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -> </span>y:num [ @@ -1038,7 +1038,7 @@ if ('onhashchange' in window) { <span id="L975" class="LineNr"> 975 </span> <span id="L976" class="LineNr"> 976 </span><span class="Delimiter">:(scenario specialize_literal_as_number_2)</span> <span id="L977" class="LineNr"> 977 </span><span class="Comment"># version calling with literal</span> -<span id="L978" class="LineNr"> 978 </span><span class="muRecipe">def</span> main [ +<span id="L978" class="LineNr"> 978 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L979" class="LineNr"> 979 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>foo <span class="Constant">0</span> <span id="L980" class="LineNr"> 980 </span>] <span id="L981" class="LineNr"> 981 </span><span class="Comment"># variant with concrete type</span> @@ -1057,7 +1057,7 @@ if ('onhashchange' in window) { <span id="L994" class="LineNr"> 994 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L995" class="LineNr"> 995 </span> <span id="L996" class="LineNr"> 996 </span><span class="Delimiter">:(scenario specialize_literal_as_address)</span> -<span id="L997" class="LineNr"> 997 </span><span class="muRecipe">def</span> main [ +<span id="L997" class="LineNr"> 997 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L998" class="LineNr"> 998 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>foo <span class="Constant">0</span> <span id="L999" class="LineNr"> 999 </span>] <span id="L1000" class="LineNr">1000 </span><span class="Comment"># variant with concrete address type</span> @@ -1084,7 +1084,7 @@ if ('onhashchange' in window) { <span id="L1021" class="LineNr">1021 </span><span class="muData">container</span> foo2 [ <span id="L1022" class="LineNr">1022 </span> <span class="Normal">z</span>:num <span id="L1023" class="LineNr">1023 </span>] -<span id="L1024" class="LineNr">1024 </span><span class="muRecipe">def</span> main [ +<span id="L1024" class="LineNr">1024 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1025" class="LineNr">1025 </span> local-scope <span id="L1026" class="LineNr">1026 </span> <span class="Normal">x</span>:foo2<span class="Special"> <- </span>merge <span class="Constant">34</span> <span id="L1027" class="LineNr">1027 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>get x<span class="Delimiter">,</span> z:offse <span class="Comment"># typo in 'offset'</span> @@ -1104,7 +1104,7 @@ if ('onhashchange' in window) { <span id="L1041" class="LineNr">1041 </span><span class="muData">container</span> foo2 [ <span id="L1042" class="LineNr">1042 </span> <span class="Normal">z</span>:num <span id="L1043" class="LineNr">1043 </span>] -<span id="L1044" class="LineNr">1044 </span><span class="muRecipe">def</span> main [ +<span id="L1044" class="LineNr">1044 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1045" class="LineNr">1045 </span> local-scope <span id="L1046" class="LineNr">1046 </span> <span class="Normal">x</span>:foo2<span class="Special"> <- </span>merge <span class="Constant">34</span> <span id="L1047" class="LineNr">1047 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>get x<span class="Delimiter">,</span> z:offse <span class="Comment"># typo in 'offset'</span> @@ -1127,7 +1127,7 @@ if ('onhashchange' in window) { <span id="L1064" class="LineNr">1064 </span> <span class="Normal">b</span>:_elem<span class="Special"> <- </span>copy a <span id="L1065" class="LineNr">1065 </span>] <span id="L1066" class="LineNr">1066 </span><span class="Comment"># trigger specialization</span> -<span id="L1067" class="LineNr">1067 </span><span class="muRecipe">def</span> main [ +<span id="L1067" class="LineNr">1067 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1068" class="LineNr">1068 </span> local-scope <span id="L1069" class="LineNr">1069 </span> foo <span class="Constant">34</span> <span id="L1070" class="LineNr">1070 </span>] @@ -1145,7 +1145,7 @@ if ('onhashchange' in window) { <span id="L1082" class="LineNr">1082 </span> <span class="Normal">b</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># type abbreviation</span> <span id="L1083" class="LineNr">1083 </span>] <span id="L1084" class="LineNr">1084 </span><span class="Comment"># trigger specialization</span> -<span id="L1085" class="LineNr">1085 </span><span class="muRecipe">def</span> main [ +<span id="L1085" class="LineNr">1085 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1086" class="LineNr">1086 </span> local-scope <span id="L1087" class="LineNr">1087 </span> foo <span class="Constant">34</span> <span id="L1088" class="LineNr">1088 </span>] @@ -1156,7 +1156,7 @@ if ('onhashchange' in window) { <span id="L1093" class="LineNr">1093 </span><span class="muRecipe">def</span> add a:&:foo:_elem [ <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] <span id="L1095" class="LineNr">1095 </span>] -<span id="L1096" class="LineNr">1096 </span><span class="muRecipe">def</span> main [ +<span id="L1096" class="LineNr">1096 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1097" class="LineNr">1097 </span> <span class="Comment"># call primitive add with literal 0</span> <span id="L1098" class="LineNr">1098 </span> add <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L1099" class="LineNr">1099 </span>] diff --git a/html/057immutable.cc.html b/html/057immutable.cc.html index f54f4126..d3807446 100644 --- a/html/057immutable.cc.html +++ b/html/057immutable.cc.html @@ -66,7 +66,7 @@ if ('onhashchange' in window) { <span id="L6" class="LineNr"> 6 </span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products)</span> <span id="L8" class="LineNr"> 8 </span><span class="Comment"># mutable container</span> -<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> main [ +<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L10" class="LineNr"> 10 </span> local-scope <span id="L11" class="LineNr"> 11 </span> <span class="Normal">p</span>:point<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L12" class="LineNr"> 12 </span> p<span class="Special"> <- </span>foo p @@ -74,12 +74,12 @@ if ('onhashchange' in window) { <span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> foo p:point<span class="muRecipe"> -> </span>p:point [ <span id="L15" class="LineNr"> 15 </span> local-scope <span id="L16" class="LineNr"> 16 </span> load-ingredients -<span id="L17" class="LineNr"> 17 </span> p<span class="Special"> <- </span>put p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L17" class="LineNr"> 17 </span> p<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L18" class="LineNr"> 18 </span>] <span id="L19" class="LineNr"> 19 </span>$error: <span class="Constant">0</span> <span id="L20" class="LineNr"> 20 </span> <span id="L21" class="LineNr"> 21 </span><span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products_2)</span> -<span id="L22" class="LineNr"> 22 </span><span class="muRecipe">def</span> main [ +<span id="L22" class="LineNr"> 22 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L23" class="LineNr"> 23 </span> local-scope <span id="L24" class="LineNr"> 24 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span id="L25" class="LineNr"> 25 </span> p<span class="Special"> <- </span>foo p @@ -88,12 +88,12 @@ if ('onhashchange' in window) { <span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> foo p:&:point<span class="muRecipe"> -> </span>p:&:point [ <span id="L29" class="LineNr"> 29 </span> local-scope <span id="L30" class="LineNr"> 30 </span> load-ingredients -<span id="L31" class="LineNr"> 31 </span> *p<span class="Special"> <- </span>put *p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L31" class="LineNr"> 31 </span> *p<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *p<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L32" class="LineNr"> 32 </span>] <span id="L33" class="LineNr"> 33 </span>$error: <span class="Constant">0</span> <span id="L34" class="LineNr"> 34 </span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(scenario can_modify_ingredients_that_are_also_products_3)</span> -<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> main [ +<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L37" class="LineNr"> 37 </span> local-scope <span id="L38" class="LineNr"> 38 </span> <span class="Normal">p</span>:&:@:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> <span id="L39" class="LineNr"> 39 </span> p<span class="Special"> <- </span>foo p @@ -107,7 +107,7 @@ if ('onhashchange' in window) { <span id="L47" class="LineNr"> 47 </span>$error: <span class="Constant">0</span> <span id="L48" class="LineNr"> 48 </span> <span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(scenario ignore_literal_ingredients_for_immutability_checks)</span> -<span id="L50" class="LineNr"> 50 </span><span class="muRecipe">def</span> main [ +<span id="L50" class="LineNr"> 50 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L51" class="LineNr"> 51 </span> local-scope <span id="L52" class="LineNr"> 52 </span> <span class="Normal">p</span>:&:d1<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">d1:type</span> <span id="L53" class="LineNr"> 53 </span> <span class="Normal">q</span>:num<span class="Special"> <- </span>foo p @@ -116,7 +116,7 @@ if ('onhashchange' in window) { <span id="L56" class="LineNr"> 56 </span> local-scope <span id="L57" class="LineNr"> 57 </span> load-ingredients <span id="L58" class="LineNr"> 58 </span> <span class="Normal">x</span>:&:d1<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">d1:type</span> -<span id="L59" class="LineNr"> 59 </span> *x<span class="Special"> <- </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 id="L59" class="LineNr"> 59 </span> *x<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *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 id="L60" class="LineNr"> 60 </span> <span class="Identifier">return</span> <span class="Constant">36</span> <span id="L61" class="LineNr"> 61 </span>] <span id="L62" class="LineNr"> 62 </span><span class="muData">container</span> d1 [ @@ -127,7 +127,7 @@ if ('onhashchange' in window) { <span id="L67" class="LineNr"> 67 </span> <span id="L68" class="LineNr"> 68 </span><span class="Delimiter">:(scenario cannot_modify_immutable_ingredients)</span> <span id="L69" class="LineNr"> 69 </span><span class="Special">% Hide_errors = true;</span> -<span id="L70" class="LineNr"> 70 </span><span class="muRecipe">def</span> main [ +<span id="L70" class="LineNr"> 70 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L71" class="LineNr"> 71 </span> local-scope <span id="L72" class="LineNr"> 72 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L73" class="LineNr"> 73 </span> foo x @@ -138,11 +138,11 @@ if ('onhashchange' in window) { <span id="L78" class="LineNr"> 78 </span> load-ingredients <span id="L79" class="LineNr"> 79 </span> *x<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L80" class="LineNr"> 80 </span>] -<span id="L81" class="LineNr"> 81 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x <- copy 34' because it's an ingredient of recipe foo but not also a product</span> +<span id="L81" class="LineNr"> 81 </span><span class="traceContains">+error: foo: cannot modify 'x' in <a href='010vm.cc.html#L32'>instruction</a> '*x <- copy 34' because it's an ingredient of recipe foo but not also a product</span> <span id="L82" class="LineNr"> 82 </span> <span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(scenario cannot_modify_immutable_containers)</span> <span id="L84" class="LineNr"> 84 </span><span class="Special">% Hide_errors = true;</span> -<span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> main [ +<span id="L85" class="LineNr"> 85 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L86" class="LineNr"> 86 </span> local-scope <span id="L87" class="LineNr"> 87 </span> <span class="Normal">x</span>:point-number<span class="Special"> <- </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> <span id="L88" class="LineNr"> 88 </span> foo x @@ -156,12 +156,12 @@ if ('onhashchange' in window) { <span id="L96" class="LineNr"> 96 </span> <span class="Comment"># modify the element: boom</span> <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> <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> -<span id="L99" class="LineNr"> 99 </span> y<span class="Special"> <- </span>put y<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">37</span> +<span id="L99" class="LineNr"> 99 </span> y<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> y<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">37</span> <span id="L100" class="LineNr">100 </span>] -<span id="L101" class="LineNr">101 </span><span class="traceContains">+error: foo: cannot modify 'y' in instruction 'y <- put y, x:offset, 37' because that would modify 'x' which is an ingredient of recipe foo but not also a product</span> +<span id="L101" class="LineNr">101 </span><span class="traceContains">+error: foo: cannot modify 'y' in <a href='010vm.cc.html#L32'>instruction</a> 'y <- put y, x:offset, 37' because that would modify 'x' which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> foo but not also a product</span> <span id="L102" class="LineNr">102 </span> <span id="L103" class="LineNr">103 </span><span class="Delimiter">:(scenario can_modify_immutable_pointers)</span> -<span id="L104" class="LineNr">104 </span><span class="muRecipe">def</span> main [ +<span id="L104" class="LineNr">104 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L105" class="LineNr">105 </span> local-scope <span id="L106" class="LineNr">106 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L107" class="LineNr">107 </span> foo x @@ -176,7 +176,7 @@ if ('onhashchange' in window) { <span id="L116" class="LineNr">116 </span> <span id="L117" class="LineNr">117 </span><span class="Delimiter">:(scenario can_modify_immutable_pointers_but_not_their_payloads)</span> <span id="L118" class="LineNr">118 </span><span class="Special">% Hide_errors = true;</span> -<span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> main [ +<span id="L119" class="LineNr">119 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L120" class="LineNr">120 </span> local-scope <span id="L121" class="LineNr">121 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L122" class="LineNr">122 </span> foo x @@ -190,11 +190,11 @@ if ('onhashchange' in window) { <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> <span id="L131" class="LineNr">131 </span> *x<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L132" class="LineNr">132 </span>] -<span id="L133" class="LineNr">133 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x <- copy 34' because it's an ingredient of recipe foo but not also a product</span> +<span id="L133" class="LineNr">133 </span><span class="traceContains">+error: foo: cannot modify 'x' in <a href='010vm.cc.html#L32'>instruction</a> '*x <- copy 34' because it's an ingredient of recipe foo but not also a product</span> <span id="L134" class="LineNr">134 </span> <span id="L135" class="LineNr">135 </span><span class="Delimiter">:(scenario cannot_call_mutating_recipes_on_immutable_ingredients)</span> <span id="L136" class="LineNr">136 </span><span class="Special">% Hide_errors = true;</span> -<span id="L137" class="LineNr">137 </span><span class="muRecipe">def</span> main [ +<span id="L137" class="LineNr">137 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L138" class="LineNr">138 </span> local-scope <span id="L139" class="LineNr">139 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span id="L140" class="LineNr">140 </span> foo p @@ -210,11 +210,11 @@ if ('onhashchange' in window) { <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> <span id="L151" class="LineNr">151 </span> <span class="Comment"># mutable in the header</span> <span id="L152" class="LineNr">152 </span>] -<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> +<span id="L153" class="LineNr">153 </span><span class="traceContains">+error: foo: cannot modify 'p' in <a href='010vm.cc.html#L32'>instruction</a> 'bar p' because it's an ingredient of recipe foo but not also a product</span> <span id="L154" class="LineNr">154 </span> <span id="L155" class="LineNr">155 </span><span class="Delimiter">:(scenario cannot_modify_copies_of_immutable_ingredients)</span> <span id="L156" class="LineNr">156 </span><span class="Special">% Hide_errors = true;</span> -<span id="L157" class="LineNr">157 </span><span class="muRecipe">def</span> main [ +<span id="L157" class="LineNr">157 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L158" class="LineNr">158 </span> local-scope <span id="L159" class="LineNr">159 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span id="L160" class="LineNr">160 </span> foo p @@ -223,12 +223,12 @@ if ('onhashchange' in window) { <span id="L163" class="LineNr">163 </span> local-scope <span id="L164" class="LineNr">164 </span> load-ingredients <span id="L165" class="LineNr">165 </span> <span class="Normal">q</span>:&:point<span class="Special"> <- </span>copy p -<span id="L166" class="LineNr">166 </span> *q<span class="Special"> <- </span>put *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L166" class="LineNr">166 </span> *q<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L167" class="LineNr">167 </span>] -<span id="L168" class="LineNr">168 </span><span class="traceContains">+error: foo: cannot modify 'q' in instruction '*q <- put *q, x:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product</span> +<span id="L168" class="LineNr">168 </span><span class="traceContains">+error: foo: cannot modify 'q' in <a href='010vm.cc.html#L32'>instruction</a> '*q <- put *q, x:offset, 34' because that would modify p which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> foo but not also a product</span> <span id="L169" class="LineNr">169 </span> <span id="L170" class="LineNr">170 </span><span class="Delimiter">:(scenario can_modify_copies_of_mutable_ingredients)</span> -<span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> main [ +<span id="L171" class="LineNr">171 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L172" class="LineNr">172 </span> local-scope <span id="L173" class="LineNr">173 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span id="L174" class="LineNr">174 </span> foo p @@ -237,7 +237,7 @@ if ('onhashchange' in window) { <span id="L177" class="LineNr">177 </span> local-scope <span id="L178" class="LineNr">178 </span> load-ingredients <span id="L179" class="LineNr">179 </span> <span class="Normal">q</span>:&:point<span class="Special"> <- </span>copy p -<span id="L180" class="LineNr">180 </span> *q<span class="Special"> <- </span>put *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L180" class="LineNr">180 </span> *q<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *q<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L181" class="LineNr">181 </span>] <span id="L182" class="LineNr">182 </span>$error: <span class="Constant">0</span> <span id="L183" class="LineNr">183 </span> @@ -246,7 +246,7 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr">186 </span><span class="muData">container</span> foo [ <span id="L187" class="LineNr">187 </span> <span class="Normal">x</span>:&:@:num <span class="Comment"># contains an address</span> <span id="L188" class="LineNr">188 </span>] -<span id="L189" class="LineNr">189 </span><span class="muRecipe">def</span> main [ +<span id="L189" class="LineNr">189 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L190" class="LineNr">190 </span> <span class="Comment"># don't run anything</span> <span id="L191" class="LineNr">191 </span>] <span id="L192" class="LineNr">192 </span><span class="muRecipe">def</span> foo a:&:foo [ @@ -255,13 +255,13 @@ if ('onhashchange' in window) { <span id="L195" class="LineNr">195 </span> <span class="Normal">x</span>:&:@:num<span class="Special"> <- </span>get *a<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span class="Comment"># just a regular get of the container</span> <span id="L196" class="LineNr">196 </span> *x<span class="Special"> <- </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 id="L197" class="LineNr">197 </span>] -<span id="L198" class="LineNr">198 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x <- put-index *x, 0, 34' because that would modify a which is an ingredient of recipe foo but not also a product</span> +<span id="L198" class="LineNr">198 </span><span class="traceContains">+error: foo: cannot modify 'x' in <a href='010vm.cc.html#L32'>instruction</a> '*x <- put-index *x, 0, 34' because that would modify a which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> foo but not also a product</span> <span id="L199" class="LineNr">199 </span> <span id="L200" class="LineNr">200 </span><span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_2)</span> <span id="L201" class="LineNr">201 </span><span class="muData">container</span> foo [ <span id="L202" class="LineNr">202 </span> <span class="Normal">x</span>:&:@:num <span class="Comment"># contains an address</span> <span id="L203" class="LineNr">203 </span>] -<span id="L204" class="LineNr">204 </span><span class="muRecipe">def</span> main [ +<span id="L204" class="LineNr">204 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L205" class="LineNr">205 </span> <span class="Comment"># don't run anything</span> <span id="L206" class="LineNr">206 </span>] <span id="L207" class="LineNr">207 </span><span class="muRecipe">def</span> foo a:&:foo [ @@ -276,7 +276,7 @@ if ('onhashchange' in window) { <span id="L216" class="LineNr">216 </span> <span id="L217" class="LineNr">217 </span><span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_3)</span> <span id="L218" class="LineNr">218 </span><span class="Special">% Hide_errors = true;</span> -<span id="L219" class="LineNr">219 </span><span class="muRecipe">def</span> main [ +<span id="L219" class="LineNr">219 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L220" class="LineNr">220 </span> <span class="Comment"># don't run anything</span> <span id="L221" class="LineNr">221 </span>] <span id="L222" class="LineNr">222 </span><span class="muRecipe">def</span> foo a:&:@:&:num [ @@ -285,16 +285,16 @@ if ('onhashchange' in window) { <span id="L225" class="LineNr">225 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span>index *a<span class="Delimiter">,</span> <span class="Constant">0</span> <span class="Comment"># just a regular index of the array</span> <span id="L226" class="LineNr">226 </span> *x<span class="Special"> <- </span>copy <span class="Constant">34</span> <span class="Comment"># but then modify the result</span> <span id="L227" class="LineNr">227 </span>] -<span id="L228" class="LineNr">228 </span><span class="traceContains">+error: foo: cannot modify 'x' in instruction '*x <- copy 34' because that would modify a which is an ingredient of recipe foo but not also a product</span> +<span id="L228" class="LineNr">228 </span><span class="traceContains">+error: foo: cannot modify 'x' in <a href='010vm.cc.html#L32'>instruction</a> '*x <- copy 34' because that would modify a which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> foo but not also a product</span> <span id="L229" class="LineNr">229 </span> <span id="L230" class="LineNr">230 </span><span class="Delimiter">:(scenario cannot_modify_address_inside_immutable_ingredients_4)</span> -<span id="L231" class="LineNr">231 </span><span class="muRecipe">def</span> main [ +<span id="L231" class="LineNr">231 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L232" class="LineNr">232 </span> <span class="Comment"># don't run anything</span> <span id="L233" class="LineNr">233 </span>] <span id="L234" class="LineNr">234 </span><span class="muRecipe">def</span> foo a:&:@:&:num [ <span id="L235" class="LineNr">235 </span> local-scope <span id="L236" class="LineNr">236 </span> load-ingredients -<span id="L237" class="LineNr">237 </span> <span class="Normal">b</span>:&:@:&:num<span class="Special"> <- </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 id="L237" class="LineNr">237 </span> <span class="Normal">b</span>:&:@:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Delimiter">{(</span><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span>: type<span class="Delimiter">},</span> <span class="Constant">3</span> <span id="L238" class="LineNr">238 </span> <span class="Comment"># modify b, completely unrelated to immutable ingredient a</span> <span id="L239" class="LineNr">239 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span>index *b<span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L240" class="LineNr">240 </span> *x<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -302,7 +302,7 @@ if ('onhashchange' in window) { <span id="L242" class="LineNr">242 </span>$error: <span class="Constant">0</span> <span id="L243" class="LineNr">243 </span> <span id="L244" class="LineNr">244 </span><span class="Delimiter">:(scenario latter_ingredient_of_index_is_immutable)</span> -<span id="L245" class="LineNr">245 </span><span class="muRecipe">def</span> main [ +<span id="L245" class="LineNr">245 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L246" class="LineNr">246 </span> <span class="Comment"># don't run anything</span> <span id="L247" class="LineNr">247 </span>] <span id="L248" class="LineNr">248 </span><span class="muRecipe">def</span> foo a:&:@:&:@:num<span class="Delimiter">,</span> b:num<span class="muRecipe"> -> </span>a:&:@:&:@:num [ @@ -317,7 +317,7 @@ if ('onhashchange' in window) { <span id="L257" class="LineNr">257 </span><span class="muData">container</span> test-list [ <span id="L258" class="LineNr">258 </span> <span class="Normal">next</span>:&:test-list <span id="L259" class="LineNr">259 </span>] -<span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> main [ +<span id="L260" class="LineNr">260 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L261" class="LineNr">261 </span> local-scope <span id="L262" class="LineNr">262 </span> <span class="Normal">p</span>:&:test-list<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span> <span id="L263" class="LineNr">263 </span> foo p @@ -335,7 +335,7 @@ if ('onhashchange' in window) { <span id="L275" class="LineNr">275 </span>$error: <span class="Constant">0</span> <span id="L276" class="LineNr">276 </span> <span id="L277" class="LineNr">277 </span><span class="Delimiter">:(scenario treat_optional_ingredients_as_mutable)</span> -<span id="L278" class="LineNr">278 </span><span class="muRecipe">def</span> main [ +<span id="L278" class="LineNr">278 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L279" class="LineNr">279 </span> <span class="Normal">k</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L280" class="LineNr">280 </span> test k <span id="L281" class="LineNr">281 </span>] @@ -356,7 +356,7 @@ if ('onhashchange' in window) { <span id="L296" class="LineNr">296 </span> <span id="L297" class="LineNr">297 </span><span class="Delimiter">:(scenario treat_optional_ingredients_as_mutable_2)</span> <span id="L298" class="LineNr">298 </span><span class="Special">% Hide_errors = true;</span> -<span id="L299" class="LineNr">299 </span><span class="muRecipe">def</span> main [ +<span id="L299" class="LineNr">299 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L300" class="LineNr">300 </span> local-scope <span id="L301" class="LineNr">301 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span id="L302" class="LineNr">302 </span> foo p @@ -371,11 +371,11 @@ if ('onhashchange' in window) { <span id="L311" class="LineNr">311 </span> load-ingredients <span id="L312" class="LineNr">312 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span>next-ingredient <span class="Comment"># optional ingredient; assumed to be mutable</span> <span id="L313" class="LineNr">313 </span>] -<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> +<span id="L314" class="LineNr">314 </span><span class="traceContains">+error: foo: cannot modify 'p' in <a href='010vm.cc.html#L32'>instruction</a> 'bar p' because it's an ingredient of recipe foo but not also a product</span> <span id="L315" class="LineNr">315 </span> <span id="L316" class="LineNr">316 </span><span class="Comment">//: when checking for immutable ingredients, remember to take space into account</span> <span id="L317" class="LineNr">317 </span><span class="Delimiter">:(scenario check_space_of_reagents_in_immutability_checks)</span> -<span id="L318" class="LineNr">318 </span><span class="muRecipe">def</span> main [ +<span id="L318" class="LineNr">318 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L319" class="LineNr">319 </span> <span class="Normal">a</span>:space<span class="Special"> <- </span><span class="Normal">new</span>-closure <span id="L320" class="LineNr">320 </span> <span class="Normal">b</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L321" class="LineNr">321 </span> run-closure b:&:num<span class="Delimiter">,</span> a:space @@ -395,39 +395,39 @@ if ('onhashchange' in window) { <span id="L335" class="LineNr">335 </span>$error: <span class="Constant">0</span> <span id="L336" class="LineNr">336 </span> <span id="L337" class="LineNr">337 </span><span class="Delimiter">:(before "End Transforms")</span> -<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> +<span id="L338" class="LineNr">338 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='057immutable.cc.html#L341'>check_immutable_ingredients</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L339" class="LineNr">339 </span> <span id="L340" class="LineNr">340 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L341" class="LineNr">341 </span><span class="Normal">void</span> <a href='057immutable.cc.html#L341'>check_immutable_ingredients</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L342" class="LineNr">342 </span> <span class="Comment">// to ensure an address reagent isn't modified, it suffices to show that</span> <span id="L343" class="LineNr">343 </span> <span class="Comment">// a) we never write to its contents directly,</span> <span id="L344" class="LineNr">344 </span> <span class="Comment">// b) we never call 'put' or 'put-index' on it, and</span> <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> <span id="L346" class="LineNr">346 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L347" class="LineNr">347 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check mutability of ingredients in recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L347" class="LineNr">347 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check mutability of ingredients in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="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> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L350" class="LineNr">350 </span> <span class="Normal">const</span> reagent& current_ingredient = caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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> +<span id="L351" class="LineNr">351 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='057immutable.cc.html#L496'>is_present_in_products</a><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 id="L352" class="LineNr">352 </span> <span class="Comment">// End Immutable Ingredients Special-cases</span> <span id="L353" class="LineNr">353 </span> set<reagent> immutable_vars<span class="Delimiter">;</span> <span id="L354" class="LineNr">354 </span> immutable_vars<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L356" class="LineNr">356 </span> <span class="Normal">const</span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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> -<span id="L358" class="LineNr">358 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == INDEX && SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</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 == current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L359" class="LineNr">359 </span> update_aliases<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> immutable_vars<span class="Delimiter">);</span> +<span id="L357" class="LineNr">357 </span> <a href='057immutable.cc.html#L438'>check_immutable_ingredient_in_instruction</a><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 id="L358" class="LineNr">358 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation == INDEX && <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</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 == current_ingredient<span class="Delimiter">.</span>name<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L359" class="LineNr">359 </span> <a href='057immutable.cc.html#L364'>update_aliases</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> immutable_vars<span class="Delimiter">);</span> <span id="L360" class="LineNr">360 </span> <span class="Delimiter">}</span> <span id="L361" class="LineNr">361 </span> <span class="Delimiter">}</span> <span id="L362" class="LineNr">362 </span><span class="Delimiter">}</span> <span id="L363" class="LineNr">363 </span> -<span id="L364" class="LineNr">364 </span><span class="Normal">void</span> update_aliases<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> set<reagent>& current_ingredient_and_aliases<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L365" class="LineNr">365 </span> set<<span class="Normal">int</span>> current_ingredient_indices = ingredient_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span> +<span id="L364" class="LineNr">364 </span><span class="Normal">void</span> <a href='057immutable.cc.html#L364'>update_aliases</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> set<reagent>& current_ingredient_and_aliases<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L365" class="LineNr">365 </span> set<<span class="Normal">int</span>> current_ingredient_indices = <a href='057immutable.cc.html#L504'>ingredient_indices</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span> <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> <span id="L367" class="LineNr">367 </span> <span class="Comment">// primitive recipe</span> <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> -<span id="L369" class="LineNr">369 </span> <span class="Normal">case</span> COPY: -<span id="L370" class="LineNr">370 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::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 id="L369" class="LineNr">369 </span> <span class="Normal">case</span> <a href='010vm.cc.html#L190'>COPY</a>: +<span id="L370" class="LineNr">370 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::iterator p = current_ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != current_ingredient_indices<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <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> <span id="L372" class="LineNr">372 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L373" class="LineNr">373 </span> <span class="Normal">case</span> GET: @@ -444,26 +444,26 @@ if ('onhashchange' in window) { <span id="L384" class="LineNr">384 </span> <span class="Delimiter">}</span> <span id="L385" class="LineNr">385 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L386" class="LineNr">386 </span> <span class="Comment">// defined recipe</span> -<span id="L387" class="LineNr">387 </span> set<<span class="Normal">int</span>> 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 id="L388" class="LineNr">388 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::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 id="L389" class="LineNr">389 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*p < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span> +<span id="L387" class="LineNr">387 </span> set<<span class="Normal">int</span>> contained_in_product_indices = <a href='057immutable.cc.html#L395'>scan_contained_in_product_indices</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_indices<span class="Delimiter">);</span> +<span id="L388" class="LineNr">388 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::iterator p = contained_in_product_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != contained_in_product_indices<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L389" class="LineNr">389 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*p < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <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> <span id="L391" class="LineNr">391 </span> <span class="Delimiter">}</span> <span id="L392" class="LineNr">392 </span> <span class="Delimiter">}</span> <span id="L393" class="LineNr">393 </span><span class="Delimiter">}</span> <span id="L394" class="LineNr">394 </span> -<span id="L395" class="LineNr">395 </span>set<<span class="Normal">int</span>> scan_contained_in_product_indices<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> set<<span class="Normal">int</span>>& ingredient_indices<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L395" class="LineNr">395 </span>set<<span class="Normal">int</span>> <a href='057immutable.cc.html#L395'>scan_contained_in_product_indices</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> set<<span class="Normal">int</span>>& <a href='057immutable.cc.html#L504'>ingredient_indices</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L396" class="LineNr">396 </span> set<reagent> selected_ingredients<span class="Delimiter">;</span> <span id="L397" class="LineNr">397 </span> <span class="Normal">const</span> recipe& callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">);</span> -<span id="L398" class="LineNr">398 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::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 id="L399" class="LineNr">399 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*p >= 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> +<span id="L398" class="LineNr">398 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::iterator p = <a href='057immutable.cc.html#L504'>ingredient_indices</a><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != <a href='057immutable.cc.html#L504'>ingredient_indices</a><span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L399" class="LineNr">399 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*p >= <a href='001help.cc.html#L138'>SIZE</a><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> <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> <span id="L401" class="LineNr">401 </span> <span class="Delimiter">}</span> <span id="L402" class="LineNr">402 </span> set<<span class="Normal">int</span>> result<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L404" class="LineNr">404 </span> <span class="Normal">const</span> reagent& current_product = callee<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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">"contained-in"</span><span class="Delimiter">);</span> -<span id="L406" class="LineNr">406 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contained_in_name && selected_ingredients<span class="Delimiter">.</span>find<span class="Delimiter">(</span>contained_in_name<span class="Delimiter">-></span>value<span class="Delimiter">)</span> != selected_ingredients<span class="Delimiter">.</span>end<span class="Delimiter">())</span> +<span id="L406" class="LineNr">406 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contained_in_name && selected_ingredients<span class="Delimiter">.</span>find<span class="Delimiter">(</span>contained_in_name<span class="Delimiter">-></span>value<span class="Delimiter">)</span> != selected_ingredients<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span id="L407" class="LineNr">407 </span> result<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L408" class="LineNr">408 </span> <span class="Delimiter">}</span> <span id="L409" class="LineNr">409 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> @@ -476,7 +476,7 @@ if ('onhashchange' in window) { <span id="L416" class="LineNr">416 </span> <span class="Normal">value</span>:num <span id="L417" class="LineNr">417 </span> <span class="Normal">next</span>:&:test-list <span id="L418" class="LineNr">418 </span>] -<span id="L419" class="LineNr">419 </span><span class="muRecipe">def</span> main [ +<span id="L419" class="LineNr">419 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L420" class="LineNr">420 </span> local-scope <span id="L421" class="LineNr">421 </span> <span class="Normal">p</span>:&:test-list<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span> <span id="L422" class="LineNr">422 </span> foo p @@ -485,33 +485,33 @@ if ('onhashchange' in window) { <span id="L425" class="LineNr">425 </span> local-scope <span id="L426" class="LineNr">426 </span> load-ingredients <span id="L427" class="LineNr">427 </span> <span class="Normal">p2</span>:&:test-list<span class="Special"> <- </span>test-next p <span class="Comment"># p2 is immutable</span> -<span id="L428" class="LineNr">428 </span> *p2<span class="Special"> <- </span>put *p2<span class="Delimiter">,</span> <span class="Constant">value:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L428" class="LineNr">428 </span> *p2<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *p2<span class="Delimiter">,</span> <span class="Constant">value:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L429" class="LineNr">429 </span>] <span id="L430" class="LineNr">430 </span><span class="muRecipe">def</span> test-next x:&:test-list<span class="muRecipe"> -> </span>y:&:test-list/contained-in:x [ <span id="L431" class="LineNr">431 </span> local-scope <span id="L432" class="LineNr">432 </span> load-ingredients <span id="L433" class="LineNr">433 </span> y<span class="Special"> <- </span>get *x<span class="Delimiter">,</span> <span class="Constant">next:offset</span> <span id="L434" class="LineNr">434 </span>] -<span id="L435" class="LineNr">435 </span><span class="traceContains">+error: foo: cannot modify 'p2' in instruction '*p2 <- put *p2, value:offset, 34' because that would modify p which is an ingredient of recipe foo but not also a product</span> +<span id="L435" class="LineNr">435 </span><span class="traceContains">+error: foo: cannot modify 'p2' in <a href='010vm.cc.html#L32'>instruction</a> '*p2 <- put *p2, value:offset, 34' because that would modify p which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> foo but not also a product</span> <span id="L436" class="LineNr">436 </span> <span id="L437" class="LineNr">437 </span><span class="Delimiter">:(code)</span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> set<reagent>& current_ingredient_and_aliases<span class="Delimiter">,</span> <span class="Normal">const</span> string& original_ingredient_name<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L438" class="LineNr">438 </span><span class="Normal">void</span> <a href='057immutable.cc.html#L438'>check_immutable_ingredient_in_instruction</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> set<reagent>& current_ingredient_and_aliases<span class="Delimiter">,</span> <span class="Normal">const</span> string& original_ingredient_name<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L439" class="LineNr">439 </span> <span class="Comment">// first check if the instruction is directly modifying something it shouldn't</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"lookup"</span><span class="Delimiter">)</span> -<span id="L442" class="LineNr">442 </span> && 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> +<span id="L442" class="LineNr">442 </span> && 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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> <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> <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> -<span id="L445" class="LineNr">445 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_product_name << <span class="Constant">"' in instruction '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because it's an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L445" class="LineNr">445 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_product_name << <span class="Constant">"' in <a href='010vm.cc.html#L32'>instruction</a> '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because it's an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L446" class="LineNr">446 </span> <span class="Normal">else</span> -<span id="L447" class="LineNr">447 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_product_name << <span class="Constant">"' in instruction '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because that would modify "</span> << original_ingredient_name << <span class="Constant">" which is an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L447" class="LineNr">447 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_product_name << <span class="Constant">"' in <a href='010vm.cc.html#L32'>instruction</a> '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because that would modify "</span> << original_ingredient_name << <span class="Constant">" which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L448" class="LineNr">448 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L449" class="LineNr">449 </span> <span class="Delimiter">}</span> <span id="L450" class="LineNr">450 </span> <span class="Delimiter">}</span> <span id="L451" class="LineNr">451 </span> <span class="Comment">// check if there's any indirect modification going on</span> -<span id="L452" class="LineNr">452 </span> set<<span class="Normal">int</span>> current_ingredient_indices = ingredient_indices<span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span> +<span id="L452" class="LineNr">452 </span> set<<span class="Normal">int</span>> current_ingredient_indices = <a href='057immutable.cc.html#L504'>ingredient_indices</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> current_ingredient_and_aliases<span class="Delimiter">);</span> <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> -<span id="L454" class="LineNr">454 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::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 id="L454" class="LineNr">454 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<<span class="Normal">int</span>>::iterator p = current_ingredient_indices<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != current_ingredient_indices<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L455" class="LineNr">455 </span> <span class="Normal">const</span> <span class="Normal">int</span> current_ingredient_index = *p<span class="Delimiter">;</span> <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> <span id="L457" class="LineNr">457 </span> canonize_type<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">);</span> @@ -525,47 +525,47 @@ if ('onhashchange' in window) { <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> <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> <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> -<span id="L468" class="LineNr">468 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in instruction '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because it's an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L468" class="LineNr">468 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in <a href='010vm.cc.html#L32'>instruction</a> '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because it's an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L469" class="LineNr">469 </span> <span class="Normal">else</span> -<span id="L470" class="LineNr">470 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in instruction '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because that would modify '"</span> << original_ingredient_name << <span class="Constant">"' which is an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L470" class="LineNr">470 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in <a href='010vm.cc.html#L32'>instruction</a> '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because that would modify '"</span> << original_ingredient_name << <span class="Constant">"' which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L471" class="LineNr">471 </span> <span class="Delimiter">}</span> <span id="L472" class="LineNr">472 </span> <span class="Delimiter">}</span> <span id="L473" class="LineNr">473 </span> <span class="Delimiter">}</span> <span id="L474" class="LineNr">474 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L475" class="LineNr">475 </span> <span class="Comment">// defined recipe</span> -<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> +<span id="L476" class="LineNr">476 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='057immutable.cc.html#L486'>is_modified_in_recipe</a><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 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> -<span id="L478" class="LineNr">478 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in instruction '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because it's an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L478" class="LineNr">478 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in <a href='010vm.cc.html#L32'>instruction</a> '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because it's an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L479" class="LineNr">479 </span> <span class="Normal">else</span> -<span id="L480" class="LineNr">480 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in instruction '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because that would modify '"</span> << original_ingredient_name << <span class="Constant">"' which is an ingredient of recipe "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L480" class="LineNr">480 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"cannot modify '"</span> << current_ingredient_name << <span class="Constant">"' in <a href='010vm.cc.html#L32'>instruction</a> '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"' because that would modify '"</span> << original_ingredient_name << <span class="Constant">"' which is an ingredient of <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <span class="Constant">" but not also a product</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L481" class="LineNr">481 </span> <span class="Delimiter">}</span> <span id="L482" class="LineNr">482 </span> <span class="Delimiter">}</span> <span id="L483" class="LineNr">483 </span> <span class="Delimiter">}</span> <span id="L484" class="LineNr">484 </span><span class="Delimiter">}</span> <span id="L485" class="LineNr">485 </span> -<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& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L486" class="LineNr">486 </span><span class="Normal">bool</span> <a href='057immutable.cc.html#L486'>is_modified_in_recipe</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> ingredient_index<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L487" class="LineNr">487 </span> <span class="Normal">const</span> recipe& callee = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<span id="L489" class="LineNr">489 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't check mutability of ingredients in recipe "</span> << callee<span class="Delimiter">.</span>name << <span class="Constant">" because it uses 'next-ingredient' directly, rather than a recipe header.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L489" class="LineNr">489 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"can't check mutability of ingredients in recipe "</span> << callee<span class="Delimiter">.</span>name << <span class="Constant">" because it uses 'next-ingredient' directly, rather than a recipe header.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L490" class="LineNr">490 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L491" class="LineNr">491 </span> <span class="Delimiter">}</span> -<span id="L492" class="LineNr">492 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index >= 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 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> +<span id="L492" class="LineNr">492 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>ingredient_index >= <a href='001help.cc.html#L138'>SIZE</a><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 id="L493" class="LineNr">493 </span> <span class="Identifier">return</span> <a href='057immutable.cc.html#L496'>is_present_in_products</a><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 id="L494" class="LineNr">494 </span><span class="Delimiter">}</span> <span id="L495" class="LineNr">495 </span> -<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& callee<span class="Delimiter">,</span> <span class="Normal">const</span> string& ingredient_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 id="L496" class="LineNr">496 </span><span class="Normal">bool</span> <a href='057immutable.cc.html#L496'>is_present_in_products</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& callee<span class="Delimiter">,</span> <span class="Normal">const</span> string& ingredient_name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>callee<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L499" class="LineNr">499 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L500" class="LineNr">500 </span> <span class="Delimiter">}</span> <span id="L501" class="LineNr">501 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L502" class="LineNr">502 </span><span class="Delimiter">}</span> <span id="L503" class="LineNr">503 </span> -<span id="L504" class="LineNr">504 </span>set<<span class="Normal">int</span>> ingredient_indices<span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> set<reagent>& ingredient_names<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L504" class="LineNr">504 </span>set<<span class="Normal">int</span>> <a href='057immutable.cc.html#L504'>ingredient_indices</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> set<reagent>& ingredient_names<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L505" class="LineNr">505 </span> set<<span class="Normal">int</span>> result<span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span id="L509" class="LineNr">509 </span> result<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L510" class="LineNr">510 </span> <span class="Delimiter">}</span> <span id="L511" class="LineNr">511 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> @@ -588,7 +588,7 @@ if ('onhashchange' in window) { <span id="L528" class="LineNr">528 </span> <span class="Normal">value</span>:num <span id="L529" class="LineNr">529 </span> <span class="Normal">next</span>:&:test-list <span id="L530" class="LineNr">530 </span>] -<span id="L531" class="LineNr">531 </span><span class="muRecipe">def</span> main [ +<span id="L531" class="LineNr">531 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L532" class="LineNr">532 </span> local-scope <span id="L533" class="LineNr">533 </span> <span class="Normal">p</span>:&:test-list<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">test-list:type</span> <span id="L534" class="LineNr">534 </span> foo p @@ -607,7 +607,7 @@ if ('onhashchange' in window) { <span id="L547" class="LineNr">547 </span><span class="muRecipe">def</span> test-remove x:&:test-list/contained-in:from<span class="Delimiter">,</span> from:&:test-list<span class="muRecipe"> -> </span>from:&:test-list [ <span id="L548" class="LineNr">548 </span> local-scope <span id="L549" class="LineNr">549 </span> load-ingredients -<span id="L550" class="LineNr">550 </span> *x<span class="Special"> <- </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> +<span id="L550" class="LineNr">550 </span> *x<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *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> <span id="L551" class="LineNr">551 </span>] <span id="L552" class="LineNr">552 </span>$error: <span class="Constant">0</span> <span id="L553" class="LineNr">553 </span> @@ -617,7 +617,7 @@ if ('onhashchange' in window) { <span id="L557" class="LineNr">557 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!tmp<span class="Delimiter">-></span>atom <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">-></span>value<span class="Delimiter">)</span> <span id="L559" class="LineNr">559 </span> && !is_present_in_products<span class="Delimiter">(</span>caller<span class="Delimiter">,</span> tmp<span class="Delimiter">-></span>value<span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L560" class="LineNr">560 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"/contained-in can only point to another ingredient or product, but got '"</span> << to_string<span class="Delimiter">(</span>property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">"contained-in"</span><span class="Delimiter">))</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L560" class="LineNr">560 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"/contained-in can only point to another ingredient or product, but got '"</span> << to_string<span class="Delimiter">(</span>property<span class="Delimiter">(</span>current_ingredient<span class="Delimiter">,</span> <span class="Constant">"contained-in"</span><span class="Delimiter">))</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L561" class="LineNr">561 </span> <span class="Delimiter">}</span> <span id="L562" class="LineNr">562 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L563" class="LineNr">563 </span><span class="Delimiter">}</span> diff --git a/html/058to_text.cc.html b/html/058to_text.cc.html index 9b58c70b..582af589 100644 --- a/html/058to_text.cc.html +++ b/html/058to_text.cc.html @@ -61,11 +61,11 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L6" class="LineNr"> 6 </span>TO_TEXT<span class="Delimiter">,</span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L8" class="LineNr"> 8 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"to-text"</span><span class="Delimiter">,</span> TO_TEXT<span class="Delimiter">);</span> +<span id="L8" class="LineNr"> 8 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"to-text"</span><span class="Delimiter">,</span> TO_TEXT<span class="Delimiter">);</span> <span id="L9" class="LineNr"> 9 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L10" class="LineNr">10 </span><span class="Normal">case</span> TO_TEXT: <span class="Delimiter">{</span> -<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> -<span id="L12" class="LineNr">12 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'to-text' requires a single ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L11" class="LineNr">11 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L12" class="LineNr">12 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'to-text' requires a single ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L13" class="LineNr">13 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L14" class="LineNr">14 </span> <span class="Delimiter">}</span> <span id="L15" class="LineNr">15 </span> <span class="Comment">// can handle any type</span> @@ -74,7 +74,7 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L19" class="LineNr">19 </span><span class="Normal">case</span> TO_TEXT: <span class="Delimiter">{</span> <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> -<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> +<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><a href='038new_text.cc.html#L38'>new_mu_text</a><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 id="L22" class="LineNr">22 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L23" class="LineNr">23 </span><span class="Delimiter">}</span> </pre> diff --git a/html/059to_text.mu.html b/html/059to_text.mu.html index c3700c68..449d2bd6 100644 --- a/html/059to_text.mu.html +++ b/html/059to_text.mu.html @@ -68,7 +68,7 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr">13 </span>] <span id="L14" class="LineNr">14 </span> <span id="L15" class="LineNr">15 </span><span class="Comment"># variant for arrays (since we can't pass them around otherwise)</span> -<span id="L16" class="LineNr">16 </span><span class="muRecipe">def</span> array-to-text-line x:&:@:_elem<span class="muRecipe"> -> </span>y:text [ +<span id="L16" class="LineNr">16 </span><span class="muRecipe">def</span> <a href='059to_text.mu.html#L16'>array-to-text-line</a> x:&:@:_elem<span class="muRecipe"> -> </span>y:text [ <span id="L17" class="LineNr">17 </span> <span class="Constant">local-scope</span> <span id="L18" class="LineNr">18 </span> <span class="Constant">load-ingredients</span> <span id="L19" class="LineNr">19 </span> y <span class="Special"><-</span> to-text *x @@ -81,7 +81,7 @@ if ('onhashchange' in window) { <span id="L26" class="LineNr">26 </span> <span id="L27" class="LineNr">27 </span><span class="muScenario">scenario</span> array-to-text-line-early-warning-for-static-dispatch [ <span id="L28" class="LineNr">28 </span> n:&:@:num <span class="Special"><-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span> -<span id="L29" class="LineNr">29 </span> x:text <span class="Special"><-</span> array-to-text-line n +<span id="L29" class="LineNr">29 </span> x:text <span class="Special"><-</span> <a href='059to_text.mu.html#L16'>array-to-text-line</a> n <span id="L30" class="LineNr">30 </span> <span class="Comment"># just ensure there were no errors</span> <span id="L31" class="LineNr">31 </span>] <span id="L32" class="LineNr">32 </span> diff --git a/html/060rewrite_literal_string.cc.html b/html/060rewrite_literal_string.cc.html index 2bf14f63..6031311a 100644 --- a/html/060rewrite_literal_string.cc.html +++ b/html/060rewrite_literal_string.cc.html @@ -59,7 +59,7 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Comment">//: allow using literal strings anywhere that will accept immutable strings</span> <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenario passing_literals_to_recipes)</span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [ +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L5" class="LineNr"> 5 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>foo [abc] <span id="L6" class="LineNr"> 6 </span>] <span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> foo x:text<span class="muRecipe"> -> </span>n:num [ @@ -70,13 +70,13 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr">12 </span><span class="traceContains">+mem: storing 3 in location 1</span> <span id="L13" class="LineNr">13 </span> <span id="L14" class="LineNr">14 </span><span class="Delimiter">:(before "End Instruction Inserting/Deleting Transforms")</span> -<span id="L15" class="LineNr">15 </span>initialize_transform_rewrite_literal_string_to_text<span class="Delimiter">();</span> -<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> +<span id="L15" class="LineNr">15 </span><a href='060rewrite_literal_string.cc.html#L21'>initialize_transform_rewrite_literal_string_to_text</a><span class="Delimiter">();</span> +<span id="L16" class="LineNr">16 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='060rewrite_literal_string.cc.html#L36'>rewrite_literal_string_to_text</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L17" class="LineNr">17 </span> <span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L19" class="LineNr">19 </span>set<string> recipes_taking_literal_strings<span class="Delimiter">;</span> <span id="L20" class="LineNr">20 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L21" class="LineNr">21 </span><span class="Normal">void</span> <a href='060rewrite_literal_string.cc.html#L21'>initialize_transform_rewrite_literal_string_to_text</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L22" class="LineNr">22 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">"$print"</span><span class="Delimiter">);</span> <span id="L23" class="LineNr">23 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">"$dump-trace"</span><span class="Delimiter">);</span> <span id="L24" class="LineNr">24 </span> recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">"$system"</span><span class="Delimiter">);</span> @@ -91,24 +91,24 @@ if ('onhashchange' in window) { <span id="L33" class="LineNr">33 </span> <span class="Comment">// End initialize_transform_rewrite_literal_string_to_text()</span> <span id="L34" class="LineNr">34 </span><span class="Delimiter">}</span> <span id="L35" class="LineNr">35 </span> -<span id="L36" class="LineNr">36 </span><span 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> +<span id="L36" class="LineNr">36 </span><span class="Normal">void</span> <a href='060rewrite_literal_string.cc.html#L36'>rewrite_literal_string_to_text</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L37" class="LineNr">37 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L38" class="LineNr">38 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- rewrite literal strings in recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> -<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> +<span id="L38" class="LineNr">38 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- rewrite literal strings in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L39" class="LineNr">39 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='060rewrite_literal_string.cc.html#L62'>contains_numeric_locations</a><span class="Delimiter">(</span>caller<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L40" class="LineNr">40 </span> vector<instruction> new_instructions<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L42" class="LineNr">42 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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> -<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 < 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 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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L46" class="LineNr">46 </span> instruction def<span class="Delimiter">;</span> +<span id="L46" class="LineNr">46 </span> <a href='010vm.cc.html#L32'>instruction</a> def<span class="Delimiter">;</span> <span id="L47" class="LineNr">47 </span> ostringstream ingredient_name<span class="Delimiter">;</span> <span id="L48" class="LineNr">48 </span> ingredient_name << inst<span class="Delimiter">.</span>name << <span class="Constant">'_'</span> << i << <span class="Constant">'_'</span> << j << <span class="Constant">":text"</span><span class="Delimiter">;</span> <span id="L49" class="LineNr">49 </span> def<span class="Delimiter">.</span>name = <span class="Constant">"new"</span><span class="Delimiter">;</span> <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> <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> <span id="L52" class="LineNr">52 </span> new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>def<span class="Delimiter">);</span> -<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> +<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><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span class="Comment">// reclaim old memory</span> <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> <span id="L55" class="LineNr">55 </span> <span class="Delimiter">}</span> <span id="L56" class="LineNr">56 </span> <span class="Delimiter">}</span> @@ -117,14 +117,14 @@ if ('onhashchange' in window) { <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> <span id="L60" class="LineNr">60 </span><span class="Delimiter">}</span> <span id="L61" class="LineNr">61 </span> -<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& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L62" class="LineNr">62 </span><span class="Normal">bool</span> <a href='060rewrite_literal_string.cc.html#L62'>contains_numeric_locations</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L64" class="LineNr">64 </span> <span class="Normal">const</span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> -<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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> +<span id="L66" class="LineNr">66 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L141'>is_numeric_location</a><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 id="L67" class="LineNr">67 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> -<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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> +<span id="L69" class="LineNr">69 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='042name.cc.html#L141'>is_numeric_location</a><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 id="L70" class="LineNr">70 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L71" class="LineNr">71 </span> <span class="Delimiter">}</span> <span id="L72" class="LineNr">72 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> diff --git a/html/061text.mu.html b/html/061text.mu.html index bde24f55..ecae0b15 100644 --- a/html/061text.mu.html +++ b/html/061text.mu.html @@ -182,27 +182,27 @@ if ('onhashchange' in window) { <span id="L124" class="LineNr"> 124 </span> <span id="L125" class="LineNr"> 125 </span><span class="Comment"># A new type to help incrementally construct texts.</span> <span id="L126" class="LineNr"> 126 </span><span class="Comment"># todo: make this shape-shifting.</span> -<span id="L127" class="LineNr"> 127 </span><span class="muData">container</span> buffer [ +<span id="L127" class="LineNr"> 127 </span><span class="muData">container</span> <a href='061text.mu.html#L127'>buffer</a> [ <span id="L128" class="LineNr"> 128 </span> length:num <span id="L129" class="LineNr"> 129 </span> data:text <span id="L130" class="LineNr"> 130 </span>] <span id="L131" class="LineNr"> 131 </span> -<span id="L132" class="LineNr"> 132 </span><span class="muRecipe">def</span> new-buffer capacity:num<span class="muRecipe"> -> </span>result:&:buffer [ +<span id="L132" class="LineNr"> 132 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L132'>new-buffer</a> <a href='075channel.mu.html#L379'>capacity</a>:num<span class="muRecipe"> -> </span>result:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L133" class="LineNr"> 133 </span> <span class="Constant">local-scope</span> <span id="L134" class="LineNr"> 134 </span> <span class="Constant">load-ingredients</span> -<span id="L135" class="LineNr"> 135 </span> result <span class="Special"><-</span> new <span class="Constant">buffer:type</span> +<span id="L135" class="LineNr"> 135 </span> result <span class="Special"><-</span> new <span class="Constant"><a href='061text.mu.html#L127'>buffer</a>:type</span> <span id="L136" class="LineNr"> 136 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">length:offset</span>,<span class="Constant"> 0</span> <span id="L137" class="LineNr"> 137 </span> <span class="Delimiter">{</span> -<span id="L138" class="LineNr"> 138 </span> <span class="muControl">break-if</span> capacity +<span id="L138" class="LineNr"> 138 </span> <span class="muControl">break-if</span> <a href='075channel.mu.html#L379'>capacity</a> <span id="L139" class="LineNr"> 139 </span> <span class="Comment"># capacity not provided</span> -<span id="L140" class="LineNr"> 140 </span> capacity <span class="Special"><-</span> copy<span class="Constant"> 10</span> +<span id="L140" class="LineNr"> 140 </span> <a href='075channel.mu.html#L379'>capacity</a> <span class="Special"><-</span> copy<span class="Constant"> 10</span> <span id="L141" class="LineNr"> 141 </span> <span class="Delimiter">}</span> -<span id="L142" class="LineNr"> 142 </span> data:text <span class="Special"><-</span> new <span class="Constant">character:type</span>, capacity +<span id="L142" class="LineNr"> 142 </span> data:text <span class="Special"><-</span> new <span class="Constant">character:type</span>, <a href='075channel.mu.html#L379'>capacity</a> <span id="L143" class="LineNr"> 143 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">data:offset</span>, data <span id="L144" class="LineNr"> 144 </span> <span class="muControl">return</span> result <span id="L145" class="LineNr"> 145 </span>] <span id="L146" class="LineNr"> 146 </span> -<span id="L147" class="LineNr"> 147 </span><span class="muRecipe">def</span> grow-buffer buf:&:buffer<span class="muRecipe"> -> </span>buf:&:buffer [ +<span id="L147" class="LineNr"> 147 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L147'>grow-buffer</a> buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L148" class="LineNr"> 148 </span> <span class="Constant">local-scope</span> <span id="L149" class="LineNr"> 149 </span> <span class="Constant">load-ingredients</span> <span id="L150" class="LineNr"> 150 </span> <span class="Comment"># double buffer size</span> @@ -223,17 +223,17 @@ if ('onhashchange' in window) { <span id="L165" class="LineNr"> 165 </span> <span class="Delimiter">}</span> <span id="L166" class="LineNr"> 166 </span>] <span id="L167" class="LineNr"> 167 </span> -<span id="L168" class="LineNr"> 168 </span><span class="muRecipe">def</span> buffer-full? in:&:buffer<span class="muRecipe"> -> </span>result:bool [ +<span id="L168" class="LineNr"> 168 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L168'>buffer-full?</a> in:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>result:bool [ <span id="L169" class="LineNr"> 169 </span> <span class="Constant">local-scope</span> <span id="L170" class="LineNr"> 170 </span> <span class="Constant">load-ingredients</span> <span id="L171" class="LineNr"> 171 </span> len:num <span class="Special"><-</span> get *in, <span class="Constant">length:offset</span> <span id="L172" class="LineNr"> 172 </span> s:text <span class="Special"><-</span> get *in, <span class="Constant">data:offset</span> -<span id="L173" class="LineNr"> 173 </span> capacity:num <span class="Special"><-</span> length *s -<span id="L174" class="LineNr"> 174 </span> result <span class="Special"><-</span> greater-or-equal len, capacity +<span id="L173" class="LineNr"> 173 </span> <a href='075channel.mu.html#L379'>capacity</a>:num <span class="Special"><-</span> length *s +<span id="L174" class="LineNr"> 174 </span> result <span class="Special"><-</span> greater-or-equal len, <a href='075channel.mu.html#L379'>capacity</a> <span id="L175" class="LineNr"> 175 </span>] <span id="L176" class="LineNr"> 176 </span> <span id="L177" class="LineNr"> 177 </span><span class="Comment"># most broadly applicable definition of append to a buffer: just call to-text</span> -<span id="L178" class="LineNr"> 178 </span><span class="muRecipe">def</span> append buf:&:buffer, x:_elem<span class="muRecipe"> -> </span>buf:&:buffer [ +<span id="L178" class="LineNr"> 178 </span><span class="muRecipe">def</span> append buf:&:<a href='061text.mu.html#L127'>buffer</a>, x:_elem<span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L179" class="LineNr"> 179 </span> <span class="Constant">local-scope</span> <span id="L180" class="LineNr"> 180 </span> <span class="Constant">load-ingredients</span> <span id="L181" class="LineNr"> 181 </span> text:text <span class="Special"><-</span> to-text x @@ -249,7 +249,7 @@ if ('onhashchange' in window) { <span id="L191" class="LineNr"> 191 </span> <span class="Delimiter">}</span> <span id="L192" class="LineNr"> 192 </span>] <span id="L193" class="LineNr"> 193 </span> -<span id="L194" class="LineNr"> 194 </span><span class="muRecipe">def</span> append buf:&:buffer, c:char<span class="muRecipe"> -> </span>buf:&:buffer [ +<span id="L194" class="LineNr"> 194 </span><span class="muRecipe">def</span> append buf:&:<a href='061text.mu.html#L127'>buffer</a>, c:char<span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L195" class="LineNr"> 195 </span> <span class="Constant">local-scope</span> <span id="L196" class="LineNr"> 196 </span> <span class="Constant">load-ingredients</span> <span id="L197" class="LineNr"> 197 </span> len:num <span class="Special"><-</span> get *buf, <span class="Constant">length:offset</span> @@ -265,9 +265,9 @@ if ('onhashchange' in window) { <span id="L207" class="LineNr"> 207 </span> <span class="Delimiter">}</span> <span id="L208" class="LineNr"> 208 </span> <span class="Delimiter">{</span> <span id="L209" class="LineNr"> 209 </span> <span class="Comment"># grow buffer if necessary</span> -<span id="L210" class="LineNr"> 210 </span> full?:bool <span class="Special"><-</span> buffer-full? buf +<span id="L210" class="LineNr"> 210 </span> full?:bool <span class="Special"><-</span> <a href='061text.mu.html#L168'>buffer-full?</a> buf <span id="L211" class="LineNr"> 211 </span> <span class="muControl">break-unless</span> full? -<span id="L212" class="LineNr"> 212 </span> buf <span class="Special"><-</span> grow-buffer buf +<span id="L212" class="LineNr"> 212 </span> buf <span class="Special"><-</span> <a href='061text.mu.html#L147'>grow-buffer</a> buf <span id="L213" class="LineNr"> 213 </span> <span class="Delimiter">}</span> <span id="L214" class="LineNr"> 214 </span> s:text <span class="Special"><-</span> get *buf, <span class="Constant">data:offset</span> <span id="L215" class="LineNr"> 215 </span> *s <span class="Special"><-</span> put-index *s, len, c @@ -275,7 +275,7 @@ if ('onhashchange' in window) { <span id="L217" class="LineNr"> 217 </span> *buf <span class="Special"><-</span> put *buf, <span class="Constant">length:offset</span>, len <span id="L218" class="LineNr"> 218 </span>] <span id="L219" class="LineNr"> 219 </span> -<span id="L220" class="LineNr"> 220 </span><span class="muRecipe">def</span> append buf:&:buffer, t:text<span class="muRecipe"> -> </span>buf:&:buffer [ +<span id="L220" class="LineNr"> 220 </span><span class="muRecipe">def</span> append buf:&:<a href='061text.mu.html#L127'>buffer</a>, t:text<span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L221" class="LineNr"> 221 </span> <span class="Constant">local-scope</span> <span id="L222" class="LineNr"> 222 </span> <span class="Constant">load-ingredients</span> <span id="L223" class="LineNr"> 223 </span> len:num <span class="Special"><-</span> length *t @@ -292,7 +292,7 @@ if ('onhashchange' in window) { <span id="L234" class="LineNr"> 234 </span> <span id="L235" class="LineNr"> 235 </span><span class="muScenario">scenario</span> append-to-empty-buffer [ <span id="L236" class="LineNr"> 236 </span> <span class="Constant">local-scope</span> -<span id="L237" class="LineNr"> 237 </span> x:&:buffer <span class="Special"><-</span> new-buffer +<span id="L237" class="LineNr"> 237 </span> x:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a> <span id="L238" class="LineNr"> 238 </span> run [ <span id="L239" class="LineNr"> 239 </span> c:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L240" class="LineNr"> 240 </span> x <span class="Special"><-</span> append x, c @@ -310,7 +310,7 @@ if ('onhashchange' in window) { <span id="L252" class="LineNr"> 252 </span> <span id="L253" class="LineNr"> 253 </span><span class="muScenario">scenario</span> append-to-buffer [ <span id="L254" class="LineNr"> 254 </span> <span class="Constant">local-scope</span> -<span id="L255" class="LineNr"> 255 </span> x:&:buffer <span class="Special"><-</span> new-buffer +<span id="L255" class="LineNr"> 255 </span> x:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a> <span id="L256" class="LineNr"> 256 </span> c:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L257" class="LineNr"> 257 </span> x <span class="Special"><-</span> append x, c <span id="L258" class="LineNr"> 258 </span> run [ @@ -332,7 +332,7 @@ if ('onhashchange' in window) { <span id="L274" class="LineNr"> 274 </span> <span id="L275" class="LineNr"> 275 </span><span class="muScenario">scenario</span> append-grows-buffer [ <span id="L276" class="LineNr"> 276 </span> <span class="Constant">local-scope</span> -<span id="L277" class="LineNr"> 277 </span> x:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 3</span> +<span id="L277" class="LineNr"> 277 </span> x:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 3</span> <span id="L278" class="LineNr"> 278 </span> s1:text <span class="Special"><-</span> get *x, <span class="Constant">data:offset</span> <span id="L279" class="LineNr"> 279 </span> x <span class="Special"><-</span> append x, <span class="Constant">[abc]</span> <span class="Comment"># buffer is now full</span> <span id="L280" class="LineNr"> 280 </span> s2:text <span class="Special"><-</span> get *x, <span class="Constant">data:offset</span> @@ -369,12 +369,12 @@ if ('onhashchange' in window) { <span id="L311" class="LineNr"> 311 </span> <span id="L312" class="LineNr"> 312 </span><span class="muScenario">scenario</span> buffer-append-handles-backspace [ <span id="L313" class="LineNr"> 313 </span> <span class="Constant">local-scope</span> -<span id="L314" class="LineNr"> 314 </span> x:&:buffer <span class="Special"><-</span> new-buffer +<span id="L314" class="LineNr"> 314 </span> x:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a> <span id="L315" class="LineNr"> 315 </span> x <span class="Special"><-</span> append x, <span class="Constant">[ab]</span> <span id="L316" class="LineNr"> 316 </span> run [ <span id="L317" class="LineNr"> 317 </span> c:char <span class="Special"><-</span> copy <span class="Constant">8/backspace</span> <span id="L318" class="LineNr"> 318 </span> x <span class="Special"><-</span> append x, c -<span id="L319" class="LineNr"> 319 </span> s:text <span class="Special"><-</span> buffer-to-array x +<span id="L319" class="LineNr"> 319 </span> s:text <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> x <span id="L320" class="LineNr"> 320 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s <span id="L321" class="LineNr"> 321 </span> ] <span id="L322" class="LineNr"> 322 </span> memory-should-contain [ @@ -384,7 +384,7 @@ if ('onhashchange' in window) { <span id="L326" class="LineNr"> 326 </span> ] <span id="L327" class="LineNr"> 327 </span>] <span id="L328" class="LineNr"> 328 </span> -<span id="L329" class="LineNr"> 329 </span><span class="muRecipe">def</span> buffer-to-array in:&:buffer<span class="muRecipe"> -> </span>result:text [ +<span id="L329" class="LineNr"> 329 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L329'>buffer-to-array</a> in:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>result:text [ <span id="L330" class="LineNr"> 330 </span> <span class="Constant">local-scope</span> <span id="L331" class="LineNr"> 331 </span> <span class="Constant">load-ingredients</span> <span id="L332" class="LineNr"> 332 </span> <span class="Delimiter">{</span> @@ -418,7 +418,7 @@ if ('onhashchange' in window) { <span id="L360" class="LineNr"> 360 </span><span class="muRecipe">def</span> append first:text<span class="muRecipe"> -> </span>result:text [ <span id="L361" class="LineNr"> 361 </span> <span class="Constant">local-scope</span> <span id="L362" class="LineNr"> 362 </span> <span class="Constant">load-ingredients</span> -<span id="L363" class="LineNr"> 363 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> +<span id="L363" class="LineNr"> 363 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> <span id="L364" class="LineNr"> 364 </span> <span class="Comment"># append first ingredient</span> <span id="L365" class="LineNr"> 365 </span> <span class="Delimiter">{</span> <span id="L366" class="LineNr"> 366 </span> <span class="muControl">break-unless</span> first @@ -432,7 +432,7 @@ if ('onhashchange' in window) { <span id="L374" class="LineNr"> 374 </span> buf <span class="Special"><-</span> append buf, arg <span id="L375" class="LineNr"> 375 </span> <span class="muControl">loop</span> <span id="L376" class="LineNr"> 376 </span> <span class="Delimiter">}</span> -<span id="L377" class="LineNr"> 377 </span> result <span class="Special"><-</span> buffer-to-array buf +<span id="L377" class="LineNr"> 377 </span> result <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L378" class="LineNr"> 378 </span>] <span id="L379" class="LineNr"> 379 </span> <span id="L380" class="LineNr"> 380 </span><span class="muScenario">scenario</span> text-append-1 [ @@ -492,7 +492,7 @@ if ('onhashchange' in window) { <span id="L434" class="LineNr"> 434 </span> <span class="Constant">local-scope</span> <span id="L435" class="LineNr"> 435 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L436" class="LineNr"> 436 </span> run [ -<span id="L437" class="LineNr"> 437 </span> x <span class="Special"><-</span> replace x, <span class="Constant">98/b</span>, <span class="Constant">122/z</span> +<span id="L437" class="LineNr"> 437 </span> x <span class="Special"><-</span> <a href='061text.mu.html#L445'>replace</a> x, <span class="Constant">98/b</span>, <span class="Constant">122/z</span> <span id="L438" class="LineNr"> 438 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *x <span id="L439" class="LineNr"> 439 </span> ] <span id="L440" class="LineNr"> 440 </span> memory-should-contain [ @@ -500,7 +500,7 @@ if ('onhashchange' in window) { <span id="L442" class="LineNr"> 442 </span> ] <span id="L443" class="LineNr"> 443 </span>] <span id="L444" class="LineNr"> 444 </span> -<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"> -> </span>s:text [ +<span id="L445" class="LineNr"> 445 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L445'>replace</a> s:text, oldc:char, newc:char, from:num/optional<span class="muRecipe"> -> </span>s:text [ <span id="L446" class="LineNr"> 446 </span> <span class="Constant">local-scope</span> <span id="L447" class="LineNr"> 447 </span> <span class="Constant">load-ingredients</span> <span id="L448" class="LineNr"> 448 </span> len:num <span class="Special"><-</span> length *s @@ -509,14 +509,14 @@ if ('onhashchange' in window) { <span id="L451" class="LineNr"> 451 </span> <span class="muControl">return-if</span> done? <span id="L452" class="LineNr"> 452 </span> *s <span class="Special"><-</span> put-index *s, i, newc <span id="L453" class="LineNr"> 453 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> -<span id="L454" class="LineNr"> 454 </span> s <span class="Special"><-</span> replace s, oldc, newc, i +<span id="L454" class="LineNr"> 454 </span> s <span class="Special"><-</span> <a href='061text.mu.html#L445'>replace</a> s, oldc, newc, i <span id="L455" class="LineNr"> 455 </span>] <span id="L456" class="LineNr"> 456 </span> <span id="L457" class="LineNr"> 457 </span><span class="muScenario">scenario</span> replace-character-at-start [ <span id="L458" class="LineNr"> 458 </span> <span class="Constant">local-scope</span> <span id="L459" class="LineNr"> 459 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L460" class="LineNr"> 460 </span> run [ -<span id="L461" class="LineNr"> 461 </span> x <span class="Special"><-</span> replace x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span> +<span id="L461" class="LineNr"> 461 </span> x <span class="Special"><-</span> <a href='061text.mu.html#L445'>replace</a> x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span> <span id="L462" class="LineNr"> 462 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *x <span id="L463" class="LineNr"> 463 </span> ] <span id="L464" class="LineNr"> 464 </span> memory-should-contain [ @@ -528,7 +528,7 @@ if ('onhashchange' in window) { <span id="L470" class="LineNr"> 470 </span> <span class="Constant">local-scope</span> <span id="L471" class="LineNr"> 471 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L472" class="LineNr"> 472 </span> run [ -<span id="L473" class="LineNr"> 473 </span> x <span class="Special"><-</span> replace x, <span class="Constant">99/c</span>, <span class="Constant">122/z</span> +<span id="L473" class="LineNr"> 473 </span> x <span class="Special"><-</span> <a href='061text.mu.html#L445'>replace</a> x, <span class="Constant">99/c</span>, <span class="Constant">122/z</span> <span id="L474" class="LineNr"> 474 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *x <span id="L475" class="LineNr"> 475 </span> ] <span id="L476" class="LineNr"> 476 </span> memory-should-contain [ @@ -540,7 +540,7 @@ if ('onhashchange' in window) { <span id="L482" class="LineNr"> 482 </span> <span class="Constant">local-scope</span> <span id="L483" class="LineNr"> 483 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L484" class="LineNr"> 484 </span> run [ -<span id="L485" class="LineNr"> 485 </span> x <span class="Special"><-</span> replace x, <span class="Constant">100/d</span>, <span class="Constant">122/z</span> +<span id="L485" class="LineNr"> 485 </span> x <span class="Special"><-</span> <a href='061text.mu.html#L445'>replace</a> x, <span class="Constant">100/d</span>, <span class="Constant">122/z</span> <span id="L486" class="LineNr"> 486 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *x <span id="L487" class="LineNr"> 487 </span> ] <span id="L488" class="LineNr"> 488 </span> memory-should-contain [ @@ -552,7 +552,7 @@ if ('onhashchange' in window) { <span id="L494" class="LineNr"> 494 </span> <span class="Constant">local-scope</span> <span id="L495" class="LineNr"> 495 </span> x:text <span class="Special"><-</span> new <span class="Constant">[banana]</span> <span id="L496" class="LineNr"> 496 </span> run [ -<span id="L497" class="LineNr"> 497 </span> x <span class="Special"><-</span> replace x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span> +<span id="L497" class="LineNr"> 497 </span> x <span class="Special"><-</span> <a href='061text.mu.html#L445'>replace</a> x, <span class="Constant">97/a</span>, <span class="Constant">122/z</span> <span id="L498" class="LineNr"> 498 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *x <span id="L499" class="LineNr"> 499 </span> ] <span id="L500" class="LineNr"> 500 </span> memory-should-contain [ @@ -561,7 +561,7 @@ if ('onhashchange' in window) { <span id="L503" class="LineNr"> 503 </span>] <span id="L504" class="LineNr"> 504 </span> <span id="L505" class="LineNr"> 505 </span><span class="Comment"># replace underscores in first with remaining args</span> -<span id="L506" class="LineNr"> 506 </span><span class="muRecipe">def</span> interpolate template:text<span class="muRecipe"> -> </span>result:text [ +<span id="L506" class="LineNr"> 506 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L506'>interpolate</a> template:text<span class="muRecipe"> -> </span>result:text [ <span id="L507" class="LineNr"> 507 </span> <span class="Constant">local-scope</span> <span id="L508" class="LineNr"> 508 </span> <span class="Constant">load-ingredients</span> <span class="Comment"># consume just the template</span> <span id="L509" class="LineNr"> 509 </span> <span class="Comment"># compute result-len, space to allocate for result</span> @@ -639,7 +639,7 @@ if ('onhashchange' in window) { <span id="L581" class="LineNr"> 581 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc_ghi]</span> <span id="L582" class="LineNr"> 582 </span> y:text <span class="Special"><-</span> new <span class="Constant">[def]</span> <span id="L583" class="LineNr"> 583 </span> run [ -<span id="L584" class="LineNr"> 584 </span> z:text <span class="Special"><-</span> interpolate x, y +<span id="L584" class="LineNr"> 584 </span> z:text <span class="Special"><-</span> <a href='061text.mu.html#L506'>interpolate</a> x, y <span id="L585" class="LineNr"> 585 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *z <span id="L586" class="LineNr"> 586 </span> ] <span id="L587" class="LineNr"> 587 </span> memory-should-contain [ @@ -652,7 +652,7 @@ if ('onhashchange' in window) { <span id="L594" class="LineNr"> 594 </span> x:text <span class="Special"><-</span> new <span class="Constant">[_, hello!]</span> <span id="L595" class="LineNr"> 595 </span> y:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L596" class="LineNr"> 596 </span> run [ -<span id="L597" class="LineNr"> 597 </span> z:text <span class="Special"><-</span> interpolate x, y +<span id="L597" class="LineNr"> 597 </span> z:text <span class="Special"><-</span> <a href='061text.mu.html#L506'>interpolate</a> x, y <span id="L598" class="LineNr"> 598 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *z <span id="L599" class="LineNr"> 599 </span> ] <span id="L600" class="LineNr"> 600 </span> memory-should-contain [ @@ -666,7 +666,7 @@ if ('onhashchange' in window) { <span id="L608" class="LineNr"> 608 </span> x:text <span class="Special"><-</span> new <span class="Constant">[hello, _]</span> <span id="L609" class="LineNr"> 609 </span> y:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L610" class="LineNr"> 610 </span> run [ -<span id="L611" class="LineNr"> 611 </span> z:text <span class="Special"><-</span> interpolate x, y +<span id="L611" class="LineNr"> 611 </span> z:text <span class="Special"><-</span> <a href='061text.mu.html#L506'>interpolate</a> x, y <span id="L612" class="LineNr"> 612 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *z <span id="L613" class="LineNr"> 613 </span> ] <span id="L614" class="LineNr"> 614 </span> memory-should-contain [ @@ -675,7 +675,7 @@ if ('onhashchange' in window) { <span id="L617" class="LineNr"> 617 </span>] <span id="L618" class="LineNr"> 618 </span> <span id="L619" class="LineNr"> 619 </span><span class="Comment"># result:bool <- space? c:char</span> -<span id="L620" class="LineNr"> 620 </span><span class="muRecipe">def</span> space? c:char<span class="muRecipe"> -> </span>result:bool [ +<span id="L620" class="LineNr"> 620 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L620'>space?</a> c:char<span class="muRecipe"> -> </span>result:bool [ <span id="L621" class="LineNr"> 621 </span> <span class="Constant">local-scope</span> <span id="L622" class="LineNr"> 622 </span> <span class="Constant">load-ingredients</span> <span id="L623" class="LineNr"> 623 </span> <span class="Comment"># most common case first</span> @@ -736,7 +736,7 @@ if ('onhashchange' in window) { <span id="L678" class="LineNr"> 678 </span> result <span class="Special"><-</span> equal c, <span class="Constant">12288/ideographic-space</span> <span id="L679" class="LineNr"> 679 </span>] <span id="L680" class="LineNr"> 680 </span> -<span id="L681" class="LineNr"> 681 </span><span class="muRecipe">def</span> trim s:text<span class="muRecipe"> -> </span>result:text [ +<span id="L681" class="LineNr"> 681 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L681'>trim</a> s:text<span class="muRecipe"> -> </span>result:text [ <span id="L682" class="LineNr"> 682 </span> <span class="Constant">local-scope</span> <span id="L683" class="LineNr"> 683 </span> <span class="Constant">load-ingredients</span> <span id="L684" class="LineNr"> 684 </span> len:num <span class="Special"><-</span> length *s @@ -750,7 +750,7 @@ if ('onhashchange' in window) { <span id="L692" class="LineNr"> 692 </span> <span class="muControl">return</span> <span id="L693" class="LineNr"> 693 </span> <span class="Delimiter">}</span> <span id="L694" class="LineNr"> 694 </span> curr:char <span class="Special"><-</span> index *s, start -<span id="L695" class="LineNr"> 695 </span> whitespace?:bool <span class="Special"><-</span> space? curr +<span id="L695" class="LineNr"> 695 </span> whitespace?:bool <span class="Special"><-</span> <a href='061text.mu.html#L620'>space?</a> curr <span id="L696" class="LineNr"> 696 </span> <span class="muControl">break-unless</span> whitespace? <span id="L697" class="LineNr"> 697 </span> start <span class="Special"><-</span> add start,<span class="Constant"> 1</span> <span id="L698" class="LineNr"> 698 </span> <span class="muControl">loop</span> @@ -761,7 +761,7 @@ if ('onhashchange' in window) { <span id="L703" class="LineNr"> 703 </span> not-at-start?:bool <span class="Special"><-</span> greater-than end, start <span id="L704" class="LineNr"> 704 </span> assert not-at-start?, <span class="Constant">[end ran up against start]</span> <span id="L705" class="LineNr"> 705 </span> curr:char <span class="Special"><-</span> index *s, end -<span id="L706" class="LineNr"> 706 </span> whitespace?:bool <span class="Special"><-</span> space? curr +<span id="L706" class="LineNr"> 706 </span> whitespace?:bool <span class="Special"><-</span> <a href='061text.mu.html#L620'>space?</a> curr <span id="L707" class="LineNr"> 707 </span> <span class="muControl">break-unless</span> whitespace? <span id="L708" class="LineNr"> 708 </span> end <span class="Special"><-</span> subtract end,<span class="Constant"> 1</span> <span id="L709" class="LineNr"> 709 </span> <span class="muControl">loop</span> @@ -789,7 +789,7 @@ if ('onhashchange' in window) { <span id="L731" class="LineNr"> 731 </span> <span class="Constant">local-scope</span> <span id="L732" class="LineNr"> 732 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L733" class="LineNr"> 733 </span> run [ -<span id="L734" class="LineNr"> 734 </span> y:text <span class="Special"><-</span> trim x +<span id="L734" class="LineNr"> 734 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L681'>trim</a> x <span id="L735" class="LineNr"> 735 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L736" class="LineNr"> 736 </span> ] <span id="L737" class="LineNr"> 737 </span> memory-should-contain [ @@ -801,7 +801,7 @@ if ('onhashchange' in window) { <span id="L743" class="LineNr"> 743 </span> <span class="Constant">local-scope</span> <span id="L744" class="LineNr"> 744 </span> x:text <span class="Special"><-</span> new <span class="Constant">[ abc]</span> <span id="L745" class="LineNr"> 745 </span> run [ -<span id="L746" class="LineNr"> 746 </span> y:text <span class="Special"><-</span> trim x +<span id="L746" class="LineNr"> 746 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L681'>trim</a> x <span id="L747" class="LineNr"> 747 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L748" class="LineNr"> 748 </span> ] <span id="L749" class="LineNr"> 749 </span> memory-should-contain [ @@ -813,7 +813,7 @@ if ('onhashchange' in window) { <span id="L755" class="LineNr"> 755 </span> <span class="Constant">local-scope</span> <span id="L756" class="LineNr"> 756 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc ]</span> <span id="L757" class="LineNr"> 757 </span> run [ -<span id="L758" class="LineNr"> 758 </span> y:text <span class="Special"><-</span> trim x +<span id="L758" class="LineNr"> 758 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L681'>trim</a> x <span id="L759" class="LineNr"> 759 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L760" class="LineNr"> 760 </span> ] <span id="L761" class="LineNr"> 761 </span> memory-should-contain [ @@ -825,7 +825,7 @@ if ('onhashchange' in window) { <span id="L767" class="LineNr"> 767 </span> <span class="Constant">local-scope</span> <span id="L768" class="LineNr"> 768 </span> x:text <span class="Special"><-</span> new <span class="Constant">[ abc ]</span> <span id="L769" class="LineNr"> 769 </span> run [ -<span id="L770" class="LineNr"> 770 </span> y:text <span class="Special"><-</span> trim x +<span id="L770" class="LineNr"> 770 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L681'>trim</a> x <span id="L771" class="LineNr"> 771 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L772" class="LineNr"> 772 </span> ] <span id="L773" class="LineNr"> 773 </span> memory-should-contain [ @@ -838,7 +838,7 @@ if ('onhashchange' in window) { <span id="L780" class="LineNr"> 780 </span> x:text <span class="Special"><-</span> new <span class="Constant">[ abc</span> <span id="L781" class="LineNr"> 781 </span><span class="Constant">]</span> <span id="L782" class="LineNr"> 782 </span> run [ -<span id="L783" class="LineNr"> 783 </span> y:text <span class="Special"><-</span> trim x +<span id="L783" class="LineNr"> 783 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L681'>trim</a> x <span id="L784" class="LineNr"> 784 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L785" class="LineNr"> 785 </span> ] <span id="L786" class="LineNr"> 786 </span> memory-should-contain [ @@ -962,7 +962,7 @@ if ('onhashchange' in window) { <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> <span id="L905" class="LineNr"> 905 </span> done?:bool <span class="Special"><-</span> greater-or-equal idx, len <span id="L906" class="LineNr"> 906 </span> <span class="muControl">break-if</span> done? -<span id="L907" class="LineNr"> 907 </span> found?:bool <span class="Special"><-</span> match-at text, pattern, idx +<span id="L907" class="LineNr"> 907 </span> found?:bool <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> text, pattern, idx <span id="L908" class="LineNr"> 908 </span> <span class="muControl">break-if</span> found? <span id="L909" class="LineNr"> 909 </span> idx <span class="Special"><-</span> add idx,<span class="Constant"> 1</span> <span id="L910" class="LineNr"> 910 </span> <span class="Comment"># optimization: skip past indices that definitely won't match</span> @@ -1033,7 +1033,7 @@ if ('onhashchange' in window) { <span id="L975" class="LineNr"> 975 </span>] <span id="L976" class="LineNr"> 976 </span> <span id="L977" class="LineNr"> 977 </span><span class="Comment"># checks if pattern matches at index 'idx'</span> -<span id="L978" class="LineNr"> 978 </span><span class="muRecipe">def</span> match-at text:text, pattern:text, idx:num<span class="muRecipe"> -> </span>result:bool [ +<span id="L978" class="LineNr"> 978 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L978'>match-at</a> text:text, pattern:text, idx:num<span class="muRecipe"> -> </span>result:bool [ <span id="L979" class="LineNr"> 979 </span> <span class="Constant">local-scope</span> <span id="L980" class="LineNr"> 980 </span> <span class="Constant">load-ingredients</span> <span id="L981" class="LineNr"> 981 </span> pattern-len:num <span class="Special"><-</span> length *pattern @@ -1069,7 +1069,7 @@ if ('onhashchange' in window) { <span id="L1011" class="LineNr">1011 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1012" class="LineNr">1012 </span> y:text <span class="Special"><-</span> new <span class="Constant">[ab]</span> <span id="L1013" class="LineNr">1013 </span> run [ -<span id="L1014" class="LineNr">1014 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, y,<span class="Constant"> 0</span> +<span id="L1014" class="LineNr">1014 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, y,<span class="Constant"> 0</span> <span id="L1015" class="LineNr">1015 </span> ] <span id="L1016" class="LineNr">1016 </span> memory-should-contain [ <span id="L1017" class="LineNr">1017 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># match found</span> @@ -1080,7 +1080,7 @@ if ('onhashchange' in window) { <span id="L1022" class="LineNr">1022 </span> <span class="Constant">local-scope</span> <span id="L1023" class="LineNr">1023 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1024" class="LineNr">1024 </span> run [ -<span id="L1025" class="LineNr">1025 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, x,<span class="Constant"> 0</span> +<span id="L1025" class="LineNr">1025 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, x,<span class="Constant"> 0</span> <span id="L1026" class="LineNr">1026 </span> ] <span id="L1027" class="LineNr">1027 </span> memory-should-contain [ <span id="L1028" class="LineNr">1028 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># match found</span> @@ -1092,7 +1092,7 @@ if ('onhashchange' in window) { <span id="L1034" class="LineNr">1034 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1035" class="LineNr">1035 </span> y:text <span class="Special"><-</span> new <span class="Constant">[a]</span> <span id="L1036" class="LineNr">1036 </span> run [ -<span id="L1037" class="LineNr">1037 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, y,<span class="Constant"> 4</span> +<span id="L1037" class="LineNr">1037 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, y,<span class="Constant"> 4</span> <span id="L1038" class="LineNr">1038 </span> ] <span id="L1039" class="LineNr">1039 </span> memory-should-contain [ <span id="L1040" class="LineNr">1040 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># never matches</span> @@ -1104,7 +1104,7 @@ if ('onhashchange' in window) { <span id="L1046" class="LineNr">1046 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1047" class="LineNr">1047 </span> y:text <span class="Special"><-</span> new <span class="Constant">[]</span> <span id="L1048" class="LineNr">1048 </span> run [ -<span id="L1049" class="LineNr">1049 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, y,<span class="Constant"> 0</span> +<span id="L1049" class="LineNr">1049 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, y,<span class="Constant"> 0</span> <span id="L1050" class="LineNr">1050 </span> ] <span id="L1051" class="LineNr">1051 </span> memory-should-contain [ <span id="L1052" class="LineNr">1052 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># always matches empty pattern given a valid index</span> @@ -1116,7 +1116,7 @@ if ('onhashchange' in window) { <span id="L1058" class="LineNr">1058 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1059" class="LineNr">1059 </span> y:text <span class="Special"><-</span> new <span class="Constant">[]</span> <span id="L1060" class="LineNr">1060 </span> run [ -<span id="L1061" class="LineNr">1061 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, y,<span class="Constant"> 4</span> +<span id="L1061" class="LineNr">1061 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, y,<span class="Constant"> 4</span> <span id="L1062" class="LineNr">1062 </span> ] <span id="L1063" class="LineNr">1063 </span> memory-should-contain [ <span id="L1064" class="LineNr">1064 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># no match</span> @@ -1128,7 +1128,7 @@ if ('onhashchange' in window) { <span id="L1070" class="LineNr">1070 </span> x:text <span class="Special"><-</span> new <span class="Constant">[]</span> <span id="L1071" class="LineNr">1071 </span> y:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1072" class="LineNr">1072 </span> run [ -<span id="L1073" class="LineNr">1073 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, y,<span class="Constant"> 0</span> +<span id="L1073" class="LineNr">1073 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, y,<span class="Constant"> 0</span> <span id="L1074" class="LineNr">1074 </span> ] <span id="L1075" class="LineNr">1075 </span> memory-should-contain [ <span id="L1076" class="LineNr">1076 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># no match</span> @@ -1139,7 +1139,7 @@ if ('onhashchange' in window) { <span id="L1081" class="LineNr">1081 </span> <span class="Constant">local-scope</span> <span id="L1082" class="LineNr">1082 </span> x:text <span class="Special"><-</span> new <span class="Constant">[]</span> <span id="L1083" class="LineNr">1083 </span> run [ -<span id="L1084" class="LineNr">1084 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, x,<span class="Constant"> 0</span> +<span id="L1084" class="LineNr">1084 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, x,<span class="Constant"> 0</span> <span id="L1085" class="LineNr">1085 </span> ] <span id="L1086" class="LineNr">1086 </span> memory-should-contain [ <span id="L1087" class="LineNr">1087 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># matches because pattern is also empty</span> @@ -1151,7 +1151,7 @@ if ('onhashchange' in window) { <span id="L1093" class="LineNr">1093 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1094" class="LineNr">1094 </span> y:text <span class="Special"><-</span> new <span class="Constant">[bc]</span> <span id="L1095" class="LineNr">1095 </span> run [ -<span id="L1096" class="LineNr">1096 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, y,<span class="Constant"> 1</span> +<span id="L1096" class="LineNr">1096 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, y,<span class="Constant"> 1</span> <span id="L1097" class="LineNr">1097 </span> ] <span id="L1098" class="LineNr">1098 </span> memory-should-contain [ <span id="L1099" class="LineNr">1099 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># match</span> @@ -1163,14 +1163,14 @@ if ('onhashchange' in window) { <span id="L1105" class="LineNr">1105 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1106" class="LineNr">1106 </span> y:text <span class="Special"><-</span> new <span class="Constant">[bc]</span> <span id="L1107" class="LineNr">1107 </span> run [ -<span id="L1108" class="LineNr">1108 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> match-at x, y,<span class="Constant"> 0</span> +<span id="L1108" class="LineNr">1108 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='061text.mu.html#L978'>match-at</a> x, y,<span class="Constant"> 0</span> <span id="L1109" class="LineNr">1109 </span> ] <span id="L1110" class="LineNr">1110 </span> memory-should-contain [ <span id="L1111" class="LineNr">1111 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># no match</span> <span id="L1112" class="LineNr">1112 </span> ] <span id="L1113" class="LineNr">1113 </span>] <span id="L1114" class="LineNr">1114 </span> -<span id="L1115" class="LineNr">1115 </span><span class="muRecipe">def</span> split s:text, delim:char<span class="muRecipe"> -> </span>result:&:@:text [ +<span id="L1115" class="LineNr">1115 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L1115'>split</a> s:text, delim:char<span class="muRecipe"> -> </span>result:&:@:text [ <span id="L1116" class="LineNr">1116 </span> <span class="Constant">local-scope</span> <span id="L1117" class="LineNr">1117 </span> <span class="Constant">load-ingredients</span> <span id="L1118" class="LineNr">1118 </span> <span class="Comment"># empty text? return empty array</span> @@ -1203,7 +1203,7 @@ if ('onhashchange' in window) { <span id="L1145" class="LineNr">1145 </span> <span class="muControl">break-if</span> done? <span id="L1146" class="LineNr">1146 </span> end:num <span class="Special"><-</span> find-next s, delim, start <span id="L1147" class="LineNr">1147 </span> <span class="Comment"># copy start..end into result[curr-result]</span> -<span id="L1148" class="LineNr">1148 </span> dest:text <span class="Special"><-</span> copy-range s, start, end +<span id="L1148" class="LineNr">1148 </span> dest:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> s, start, end <span id="L1149" class="LineNr">1149 </span> *result <span class="Special"><-</span> put-index *result, curr-result, dest <span id="L1150" class="LineNr">1150 </span> <span class="Comment"># slide over to next slice</span> <span id="L1151" class="LineNr">1151 </span> start <span class="Special"><-</span> add end,<span class="Constant"> 1</span> @@ -1216,7 +1216,7 @@ if ('onhashchange' in window) { <span id="L1158" class="LineNr">1158 </span> <span class="Constant">local-scope</span> <span id="L1159" class="LineNr">1159 </span> x:text <span class="Special"><-</span> new <span class="Constant">[a/b]</span> <span id="L1160" class="LineNr">1160 </span> run [ -<span id="L1161" class="LineNr">1161 </span> y:&:@:text <span class="Special"><-</span> split x, <span class="Constant">47/slash</span> +<span id="L1161" class="LineNr">1161 </span> y:&:@:text <span class="Special"><-</span> <a href='061text.mu.html#L1115'>split</a> x, <span class="Constant">47/slash</span> <span id="L1162" class="LineNr">1162 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> length *y <span id="L1163" class="LineNr">1163 </span> a:text <span class="Special"><-</span> index *y,<span class="Constant"> 0</span> <span id="L1164" class="LineNr">1164 </span> b:text <span class="Special"><-</span> index *y,<span class="Constant"> 1</span> @@ -1234,7 +1234,7 @@ if ('onhashchange' in window) { <span id="L1176" class="LineNr">1176 </span> <span class="Constant">local-scope</span> <span id="L1177" class="LineNr">1177 </span> x:text <span class="Special"><-</span> new <span class="Constant">[a/b/c]</span> <span id="L1178" class="LineNr">1178 </span> run [ -<span id="L1179" class="LineNr">1179 </span> y:&:@:text <span class="Special"><-</span> split x, <span class="Constant">47/slash</span> +<span id="L1179" class="LineNr">1179 </span> y:&:@:text <span class="Special"><-</span> <a href='061text.mu.html#L1115'>split</a> x, <span class="Constant">47/slash</span> <span id="L1180" class="LineNr">1180 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> length *y <span id="L1181" class="LineNr">1181 </span> a:text <span class="Special"><-</span> index *y,<span class="Constant"> 0</span> <span id="L1182" class="LineNr">1182 </span> b:text <span class="Special"><-</span> index *y,<span class="Constant"> 1</span> @@ -1255,7 +1255,7 @@ if ('onhashchange' in window) { <span id="L1197" class="LineNr">1197 </span> <span class="Constant">local-scope</span> <span id="L1198" class="LineNr">1198 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1199" class="LineNr">1199 </span> run [ -<span id="L1200" class="LineNr">1200 </span> y:&:@:text <span class="Special"><-</span> split x, <span class="Constant">47/slash</span> +<span id="L1200" class="LineNr">1200 </span> y:&:@:text <span class="Special"><-</span> <a href='061text.mu.html#L1115'>split</a> x, <span class="Constant">47/slash</span> <span id="L1201" class="LineNr">1201 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> length *y <span id="L1202" class="LineNr">1202 </span> a:text <span class="Special"><-</span> index *y,<span class="Constant"> 0</span> <span id="L1203" class="LineNr">1203 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *a @@ -1270,7 +1270,7 @@ if ('onhashchange' in window) { <span id="L1212" class="LineNr">1212 </span> <span class="Constant">local-scope</span> <span id="L1213" class="LineNr">1213 </span> x:text <span class="Special"><-</span> new <span class="Constant">[]</span> <span id="L1214" class="LineNr">1214 </span> run [ -<span id="L1215" class="LineNr">1215 </span> y:&:@:text <span class="Special"><-</span> split x, <span class="Constant">47/slash</span> +<span id="L1215" class="LineNr">1215 </span> y:&:@:text <span class="Special"><-</span> <a href='061text.mu.html#L1115'>split</a> x, <span class="Constant">47/slash</span> <span id="L1216" class="LineNr">1216 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> length *y <span id="L1217" class="LineNr">1217 </span> ] <span id="L1218" class="LineNr">1218 </span> memory-should-contain [ @@ -1282,7 +1282,7 @@ if ('onhashchange' in window) { <span id="L1224" class="LineNr">1224 </span> <span class="Constant">local-scope</span> <span id="L1225" class="LineNr">1225 </span> x:text <span class="Special"><-</span> new <span class="Constant">[a/b//c]</span> <span id="L1226" class="LineNr">1226 </span> run [ -<span id="L1227" class="LineNr">1227 </span> y:&:@:text <span class="Special"><-</span> split x:text, <span class="Constant">47/slash</span> +<span id="L1227" class="LineNr">1227 </span> y:&:@:text <span class="Special"><-</span> <a href='061text.mu.html#L1115'>split</a> x:text, <span class="Constant">47/slash</span> <span id="L1228" class="LineNr">1228 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> length *y <span id="L1229" class="LineNr">1229 </span> a:text <span class="Special"><-</span> index *y,<span class="Constant"> 0</span> <span id="L1230" class="LineNr">1230 </span> b:text <span class="Special"><-</span> index *y,<span class="Constant"> 1</span> @@ -1302,7 +1302,7 @@ if ('onhashchange' in window) { <span id="L1244" class="LineNr">1244 </span> ] <span id="L1245" class="LineNr">1245 </span>] <span id="L1246" class="LineNr">1246 </span> -<span id="L1247" class="LineNr">1247 </span><span class="muRecipe">def</span> split-first text:text, delim:char<span class="muRecipe"> -> </span>x:text, y:text [ +<span id="L1247" class="LineNr">1247 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L1247'>split-first</a> text:text, delim:char<span class="muRecipe"> -> </span>x:text, y:text [ <span id="L1248" class="LineNr">1248 </span> <span class="Constant">local-scope</span> <span id="L1249" class="LineNr">1249 </span> <span class="Constant">load-ingredients</span> <span id="L1250" class="LineNr">1250 </span> <span class="Comment"># empty text? return empty texts</span> @@ -1315,16 +1315,16 @@ if ('onhashchange' in window) { <span id="L1257" class="LineNr">1257 </span> <span class="muControl">return</span> <span id="L1258" class="LineNr">1258 </span> <span class="Delimiter">}</span> <span id="L1259" class="LineNr">1259 </span> idx:num <span class="Special"><-</span> find-next text, delim,<span class="Constant"> 0</span> -<span id="L1260" class="LineNr">1260 </span> x:text <span class="Special"><-</span> copy-range text,<span class="Constant"> 0</span>, idx +<span id="L1260" class="LineNr">1260 </span> x:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> text,<span class="Constant"> 0</span>, idx <span id="L1261" class="LineNr">1261 </span> idx <span class="Special"><-</span> add idx,<span class="Constant"> 1</span> -<span id="L1262" class="LineNr">1262 </span> y:text <span class="Special"><-</span> copy-range text, idx, len +<span id="L1262" class="LineNr">1262 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> text, idx, len <span id="L1263" class="LineNr">1263 </span>] <span id="L1264" class="LineNr">1264 </span> <span id="L1265" class="LineNr">1265 </span><span class="muScenario">scenario</span> text-split-first [ <span id="L1266" class="LineNr">1266 </span> <span class="Constant">local-scope</span> <span id="L1267" class="LineNr">1267 </span> x:text <span class="Special"><-</span> new <span class="Constant">[a/b]</span> <span id="L1268" class="LineNr">1268 </span> run [ -<span id="L1269" class="LineNr">1269 </span> y:text, z:text <span class="Special"><-</span> split-first x, <span class="Constant">47/slash</span> +<span id="L1269" class="LineNr">1269 </span> y:text, z:text <span class="Special"><-</span> <a href='061text.mu.html#L1247'>split-first</a> x, <span class="Constant">47/slash</span> <span id="L1270" class="LineNr">1270 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L1271" class="LineNr">1271 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *z <span id="L1272" class="LineNr">1272 </span> ] @@ -1334,7 +1334,7 @@ if ('onhashchange' in window) { <span id="L1276" class="LineNr">1276 </span> ] <span id="L1277" class="LineNr">1277 </span>] <span id="L1278" class="LineNr">1278 </span> -<span id="L1279" class="LineNr">1279 </span><span class="muRecipe">def</span> copy-range buf:text, start:num, end:num<span class="muRecipe"> -> </span>result:text [ +<span id="L1279" class="LineNr">1279 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L1279'>copy-range</a> buf:text, start:num, end:num<span class="muRecipe"> -> </span>result:text [ <span id="L1280" class="LineNr">1280 </span> <span class="Constant">local-scope</span> <span id="L1281" class="LineNr">1281 </span> <span class="Constant">load-ingredients</span> <span id="L1282" class="LineNr">1282 </span> <span class="Comment"># if end is out of bounds, trim it</span> @@ -1361,7 +1361,7 @@ if ('onhashchange' in window) { <span id="L1303" class="LineNr">1303 </span> <span class="Constant">local-scope</span> <span id="L1304" class="LineNr">1304 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1305" class="LineNr">1305 </span> run [ -<span id="L1306" class="LineNr">1306 </span> y:text <span class="Special"><-</span> copy-range x,<span class="Constant"> 1</span>,<span class="Constant"> 3</span> +<span id="L1306" class="LineNr">1306 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> x,<span class="Constant"> 1</span>,<span class="Constant"> 3</span> <span id="L1307" class="LineNr">1307 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L1308" class="LineNr">1308 </span> ] <span id="L1309" class="LineNr">1309 </span> memory-should-contain [ @@ -1373,7 +1373,7 @@ if ('onhashchange' in window) { <span id="L1315" class="LineNr">1315 </span> <span class="Constant">local-scope</span> <span id="L1316" class="LineNr">1316 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1317" class="LineNr">1317 </span> run [ -<span id="L1318" class="LineNr">1318 </span> y:text <span class="Special"><-</span> copy-range x,<span class="Constant"> 2</span>,<span class="Constant"> 4</span> +<span id="L1318" class="LineNr">1318 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> x,<span class="Constant"> 2</span>,<span class="Constant"> 4</span> <span id="L1319" class="LineNr">1319 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L1320" class="LineNr">1320 </span> ] <span id="L1321" class="LineNr">1321 </span> memory-should-contain [ @@ -1385,7 +1385,7 @@ if ('onhashchange' in window) { <span id="L1327" class="LineNr">1327 </span> <span class="Constant">local-scope</span> <span id="L1328" class="LineNr">1328 </span> x:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> <span id="L1329" class="LineNr">1329 </span> run [ -<span id="L1330" class="LineNr">1330 </span> y:text <span class="Special"><-</span> copy-range x,<span class="Constant"> 3</span>,<span class="Constant"> 3</span> +<span id="L1330" class="LineNr">1330 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> x,<span class="Constant"> 3</span>,<span class="Constant"> 3</span> <span id="L1331" class="LineNr">1331 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L1332" class="LineNr">1332 </span> ] <span id="L1333" class="LineNr">1333 </span> memory-should-contain [ @@ -1393,7 +1393,7 @@ if ('onhashchange' in window) { <span id="L1335" class="LineNr">1335 </span> ] <span id="L1336" class="LineNr">1336 </span>] <span id="L1337" class="LineNr">1337 </span> -<span id="L1338" class="LineNr">1338 </span><span class="muRecipe">def</span> parse-whole-number in:text<span class="muRecipe"> -> </span>out:num, error?:bool [ +<span id="L1338" class="LineNr">1338 </span><span class="muRecipe">def</span> <a href='061text.mu.html#L1338'>parse-whole-number</a> in:text<span class="muRecipe"> -> </span>out:num, error?:bool [ <span id="L1339" class="LineNr">1339 </span> <span class="Constant">local-scope</span> <span id="L1340" class="LineNr">1340 </span> <span class="Constant">load-ingredients</span> <span id="L1341" class="LineNr">1341 </span> out <span class="Special"><-</span> copy<span class="Constant"> 0</span> @@ -1405,7 +1405,7 @@ if ('onhashchange' in window) { <span id="L1347" class="LineNr">1347 </span> <span class="muControl">break-if</span> done? <span id="L1348" class="LineNr">1348 </span> c:char <span class="Special"><-</span> index *in, i <span id="L1349" class="LineNr">1349 </span> x:num <span class="Special"><-</span> character-to-code c -<span id="L1350" class="LineNr">1350 </span> digit:num, error?:bool <span class="Special"><-</span> character-code-to-digit x +<span id="L1350" class="LineNr">1350 </span> digit:num, error?:bool <span class="Special"><-</span> <a href='061text.mu.html#L1362'>character-code-to-digit</a> x <span id="L1351" class="LineNr">1351 </span> <span class="muControl">reply-if</span> error? <span id="L1352" class="LineNr">1352 </span> result <span class="Special"><-</span> multiply result,<span class="Constant"> 10</span> <span id="L1353" class="LineNr">1353 </span> result <span class="Special"><-</span> add result, digit @@ -1417,7 +1417,7 @@ if ('onhashchange' in window) { <span id="L1359" class="LineNr">1359 </span>] <span id="L1360" class="LineNr">1360 </span> <span id="L1361" class="LineNr">1361 </span><span class="Comment"># (contributed by Ella Couch)</span> -<span id="L1362" class="LineNr">1362 </span><span class="muRecipe">recipe</span> character-code-to-digit character-code:number<span class="muRecipe"> -> </span>result:number, error?:boolean [ +<span id="L1362" class="LineNr">1362 </span><span class="muRecipe">recipe</span> <a href='061text.mu.html#L1362'>character-code-to-digit</a> character-code:number<span class="muRecipe"> -> </span>result:number, error?:boolean [ <span id="L1363" class="LineNr">1363 </span> <span class="Constant">local-scope</span> <span id="L1364" class="LineNr">1364 </span> <span class="Constant">load-ingredients</span> <span id="L1365" class="LineNr">1365 </span> result <span class="Special"><-</span> copy<span class="Constant"> 0</span> @@ -1432,7 +1432,7 @@ if ('onhashchange' in window) { <span id="L1374" class="LineNr">1374 </span> <span class="Constant">local-scope</span> <span id="L1375" class="LineNr">1375 </span> a:number <span class="Special"><-</span> copy<span class="Constant"> 48</span> <span class="Comment"># character code for '0'</span> <span id="L1376" class="LineNr">1376 </span> run [ -<span id="L1377" class="LineNr">1377 </span> 10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special"><-</span> character-code-to-digit 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"><-</span> <a href='061text.mu.html#L1362'>character-code-to-digit</a> a <span id="L1378" class="LineNr">1378 </span> ] <span id="L1379" class="LineNr">1379 </span> memory-should-contain [ <span id="L1380" class="LineNr">1380 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> @@ -1444,7 +1444,7 @@ if ('onhashchange' in window) { <span id="L1386" class="LineNr">1386 </span> <span class="Constant">local-scope</span> <span id="L1387" class="LineNr">1387 </span> a:number <span class="Special"><-</span> copy<span class="Constant"> 57</span> <span class="Comment"># character code for '9'</span> <span id="L1388" class="LineNr">1388 </span> run [ -<span id="L1389" class="LineNr">1389 </span> 1:number/<span class="Special">raw</span>, 2:boolean/<span class="Special">raw</span> <span class="Special"><-</span> character-code-to-digit 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"><-</span> <a href='061text.mu.html#L1362'>character-code-to-digit</a> a <span id="L1390" class="LineNr">1390 </span> ] <span id="L1391" class="LineNr">1391 </span> memory-should-contain [ <span id="L1392" class="LineNr">1392 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 9</span> @@ -1456,7 +1456,7 @@ if ('onhashchange' in window) { <span id="L1398" class="LineNr">1398 </span> <span class="Constant">local-scope</span> <span id="L1399" class="LineNr">1399 </span> a:number <span class="Special"><-</span> copy<span class="Constant"> 47</span> <span id="L1400" class="LineNr">1400 </span> run [ -<span id="L1401" class="LineNr">1401 </span> 10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special"><-</span> character-code-to-digit 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"><-</span> <a href='061text.mu.html#L1362'>character-code-to-digit</a> a <span id="L1402" class="LineNr">1402 </span> ] <span id="L1403" class="LineNr">1403 </span> memory-should-contain [ <span id="L1404" class="LineNr">1404 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> @@ -1468,7 +1468,7 @@ if ('onhashchange' in window) { <span id="L1410" class="LineNr">1410 </span> <span class="Constant">local-scope</span> <span id="L1411" class="LineNr">1411 </span> a:number <span class="Special"><-</span> copy<span class="Constant"> 58</span> <span id="L1412" class="LineNr">1412 </span> run [ -<span id="L1413" class="LineNr">1413 </span> 10:number/<span class="Special">raw</span>, 11:boolean/<span class="Special">raw</span> <span class="Special"><-</span> character-code-to-digit 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"><-</span> <a href='061text.mu.html#L1362'>character-code-to-digit</a> a <span id="L1414" class="LineNr">1414 </span> ] <span id="L1415" class="LineNr">1415 </span> memory-should-contain [ <span id="L1416" class="LineNr">1416 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> diff --git a/html/062convert_ingredients_to_text.cc.html b/html/062convert_ingredients_to_text.cc.html index d543ebde..30df5a69 100644 --- a/html/062convert_ingredients_to_text.cc.html +++ b/html/062convert_ingredients_to_text.cc.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario rewrite_stashes_to_text)</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L6" class="LineNr"> 6 </span> local-scope <span id="L7" class="LineNr"> 7 </span> <span class="Normal">n</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L8" class="LineNr"> 8 </span> stash n @@ -70,19 +70,19 @@ if ('onhashchange' in window) { <span id="L11" class="LineNr"> 11 </span><span class="traceContains">+transform: stash {stash_2_0: ("address" "array" "character")}</span> <span id="L12" class="LineNr"> 12 </span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario rewrite_traces_to_text)</span> -<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [ +<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L15" class="LineNr"> 15 </span> local-scope <span id="L16" class="LineNr"> 16 </span> <span class="Normal">n</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L17" class="LineNr"> 17 </span> trace <span class="Constant">2</span><span class="Delimiter">,</span> [app]<span class="Delimiter">,</span> n +<span id="L17" class="LineNr"> 17 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">2</span><span class="Delimiter">,</span> [app]<span class="Delimiter">,</span> n <span id="L18" class="LineNr"> 18 </span>] <span id="L19" class="LineNr"> 19 </span><span class="traceContains">+transform: {trace_2_2: ("address" "array" "character")} <- to-text-line {n: "number"}</span> -<span id="L20" class="LineNr"> 20 </span><span class="traceContains">+transform: trace {2: "literal"}, {"app": "literal-string"}, {trace_2_2: ("address" "array" "character")}</span> +<span id="L20" class="LineNr"> 20 </span><span class="traceContains">+transform: <a href='003trace.cc.html#L171'>trace</a> {2: "literal"}, {"app": "literal-string"}, {trace_2_2: ("address" "array" "character")}</span> <span id="L21" class="LineNr"> 21 </span> <span id="L22" class="LineNr"> 22 </span><span class="Comment">//: special case: rewrite attempts to stash contents of most arrays to avoid</span> <span id="L23" class="LineNr"> 23 </span><span class="Comment">//: passing addresses around</span> <span id="L24" class="LineNr"> 24 </span> <span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(scenario rewrite_stashes_of_arrays)</span> -<span id="L26" class="LineNr"> 26 </span><span class="muRecipe">def</span> main [ +<span id="L26" class="LineNr"> 26 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L27" class="LineNr"> 27 </span> local-scope <span id="L28" class="LineNr"> 28 </span> <span class="Normal">n</span>:&:@:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span><span class="Delimiter">,</span> <span class="Constant">3</span> <span id="L29" class="LineNr"> 29 </span> stash *n @@ -91,7 +91,7 @@ if ('onhashchange' in window) { <span id="L32" class="LineNr"> 32 </span><span class="traceContains">+transform: stash {stash_2_0: ("address" "array" "character")}</span> <span id="L33" class="LineNr"> 33 </span> <span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(scenario ignore_stashes_of_static_arrays)</span> -<span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> main [ +<span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L36" class="LineNr"> 36 </span> local-scope <span id="L37" class="LineNr"> 37 </span> <span class="Normal">n</span>:@:num:<span class="Constant">3</span><span class="Special"> <- </span>create-array <span id="L38" class="LineNr"> 38 </span> stash n @@ -116,32 +116,32 @@ if ('onhashchange' in window) { <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> <span id="L58" class="LineNr"> 58 </span> <span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(code)</span> -<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> +<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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L61" class="LineNr"> 61 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L62" class="LineNr"> 62 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- convert some ingredients to text in recipe "</span> << caller<span class="Delimiter">.</span>name << end<span class="Delimiter">();</span> +<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- convert some ingredients to text in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L63" class="LineNr"> 63 </span> <span class="Comment">// in recipes without named locations, 'stash' is still not extensible</span> -<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> +<span id="L64" class="LineNr"> 64 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='060rewrite_literal_string.cc.html#L62'>contains_numeric_locations</a><span class="Delimiter">(</span>caller<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L65" class="LineNr"> 65 </span> convert_ingredients_to_text<span class="Delimiter">(</span>caller<span class="Delimiter">);</span> <span id="L66" class="LineNr"> 66 </span><span class="Delimiter">}</span> <span id="L67" class="LineNr"> 67 </span> <span id="L68" class="LineNr"> 68 </span><span class="Normal">void</span> convert_ingredients_to_text<span class="Delimiter">(</span>recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L69" class="LineNr"> 69 </span> vector<instruction> new_instructions<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L71" class="LineNr"> 71 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L72" class="LineNr"> 72 </span> <span class="Comment">// all these cases are getting hairy. how can we make this extensible?</span> <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">"stash"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L75" class="LineNr"> 75 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><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> <span id="L76" class="LineNr"> 76 </span> ostringstream ingredient_name<span class="Delimiter">;</span> -<span id="L77" class="LineNr"> 77 </span> ingredient_name << <span class="Constant">"stash_"</span> << i << <span class="Constant">'_'</span> << j << <span class="Constant">":address:array:character"</span><span class="Delimiter">;</span> +<span id="L77" class="LineNr"> 77 </span> ingredient_name << <span class="Constant">"stash_"</span> << i << <span class="Constant">'_'</span> << j << <span class="Constant">":<a href='043space.cc.html#L76'>address</a>:array:character"</span><span class="Delimiter">;</span> <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> <span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">}</span> <span id="L80" class="LineNr"> 80 </span> <span class="Delimiter">}</span> <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">"trace"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L83" class="LineNr"> 83 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><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> <span id="L84" class="LineNr"> 84 </span> ostringstream ingredient_name<span class="Delimiter">;</span> -<span id="L85" class="LineNr"> 85 </span> ingredient_name << <span class="Constant">"trace_"</span> << i << <span class="Constant">'_'</span> << j << <span class="Constant">":address:array:character"</span><span class="Delimiter">;</span> +<span id="L85" class="LineNr"> 85 </span> ingredient_name << <span class="Constant">"trace_"</span> << i << <span class="Constant">'_'</span> << j << <span class="Constant">":<a href='043space.cc.html#L76'>address</a>:array:character"</span><span class="Delimiter">;</span> <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> <span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span> <span id="L88" class="LineNr"> 88 </span> <span class="Delimiter">}</span> @@ -151,15 +151,15 @@ if ('onhashchange' in window) { <span id="L92" class="LineNr"> 92 </span> <span class="Comment">// new variants that match:</span> <span id="L93" class="LineNr"> 93 </span> <span class="Comment">// append _:text, ___</span> <span id="L94" class="LineNr"> 94 </span> <span class="Comment">// will never ever get used.</span> -<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> -<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 < 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 id="L95" class="LineNr"> 95 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> || <a href='027call_ingredient.cc.html#L174'>is_mu_text</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L97" class="LineNr"> 97 </span> ostringstream ingredient_name<span class="Delimiter">;</span> -<span id="L98" class="LineNr"> 98 </span> ingredient_name << <span class="Constant">"append_"</span> << i << <span class="Constant">'_'</span> << j << <span class="Constant">":address:array:character"</span><span class="Delimiter">;</span> +<span id="L98" class="LineNr"> 98 </span> ingredient_name << <span class="Constant">"append_"</span> << i << <span class="Constant">'_'</span> << j << <span class="Constant">":<a href='043space.cc.html#L76'>address</a>:array:character"</span><span class="Delimiter">;</span> <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> <span id="L100" class="LineNr">100 </span> <span class="Delimiter">}</span> <span id="L101" class="LineNr">101 </span> <span class="Delimiter">}</span> <span id="L102" class="LineNr">102 </span> <span class="Delimiter">}</span> -<span id="L103" class="LineNr">103 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L103" class="LineNr">103 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L104" class="LineNr">104 </span> new_instructions<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>inst<span class="Delimiter">);</span> <span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span> <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> @@ -169,10 +169,10 @@ if ('onhashchange' in window) { <span id="L110" class="LineNr">110 </span><span class="Comment">// replace r with converted text</span> <span id="L111" class="LineNr">111 </span><span class="Normal">void</span> convert_ingredient_to_text<span class="Delimiter">(</span>reagent& r<span class="Delimiter">,</span> vector<instruction>& out<span class="Delimiter">,</span> <span class="Normal">const</span> string& tmp_var<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> +<span id="L113" class="LineNr">113 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L174'>is_mu_text</a><span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L114" class="LineNr">114 </span> <span class="Comment">// don't try to extend static arrays</span> <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> -<span id="L116" class="LineNr">116 </span> instruction def<span class="Delimiter">;</span> +<span id="L116" class="LineNr">116 </span> <a href='010vm.cc.html#L32'>instruction</a> def<span class="Delimiter">;</span> <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> <span id="L118" class="LineNr">118 </span> def<span class="Delimiter">.</span>name = <span class="Constant">"array-to-text-line"</span><span class="Delimiter">;</span> <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> @@ -184,9 +184,9 @@ if ('onhashchange' in window) { <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> <span id="L126" class="LineNr">126 </span> <span class="Delimiter">}</span> <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> -<span id="L128" class="LineNr">128 </span> trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << to_string<span class="Delimiter">(</span>def<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L128" class="LineNr">128 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>def<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L129" class="LineNr">129 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>def<span class="Delimiter">);</span> -<span id="L130" class="LineNr">130 </span> r<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> <span class="Comment">// reclaim old memory</span> +<span id="L130" class="LineNr">130 </span> r<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span class="Comment">// reclaim old memory</span> <span id="L131" class="LineNr">131 </span> r = reagent<span class="Delimiter">(</span>tmp_var<span class="Delimiter">);</span> <span id="L132" class="LineNr">132 </span><span class="Delimiter">}</span> <span id="L133" class="LineNr">133 </span> @@ -204,7 +204,7 @@ if ('onhashchange' in window) { <span id="L145" class="LineNr">145 </span> <span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenarios run)</span> <span id="L147" class="LineNr">147 </span><span class="Delimiter">:(scenario append_other_types_to_text)</span> -<span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> main [ +<span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L149" class="LineNr">149 </span> local-scope <span id="L150" class="LineNr">150 </span> <span class="Normal">n</span>:num<span class="Special"> <- </span>copy <span class="Constant">11</span> <span id="L151" class="LineNr">151 </span> <span class="Normal">c</span>:character<span class="Special"> <- </span>copy <span class="Constant">111</span>/o @@ -222,7 +222,7 @@ if ('onhashchange' in window) { <span id="L163" class="LineNr">163 </span> <span class="Normal">x</span>:num <span id="L164" class="LineNr">164 </span> <span class="Normal">y</span>:num <span id="L165" class="LineNr">165 </span>] -<span id="L166" class="LineNr">166 </span><span class="muRecipe">def</span> main [ +<span id="L166" class="LineNr">166 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L167" class="LineNr">167 </span> local-scope <span id="L168" class="LineNr">168 </span> <span class="Normal">x</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L169" class="LineNr">169 </span> stash x diff --git a/html/063array.mu.html b/html/063array.mu.html index 23337615..55a44ac1 100644 --- a/html/063array.mu.html +++ b/html/063array.mu.html @@ -58,7 +58,7 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="muScenario">scenario</span> array-from-args [ <span id="L2" class="LineNr"> 2 </span> run [ <span id="L3" class="LineNr"> 3 </span> <span class="Constant">local-scope</span> -<span id="L4" class="LineNr"> 4 </span> x:&:@:num <span class="Special"><-</span> new-array<span class="Constant"> 0</span>,<span class="Constant"> 1</span>,<span class="Constant"> 2</span> +<span id="L4" class="LineNr"> 4 </span> x:&:@:num <span class="Special"><-</span> <a href='063array.mu.html#L16'>new-array</a><span class="Constant"> 0</span>,<span class="Constant"> 1</span>,<span class="Constant"> 2</span> <span id="L5" class="LineNr"> 5 </span> 10:@:num/<span class="Special">raw</span> <span class="Special"><-</span> copy *x <span id="L6" class="LineNr"> 6 </span> ] <span id="L7" class="LineNr"> 7 </span> memory-should-contain [ @@ -70,22 +70,22 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr"> 13 </span>] <span id="L14" class="LineNr"> 14 </span> <span id="L15" class="LineNr"> 15 </span><span class="Comment"># create an array out of a list of args</span> -<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> new-array<span class="muRecipe"> -> </span>result:&:@:_elem [ +<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> <a href='063array.mu.html#L16'>new-array</a><span class="muRecipe"> -> </span>result:&:@:_elem [ <span id="L17" class="LineNr"> 17 </span> <span class="Constant">local-scope</span> -<span id="L18" class="LineNr"> 18 </span> capacity:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> +<span id="L18" class="LineNr"> 18 </span> <a href='075channel.mu.html#L379'>capacity</a>:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L19" class="LineNr"> 19 </span> <span class="Delimiter">{</span> <span id="L20" class="LineNr"> 20 </span> <span class="Comment"># while read curr-value</span> <span id="L21" class="LineNr"> 21 </span> curr-value:_elem, exists?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> <span id="L22" class="LineNr"> 22 </span> <span class="muControl">break-unless</span> exists? -<span id="L23" class="LineNr"> 23 </span> capacity <span class="Special"><-</span> add capacity,<span class="Constant"> 1</span> +<span id="L23" class="LineNr"> 23 </span> <a href='075channel.mu.html#L379'>capacity</a> <span class="Special"><-</span> add <a href='075channel.mu.html#L379'>capacity</a>,<span class="Constant"> 1</span> <span id="L24" class="LineNr"> 24 </span> <span class="muControl">loop</span> <span id="L25" class="LineNr"> 25 </span> <span class="Delimiter">}</span> -<span id="L26" class="LineNr"> 26 </span> result <span class="Special"><-</span> new <span class="Constant">_elem:type</span>, capacity +<span id="L26" class="LineNr"> 26 </span> result <span class="Special"><-</span> new <span class="Constant">_elem:type</span>, <a href='075channel.mu.html#L379'>capacity</a> <span id="L27" class="LineNr"> 27 </span> <span class="Constant">rewind-ingredients</span> <span id="L28" class="LineNr"> 28 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L29" class="LineNr"> 29 </span> <span class="Delimiter">{</span> <span id="L30" class="LineNr"> 30 </span> <span class="Comment"># while read curr-value</span> -<span id="L31" class="LineNr"> 31 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, capacity +<span id="L31" class="LineNr"> 31 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, <a href='075channel.mu.html#L379'>capacity</a> <span id="L32" class="LineNr"> 32 </span> <span class="muControl">break-if</span> done? <span id="L33" class="LineNr"> 33 </span> curr-value:_elem, exists?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> <span id="L34" class="LineNr"> 34 </span> assert exists?, <span class="Constant">[error in rewinding ingredients to new-array]</span> @@ -98,7 +98,7 @@ if ('onhashchange' in window) { <span id="L41" class="LineNr"> 41 </span> <span id="L42" class="LineNr"> 42 </span><span class="Comment"># fill an existing array with a set of numbers</span> <span id="L43" class="LineNr"> 43 </span><span class="Comment"># (contributed by Caleb Couch)</span> -<span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> fill array:&:@:num<span class="muRecipe"> -> </span>array:&:@:num [ +<span id="L44" class="LineNr"> 44 </span><span class="muRecipe">def</span> <a href='063array.mu.html#L44'>fill</a> array:&:@:num<span class="muRecipe"> -> </span>array:&:@:num [ <span id="L45" class="LineNr"> 45 </span> <span class="Constant">local-scope</span> <span id="L46" class="LineNr"> 46 </span> <span class="Constant">load-ingredients</span> <span id="L47" class="LineNr"> 47 </span> loopn:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> @@ -118,7 +118,7 @@ if ('onhashchange' in window) { <span id="L61" class="LineNr"> 61 </span> <span class="Constant">local-scope</span> <span id="L62" class="LineNr"> 62 </span> array:&:@:num <span class="Special"><-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span> <span id="L63" class="LineNr"> 63 </span> run [ -<span id="L64" class="LineNr"> 64 </span> array <span class="Special"><-</span> fill array,<span class="Constant"> 1 2 3</span> +<span id="L64" class="LineNr"> 64 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L44'>fill</a> array,<span class="Constant"> 1 2 3</span> <span id="L65" class="LineNr"> 65 </span> 10:@:num/<span class="Special">raw</span> <span class="Special"><-</span> copy *array <span id="L66" class="LineNr"> 66 </span> ] <span id="L67" class="LineNr"> 67 </span> memory-should-contain [ @@ -134,7 +134,7 @@ if ('onhashchange' in window) { <span id="L77" class="LineNr"> 77 </span> array:&:@:num <span class="Special"><-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span> <span id="L78" class="LineNr"> 78 </span> *array <span class="Special"><-</span> put-index *array,<span class="Constant"> 0</span>,<span class="Constant"> 4</span> <span id="L79" class="LineNr"> 79 </span> run [ -<span id="L80" class="LineNr"> 80 </span> array <span class="Special"><-</span> fill array,<span class="Constant"> 1 2 3</span> +<span id="L80" class="LineNr"> 80 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L44'>fill</a> array,<span class="Constant"> 1 2 3</span> <span id="L81" class="LineNr"> 81 </span> 10:@:num/<span class="Special">raw</span> <span class="Special"><-</span> copy *array <span id="L82" class="LineNr"> 82 </span> ] <span id="L83" class="LineNr"> 83 </span> memory-should-contain [ @@ -149,7 +149,7 @@ if ('onhashchange' in window) { <span id="L92" class="LineNr"> 92 </span> <span class="Constant">local-scope</span> <span id="L93" class="LineNr"> 93 </span> array:&:@:num <span class="Special"><-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span> <span id="L94" class="LineNr"> 94 </span> run [ -<span id="L95" class="LineNr"> 95 </span> array <span class="Special"><-</span> fill array +<span id="L95" class="LineNr"> 95 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L44'>fill</a> array <span id="L96" class="LineNr"> 96 </span> 10:@:num/<span class="Special">raw</span> <span class="Special"><-</span> copy *array <span id="L97" class="LineNr"> 97 </span> ] <span id="L98" class="LineNr"> 98 </span> memory-should-contain [ @@ -162,7 +162,7 @@ if ('onhashchange' in window) { <span id="L105" class="LineNr">105 </span> <span id="L106" class="LineNr">106 </span><span class="Comment"># swap two elements of an array</span> <span id="L107" class="LineNr">107 </span><span class="Comment"># (contributed by Caleb Couch)</span> -<span id="L108" class="LineNr">108 </span><span class="muRecipe">def</span> swap array:&:@:num, index1:num, index2:num<span class="muRecipe"> -> </span>array:&:@:num [ +<span id="L108" class="LineNr">108 </span><span class="muRecipe">def</span> <a href='063array.mu.html#L108'>swap</a> array:&:@:num, index1:num, index2:num<span class="muRecipe"> -> </span>array:&:@:num [ <span id="L109" class="LineNr">109 </span> <span class="Constant">local-scope</span> <span id="L110" class="LineNr">110 </span> <span class="Constant">load-ingredients</span> <span id="L111" class="LineNr">111 </span> object1:num <span class="Special"><-</span> index *array, index1 @@ -174,9 +174,9 @@ if ('onhashchange' in window) { <span id="L117" class="LineNr">117 </span><span class="muScenario">scenario</span> swap-works [ <span id="L118" class="LineNr">118 </span> <span class="Constant">local-scope</span> <span id="L119" class="LineNr">119 </span> array:&:@:num <span class="Special"><-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 4</span> -<span id="L120" class="LineNr">120 </span> array <span class="Special"><-</span> fill array,<span class="Constant"> 4 3 2 1</span> +<span id="L120" class="LineNr">120 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L44'>fill</a> array,<span class="Constant"> 4 3 2 1</span> <span id="L121" class="LineNr">121 </span> run [ -<span id="L122" class="LineNr">122 </span> array <span class="Special"><-</span> swap array,<span class="Constant"> 0</span>,<span class="Constant"> 2</span> +<span id="L122" class="LineNr">122 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L108'>swap</a> array,<span class="Constant"> 0</span>,<span class="Constant"> 2</span> <span id="L123" class="LineNr">123 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> index *array,<span class="Constant"> 0</span> <span id="L124" class="LineNr">124 </span> 11:num/<span class="Special">raw</span> <span class="Special"><-</span> index *array,<span class="Constant"> 2</span> <span id="L125" class="LineNr">125 </span> ] @@ -197,7 +197,7 @@ if ('onhashchange' in window) { <span id="L140" class="LineNr">140 </span> <span class="Delimiter">{</span> <span id="L141" class="LineNr">141 </span> done?:bool <span class="Special"><-</span> greater-or-equal start, end <span id="L142" class="LineNr">142 </span> <span class="muControl">break-if</span> done? -<span id="L143" class="LineNr">143 </span> array <span class="Special"><-</span> swap array, start, end +<span id="L143" class="LineNr">143 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L108'>swap</a> array, start, end <span id="L144" class="LineNr">144 </span> start <span class="Special"><-</span> add start,<span class="Constant"> 1</span> <span id="L145" class="LineNr">145 </span> end <span class="Special"><-</span> subtract end,<span class="Constant"> 1</span> <span id="L146" class="LineNr">146 </span> <span class="muControl">loop</span> @@ -207,7 +207,7 @@ if ('onhashchange' in window) { <span id="L150" class="LineNr">150 </span><span class="muScenario">scenario</span> reverse-array-odd-length [ <span id="L151" class="LineNr">151 </span> <span class="Constant">local-scope</span> <span id="L152" class="LineNr">152 </span> array:&:@:num <span class="Special"><-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 3</span> -<span id="L153" class="LineNr">153 </span> array <span class="Special"><-</span> fill array,<span class="Constant"> 3 2 1</span> +<span id="L153" class="LineNr">153 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L44'>fill</a> array,<span class="Constant"> 3 2 1</span> <span id="L154" class="LineNr">154 </span> run [ <span id="L155" class="LineNr">155 </span> array <span class="Special"><-</span> reverse array <span id="L156" class="LineNr">156 </span> 10:@:num/<span class="Special">raw</span> <span class="Special"><-</span> copy *array @@ -223,7 +223,7 @@ if ('onhashchange' in window) { <span id="L166" class="LineNr">166 </span><span class="muScenario">scenario</span> reverse-array-even-length [ <span id="L167" class="LineNr">167 </span> <span class="Constant">local-scope</span> <span id="L168" class="LineNr">168 </span> array:&:@:num <span class="Special"><-</span> new <span class="Constant">number:type</span>,<span class="Constant"> 4</span> -<span id="L169" class="LineNr">169 </span> array <span class="Special"><-</span> fill array,<span class="Constant"> 4 3 2 1</span> +<span id="L169" class="LineNr">169 </span> array <span class="Special"><-</span> <a href='063array.mu.html#L44'>fill</a> array,<span class="Constant"> 4 3 2 1</span> <span id="L170" class="LineNr">170 </span> run [ <span id="L171" class="LineNr">171 </span> array <span class="Special"><-</span> reverse array <span id="L172" class="LineNr">172 </span> 10:@:num/<span class="Special">raw</span> <span class="Special"><-</span> copy *array diff --git a/html/064list.mu.html b/html/064list.mu.html index 4ac186a6..1354d094 100644 --- a/html/064list.mu.html +++ b/html/064list.mu.html @@ -63,7 +63,7 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span> <span id="L6" class="LineNr"> 6 </span><span class="muData">container</span> list:_elem [ <span id="L7" class="LineNr"> 7 </span> value:_elem -<span id="L8" class="LineNr"> 8 </span> next:&:list:_elem +<span id="L8" class="LineNr"> 8 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:list:_elem <span id="L9" class="LineNr"> 9 </span>] <span id="L10" class="LineNr"> 10 </span> <span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> push x:_elem, l:&:list:_elem<span class="muRecipe"> -> </span>l:&:list:_elem [ @@ -80,10 +80,10 @@ if ('onhashchange' in window) { <span id="L22" class="LineNr"> 22 </span> result <span class="Special"><-</span> get *in, <span class="Constant">value:offset</span> <span id="L23" class="LineNr"> 23 </span>] <span id="L24" class="LineNr"> 24 </span> -<span id="L25" class="LineNr"> 25 </span><span class="muRecipe">def</span> rest in:&:list:_elem<span class="muRecipe"> -> </span>result:&:list:_elem/contained-in:in [ +<span id="L25" class="LineNr"> 25 </span><span class="muRecipe">def</span> <a href='064list.mu.html#L25'>rest</a> in:&:list:_elem<span class="muRecipe"> -> </span>result:&:list:_elem/contained-in:in [ <span id="L26" class="LineNr"> 26 </span> <span class="Constant">local-scope</span> <span id="L27" class="LineNr"> 27 </span> <span class="Constant">load-ingredients</span> -<span id="L28" class="LineNr"> 28 </span> result <span class="Special"><-</span> get *in, <span class="Constant">next:offset</span> +<span id="L28" class="LineNr"> 28 </span> result <span class="Special"><-</span> get *in, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span> <span id="L29" class="LineNr"> 29 </span>] <span id="L30" class="LineNr"> 30 </span> <span id="L31" class="LineNr"> 31 </span><span class="muScenario">scenario</span> list-handling [ @@ -93,11 +93,11 @@ if ('onhashchange' in window) { <span id="L35" class="LineNr"> 35 </span> x <span class="Special"><-</span> push<span class="Constant"> 4</span>, x <span id="L36" class="LineNr"> 36 </span> x <span class="Special"><-</span> push<span class="Constant"> 5</span>, x <span id="L37" class="LineNr"> 37 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> first x -<span id="L38" class="LineNr"> 38 </span> x <span class="Special"><-</span> rest x +<span id="L38" class="LineNr"> 38 </span> x <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L39" class="LineNr"> 39 </span> 11:num/<span class="Special">raw</span> <span class="Special"><-</span> first x -<span id="L40" class="LineNr"> 40 </span> x <span class="Special"><-</span> rest x +<span id="L40" class="LineNr"> 40 </span> x <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L41" class="LineNr"> 41 </span> 12:num/<span class="Special">raw</span> <span class="Special"><-</span> first x -<span id="L42" class="LineNr"> 42 </span> 20:&:list:num/<span class="Special">raw</span> <span class="Special"><-</span> rest x +<span id="L42" class="LineNr"> 42 </span> 20:&:list:num/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L43" class="LineNr"> 43 </span> ] <span id="L44" class="LineNr"> 44 </span> memory-should-contain [ <span id="L45" class="LineNr"> 45 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 5</span> @@ -111,8 +111,8 @@ if ('onhashchange' in window) { <span id="L53" class="LineNr"> 53 </span> <span class="Constant">local-scope</span> <span id="L54" class="LineNr"> 54 </span> <span class="Constant">load-ingredients</span> <span id="L55" class="LineNr"> 55 </span> <span class="muControl">return-unless</span> l,<span class="Constant"> 0</span> -<span id="L56" class="LineNr"> 56 </span> rest:&:list:_elem <span class="Special"><-</span> rest l -<span id="L57" class="LineNr"> 57 </span> length-of-rest:num <span class="Special"><-</span> length rest +<span id="L56" class="LineNr"> 56 </span> <a href='064list.mu.html#L25'>rest</a>:&:list:_elem <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> l +<span id="L57" class="LineNr"> 57 </span> length-of-rest:num <span class="Special"><-</span> length <a href='064list.mu.html#L25'>rest</a> <span id="L58" class="LineNr"> 58 </span> result <span class="Special"><-</span> add length-of-rest,<span class="Constant"> 1</span> <span id="L59" class="LineNr"> 59 </span>] <span id="L60" class="LineNr"> 60 </span> @@ -122,9 +122,9 @@ if ('onhashchange' in window) { <span id="L64" class="LineNr"> 64 </span> <span class="Constant">load-ingredients</span> <span id="L65" class="LineNr"> 65 </span> new-node:&:list:_elem <span class="Special"><-</span> new <span class="Delimiter">{</span>(list _elem): type<span class="Delimiter">}</span> <span id="L66" class="LineNr"> 66 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant">value:offset</span>, x -<span id="L67" class="LineNr"> 67 </span> next-node:&:list:_elem <span class="Special"><-</span> get *in, <span class="Constant">next:offset</span> -<span id="L68" class="LineNr"> 68 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">next:offset</span>, new-node -<span id="L69" class="LineNr"> 69 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant">next:offset</span>, next-node +<span id="L67" class="LineNr"> 67 </span> next-node:&:list:_elem <span class="Special"><-</span> get *in, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span> +<span id="L68" class="LineNr"> 68 </span> *in <span class="Special"><-</span> put *in, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, new-node +<span id="L69" class="LineNr"> 69 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, next-node <span id="L70" class="LineNr"> 70 </span>] <span id="L71" class="LineNr"> 71 </span> <span id="L72" class="LineNr"> 72 </span><span class="muScenario">scenario</span> inserting-into-list [ @@ -133,16 +133,16 @@ if ('onhashchange' in window) { <span id="L75" class="LineNr"> 75 </span> list <span class="Special"><-</span> push<span class="Constant"> 4</span>, list <span id="L76" class="LineNr"> 76 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L77" class="LineNr"> 77 </span> run [ -<span id="L78" class="LineNr"> 78 </span> list2:&:list:char <span class="Special"><-</span> rest list <span class="Comment"># inside list</span> +<span id="L78" class="LineNr"> 78 </span> list2:&:list:char <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list <span class="Comment"># inside list</span> <span id="L79" class="LineNr"> 79 </span> list2 <span class="Special"><-</span> insert<span class="Constant"> 6</span>, list2 <span id="L80" class="LineNr"> 80 </span> <span class="Comment"># check structure</span> <span id="L81" class="LineNr"> 81 </span> list2 <span class="Special"><-</span> copy list <span id="L82" class="LineNr"> 82 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L83" class="LineNr"> 83 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L83" class="LineNr"> 83 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L84" class="LineNr"> 84 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L85" class="LineNr"> 85 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L85" class="LineNr"> 85 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L86" class="LineNr"> 86 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L87" class="LineNr"> 87 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L87" class="LineNr"> 87 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L88" class="LineNr"> 88 </span> 13:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L89" class="LineNr"> 89 </span> ] <span id="L90" class="LineNr"> 90 </span> memory-should-contain [ @@ -159,17 +159,17 @@ if ('onhashchange' in window) { <span id="L101" class="LineNr">101 </span> list <span class="Special"><-</span> push<span class="Constant"> 4</span>, list <span id="L102" class="LineNr">102 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L103" class="LineNr">103 </span> run [ -<span id="L104" class="LineNr">104 </span> list2:&:list:char <span class="Special"><-</span> rest list <span class="Comment"># inside list</span> -<span id="L105" class="LineNr">105 </span> list2 <span class="Special"><-</span> rest list2 <span class="Comment"># now at end of list</span> +<span id="L104" class="LineNr">104 </span> list2:&:list:char <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list <span class="Comment"># inside list</span> +<span id="L105" class="LineNr">105 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span class="Comment"># now at end of list</span> <span id="L106" class="LineNr">106 </span> list2 <span class="Special"><-</span> insert<span class="Constant"> 6</span>, list2 <span id="L107" class="LineNr">107 </span> <span class="Comment"># check structure like before</span> <span id="L108" class="LineNr">108 </span> list2 <span class="Special"><-</span> copy list <span id="L109" class="LineNr">109 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L110" class="LineNr">110 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L110" class="LineNr">110 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L111" class="LineNr">111 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L112" class="LineNr">112 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L112" class="LineNr">112 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L113" class="LineNr">113 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L114" class="LineNr">114 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L114" class="LineNr">114 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L115" class="LineNr">115 </span> 13:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L116" class="LineNr">116 </span> ] <span id="L117" class="LineNr">117 </span> memory-should-contain [ @@ -190,11 +190,11 @@ if ('onhashchange' in window) { <span id="L132" class="LineNr">132 </span> <span class="Comment"># check structure like before</span> <span id="L133" class="LineNr">133 </span> list2:&:list:char <span class="Special"><-</span> copy list <span id="L134" class="LineNr">134 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L135" class="LineNr">135 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L135" class="LineNr">135 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L136" class="LineNr">136 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L137" class="LineNr">137 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L137" class="LineNr">137 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L138" class="LineNr">138 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L139" class="LineNr">139 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L139" class="LineNr">139 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L140" class="LineNr">140 </span> 13:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L141" class="LineNr">141 </span> ] <span id="L142" class="LineNr">142 </span> memory-should-contain [ @@ -214,24 +214,24 @@ if ('onhashchange' in window) { <span id="L156" class="LineNr">156 </span> <span class="Constant">load-ingredients</span> <span id="L157" class="LineNr">157 </span> <span class="Comment"># if 'x' is null, return</span> <span id="L158" class="LineNr">158 </span> <span class="muControl">return-unless</span> x -<span id="L159" class="LineNr">159 </span> next-node:&:list:_elem <span class="Special"><-</span> rest x +<span id="L159" class="LineNr">159 </span> next-node:&:list:_elem <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L160" class="LineNr">160 </span> <span class="Comment"># clear next pointer of 'x'</span> -<span id="L161" class="LineNr">161 </span> *x <span class="Special"><-</span> put *x, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span> +<span id="L161" class="LineNr">161 </span> *x <span class="Special"><-</span> put *x, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>,<span class="Constant"> 0</span> <span id="L162" class="LineNr">162 </span> <span class="Comment"># if 'x' is at the head of 'in', return the new head</span> <span id="L163" class="LineNr">163 </span> at-head?:bool <span class="Special"><-</span> equal x, in <span id="L164" class="LineNr">164 </span> <span class="muControl">return-if</span> at-head?, next-node <span id="L165" class="LineNr">165 </span> <span class="Comment"># compute prev-node</span> <span id="L166" class="LineNr">166 </span> prev-node:&:list:_elem <span class="Special"><-</span> copy in -<span id="L167" class="LineNr">167 </span> curr:&:list:_elem <span class="Special"><-</span> rest prev-node +<span id="L167" class="LineNr">167 </span> curr:&:list:_elem <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> prev-node <span id="L168" class="LineNr">168 </span> <span class="Delimiter">{</span> <span id="L169" class="LineNr">169 </span> <span class="muControl">return-unless</span> curr <span id="L170" class="LineNr">170 </span> found?:bool <span class="Special"><-</span> equal curr, x <span id="L171" class="LineNr">171 </span> <span class="muControl">break-if</span> found? <span id="L172" class="LineNr">172 </span> prev-node <span class="Special"><-</span> copy curr -<span id="L173" class="LineNr">173 </span> curr <span class="Special"><-</span> rest curr +<span id="L173" class="LineNr">173 </span> curr <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> curr <span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span> <span id="L175" class="LineNr">175 </span> <span class="Comment"># set its next pointer to skip 'x'</span> -<span id="L176" class="LineNr">176 </span> *prev-node <span class="Special"><-</span> put *prev-node, <span class="Constant">next:offset</span>, next-node +<span id="L176" class="LineNr">176 </span> *prev-node <span class="Special"><-</span> put *prev-node, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, next-node <span id="L177" class="LineNr">177 </span>] <span id="L178" class="LineNr">178 </span> <span id="L179" class="LineNr">179 </span><span class="muScenario">scenario</span> removing-from-list [ @@ -240,15 +240,15 @@ if ('onhashchange' in window) { <span id="L182" class="LineNr">182 </span> list <span class="Special"><-</span> push<span class="Constant"> 4</span>, list <span id="L183" class="LineNr">183 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L184" class="LineNr">184 </span> run [ -<span id="L185" class="LineNr">185 </span> list2:&:list:char <span class="Special"><-</span> rest list <span class="Comment"># second element</span> +<span id="L185" class="LineNr">185 </span> list2:&:list:char <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list <span class="Comment"># second element</span> <span id="L186" class="LineNr">186 </span> list <span class="Special"><-</span> remove list2, list <span id="L187" class="LineNr">187 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list2,<span class="Constant"> 0</span> <span id="L188" class="LineNr">188 </span> <span class="Comment"># check structure like before</span> <span id="L189" class="LineNr">189 </span> list2 <span class="Special"><-</span> copy list <span id="L190" class="LineNr">190 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L191" class="LineNr">191 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L191" class="LineNr">191 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L192" class="LineNr">192 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L193" class="LineNr">193 </span> 20:&:list:char/<span class="Special">raw</span> <span class="Special"><-</span> rest list2 +<span id="L193" class="LineNr">193 </span> 20:&:list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L194" class="LineNr">194 </span> ] <span id="L195" class="LineNr">195 </span> memory-should-contain [ <span id="L196" class="LineNr">196 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># remove returned non-null</span> @@ -268,9 +268,9 @@ if ('onhashchange' in window) { <span id="L210" class="LineNr">210 </span> <span class="Comment"># check structure like before</span> <span id="L211" class="LineNr">211 </span> list2:&:list:char <span class="Special"><-</span> copy list <span id="L212" class="LineNr">212 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L213" class="LineNr">213 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L213" class="LineNr">213 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L214" class="LineNr">214 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L215" class="LineNr">215 </span> 20:&:list:char/<span class="Special">raw</span> <span class="Special"><-</span> rest list2 +<span id="L215" class="LineNr">215 </span> 20:&:list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L216" class="LineNr">216 </span> ] <span id="L217" class="LineNr">217 </span> memory-should-contain [ <span id="L218" class="LineNr">218 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 4</span> <span class="Comment"># scanning next, skipping deleted element</span> @@ -286,16 +286,16 @@ if ('onhashchange' in window) { <span id="L228" class="LineNr">228 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L229" class="LineNr">229 </span> run [ <span id="L230" class="LineNr">230 </span> <span class="Comment"># delete last element</span> -<span id="L231" class="LineNr">231 </span> list2:&:list:char <span class="Special"><-</span> rest list -<span id="L232" class="LineNr">232 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L231" class="LineNr">231 </span> list2:&:list:char <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list +<span id="L232" class="LineNr">232 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L233" class="LineNr">233 </span> list <span class="Special"><-</span> remove list2, list <span id="L234" class="LineNr">234 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list2,<span class="Constant"> 0</span> <span id="L235" class="LineNr">235 </span> <span class="Comment"># check structure like before</span> <span id="L236" class="LineNr">236 </span> list2 <span class="Special"><-</span> copy list <span id="L237" class="LineNr">237 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L238" class="LineNr">238 </span> list2 <span class="Special"><-</span> rest list2 +<span id="L238" class="LineNr">238 </span> list2 <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L239" class="LineNr">239 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L240" class="LineNr">240 </span> 20:&:list:char/<span class="Special">raw</span> <span class="Special"><-</span> rest list2 +<span id="L240" class="LineNr">240 </span> 20:&:list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list2 <span id="L241" class="LineNr">241 </span> ] <span id="L242" class="LineNr">242 </span> memory-should-contain [ <span id="L243" class="LineNr">243 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># remove returned non-null</span> @@ -324,7 +324,7 @@ if ('onhashchange' in window) { <span id="L266" class="LineNr">266 </span> <span class="Constant">load-ingredients</span> <span id="L267" class="LineNr">267 </span> <span class="muControl">return-unless</span> list, temp <span id="L268" class="LineNr">268 </span> object:_elem <span class="Special"><-</span> first, list -<span id="L269" class="LineNr">269 </span> list <span class="Special"><-</span> rest list +<span id="L269" class="LineNr">269 </span> list <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> list <span id="L270" class="LineNr">270 </span> temp <span class="Special"><-</span> push object, temp <span id="L271" class="LineNr">271 </span> result <span class="Special"><-</span> reverse list, temp <span id="L272" class="LineNr">272 </span>] @@ -348,21 +348,21 @@ if ('onhashchange' in window) { <span id="L290" class="LineNr">290 </span><span class="muRecipe">def</span> to-text in:&:list:_elem<span class="muRecipe"> -> </span>result:text [ <span id="L291" class="LineNr">291 </span> <span class="Constant">local-scope</span> <span id="L292" class="LineNr">292 </span> <span class="Constant">load-ingredients</span> -<span id="L293" class="LineNr">293 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 80</span> -<span id="L294" class="LineNr">294 </span> buf <span class="Special"><-</span> to-buffer in, buf -<span id="L295" class="LineNr">295 </span> result <span class="Special"><-</span> buffer-to-array buf +<span id="L293" class="LineNr">293 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 80</span> +<span id="L294" class="LineNr">294 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> in, buf +<span id="L295" class="LineNr">295 </span> result <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L296" class="LineNr">296 </span>] <span id="L297" class="LineNr">297 </span> <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> <span id="L299" class="LineNr">299 </span><span class="muRecipe">def</span> to-text-line in:&:list:_elem<span class="muRecipe"> -> </span>result:text [ <span id="L300" class="LineNr">300 </span> <span class="Constant">local-scope</span> <span id="L301" class="LineNr">301 </span> <span class="Constant">load-ingredients</span> -<span id="L302" class="LineNr">302 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 80</span> -<span id="L303" class="LineNr">303 </span> buf <span class="Special"><-</span> to-buffer in, buf,<span class="Constant"> 6</span> <span class="Comment"># max elements to display</span> -<span id="L304" class="LineNr">304 </span> result <span class="Special"><-</span> buffer-to-array buf +<span id="L302" class="LineNr">302 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 80</span> +<span id="L303" class="LineNr">303 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> in, buf,<span class="Constant"> 6</span> <span class="Comment"># max elements to display</span> +<span id="L304" class="LineNr">304 </span> result <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L305" class="LineNr">305 </span>] <span id="L306" class="LineNr">306 </span> -<span id="L307" class="LineNr">307 </span><span class="muRecipe">def</span> to-buffer in:&:list:_elem, buf:&:buffer<span class="muRecipe"> -> </span>buf:&:buffer [ +<span id="L307" class="LineNr">307 </span><span class="muRecipe">def</span> <a href='064list.mu.html#L307'>to-buffer</a> in:&:list:_elem, buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L308" class="LineNr">308 </span> <span class="Constant">local-scope</span> <span id="L309" class="LineNr">309 </span> <span class="Constant">load-ingredients</span> <span id="L310" class="LineNr">310 </span> <span class="Delimiter">{</span> @@ -374,23 +374,23 @@ if ('onhashchange' in window) { <span id="L316" class="LineNr">316 </span> val:_elem <span class="Special"><-</span> get *in, <span class="Constant">value:offset</span> <span id="L317" class="LineNr">317 </span> buf <span class="Special"><-</span> append buf, val <span id="L318" class="LineNr">318 </span> <span class="Comment"># now prepare next</span> -<span id="L319" class="LineNr">319 </span> next:&:list:_elem <span class="Special"><-</span> rest in -<span id="L320" class="LineNr">320 </span> nextn:num <span class="Special"><-</span> copy next -<span id="L321" class="LineNr">321 </span> <span class="muControl">return-unless</span> next +<span id="L319" class="LineNr">319 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:list:_elem <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> in +<span id="L320" class="LineNr">320 </span> nextn:num <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L29'>next</a> +<span id="L321" class="LineNr">321 </span> <span class="muControl">return-unless</span> <a href='065duplex_list.mu.html#L29'>next</a> <span id="L322" class="LineNr">322 </span> buf <span class="Special"><-</span> append buf, <span class="Constant">[ -> ]</span> <span id="L323" class="LineNr">323 </span> <span class="Comment"># and recurse</span> <span id="L324" class="LineNr">324 </span> remaining:num, optional-ingredient-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> <span id="L325" class="LineNr">325 </span> <span class="Delimiter">{</span> <span id="L326" class="LineNr">326 </span> <span class="muControl">break-if</span> optional-ingredient-found? <span id="L327" class="LineNr">327 </span> <span class="Comment"># unlimited recursion</span> -<span id="L328" class="LineNr">328 </span> buf <span class="Special"><-</span> to-buffer next, buf +<span id="L328" class="LineNr">328 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> <a href='065duplex_list.mu.html#L29'>next</a>, buf <span id="L329" class="LineNr">329 </span> <span class="muControl">return</span> <span id="L330" class="LineNr">330 </span> <span class="Delimiter">}</span> <span id="L331" class="LineNr">331 </span> <span class="Delimiter">{</span> <span id="L332" class="LineNr">332 </span> <span class="muControl">break-unless</span> remaining <span id="L333" class="LineNr">333 </span> <span class="Comment"># limited recursion</span> <span id="L334" class="LineNr">334 </span> remaining <span class="Special"><-</span> subtract remaining,<span class="Constant"> 1</span> -<span id="L335" class="LineNr">335 </span> buf <span class="Special"><-</span> to-buffer next, buf, remaining +<span id="L335" class="LineNr">335 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> <a href='065duplex_list.mu.html#L29'>next</a>, buf, remaining <span id="L336" class="LineNr">336 </span> <span class="muControl">return</span> <span id="L337" class="LineNr">337 </span> <span class="Delimiter">}</span> <span id="L338" class="LineNr">338 </span> <span class="Comment"># past recursion depth; insert ellipses and stop</span> diff --git a/html/065duplex_list.mu.html b/html/065duplex_list.mu.html index cfd81f35..dcc74332 100644 --- a/html/065duplex_list.mu.html +++ b/html/065duplex_list.mu.html @@ -60,8 +60,8 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="muData">container</span> duplex-list:_elem [ <span id="L4" class="LineNr"> 4 </span> value:_elem -<span id="L5" class="LineNr"> 5 </span> next:&:duplex-list:_elem -<span id="L6" class="LineNr"> 6 </span> prev:&:duplex-list:_elem +<span id="L5" class="LineNr"> 5 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:_elem +<span id="L6" class="LineNr"> 6 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:_elem <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span> <span id="L9" class="LineNr"> 9 </span><span class="Comment"># should I say in/contained-in:result, allow ingredients to refer to products?</span> @@ -72,7 +72,7 @@ if ('onhashchange' in window) { <span id="L14" class="LineNr"> 14 </span> *result <span class="Special"><-</span> merge x, in,<span class="Constant"> 0</span> <span id="L15" class="LineNr"> 15 </span> <span class="Delimiter">{</span> <span id="L16" class="LineNr"> 16 </span> <span class="muControl">break-unless</span> in -<span id="L17" class="LineNr"> 17 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">prev:offset</span>, result +<span id="L17" class="LineNr"> 17 </span> *in <span class="Special"><-</span> put *in, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, result <span id="L18" class="LineNr"> 18 </span> <span class="Delimiter">}</span> <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> <span id="L20" class="LineNr"> 20 </span>] @@ -84,18 +84,18 @@ if ('onhashchange' in window) { <span id="L26" class="LineNr"> 26 </span> result <span class="Special"><-</span> get *in, <span class="Constant">value:offset</span> <span id="L27" class="LineNr"> 27 </span>] <span id="L28" class="LineNr"> 28 </span> -<span id="L29" class="LineNr"> 29 </span><span class="muRecipe">def</span> next in:&:duplex-list:_elem<span class="muRecipe"> -> </span>result:&:duplex-list:_elem/contained-in:in [ +<span id="L29" class="LineNr"> 29 </span><span class="muRecipe">def</span> <a href='065duplex_list.mu.html#L29'>next</a> in:&:duplex-list:_elem<span class="muRecipe"> -> </span>result:&:duplex-list:_elem/contained-in:in [ <span id="L30" class="LineNr"> 30 </span> <span class="Constant">local-scope</span> <span id="L31" class="LineNr"> 31 </span> <span class="Constant">load-ingredients</span> <span id="L32" class="LineNr"> 32 </span> <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span> -<span id="L33" class="LineNr"> 33 </span> result <span class="Special"><-</span> get *in, <span class="Constant">next:offset</span> +<span id="L33" class="LineNr"> 33 </span> result <span class="Special"><-</span> get *in, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span> <span id="L34" class="LineNr"> 34 </span>] <span id="L35" class="LineNr"> 35 </span> -<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> prev in:&:duplex-list:_elem<span class="muRecipe"> -> </span>result:&:duplex-list:_elem/contained-in:in [ +<span id="L36" class="LineNr"> 36 </span><span class="muRecipe">def</span> <a href='065duplex_list.mu.html#L36'>prev</a> in:&:duplex-list:_elem<span class="muRecipe"> -> </span>result:&:duplex-list:_elem/contained-in:in [ <span id="L37" class="LineNr"> 37 </span> <span class="Constant">local-scope</span> <span id="L38" class="LineNr"> 38 </span> <span class="Constant">load-ingredients</span> <span id="L39" class="LineNr"> 39 </span> <span class="muControl">return-unless</span> in,<span class="Constant"> 0</span> -<span id="L40" class="LineNr"> 40 </span> result <span class="Special"><-</span> get *in, <span class="Constant">prev:offset</span> +<span id="L40" class="LineNr"> 40 </span> result <span class="Special"><-</span> get *in, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span> <span id="L41" class="LineNr"> 41 </span> <span class="muControl">return</span> result <span id="L42" class="LineNr"> 42 </span>] <span id="L43" class="LineNr"> 43 </span> @@ -110,17 +110,17 @@ if ('onhashchange' in window) { <span id="L52" class="LineNr"> 52 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L53" class="LineNr"> 53 </span> list2:&:duplex-list:char <span class="Special"><-</span> copy list <span id="L54" class="LineNr"> 54 </span> 20:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L55" class="LineNr"> 55 </span> list2 <span class="Special"><-</span> next list2 +<span id="L55" class="LineNr"> 55 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L56" class="LineNr"> 56 </span> 21:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L57" class="LineNr"> 57 </span> list2 <span class="Special"><-</span> next list2 +<span id="L57" class="LineNr"> 57 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L58" class="LineNr"> 58 </span> 22:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L59" class="LineNr"> 59 </span> 30:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list2 +<span id="L59" class="LineNr"> 59 </span> 30:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L60" class="LineNr"> 60 </span> 31:char/<span class="Special">raw</span> <span class="Special"><-</span> first 30:&:duplex-list:char/<span class="Special">raw</span> -<span id="L61" class="LineNr"> 61 </span> 32:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next 30:&:duplex-list:char/<span class="Special">raw</span> -<span id="L62" class="LineNr"> 62 </span> 33:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> prev 30:&:duplex-list:char/<span class="Special">raw</span> -<span id="L63" class="LineNr"> 63 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L61" class="LineNr"> 61 </span> 32:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> 30:&:duplex-list:char/<span class="Special">raw</span> +<span id="L62" class="LineNr"> 62 </span> 33:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> 30:&:duplex-list:char/<span class="Special">raw</span> +<span id="L63" class="LineNr"> 63 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L64" class="LineNr"> 64 </span> 40:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L65" class="LineNr"> 65 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L65" class="LineNr"> 65 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L66" class="LineNr"> 66 </span> 41:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L67" class="LineNr"> 67 </span> 50:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list, list2 <span id="L68" class="LineNr"> 68 </span> ] @@ -148,12 +148,12 @@ if ('onhashchange' in window) { <span id="L90" class="LineNr"> 90 </span> new-node:&:duplex-list:_elem <span class="Special"><-</span> new <span class="Delimiter">{</span>(duplex-list _elem): type<span class="Delimiter">}</span> <span id="L91" class="LineNr"> 91 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant">value:offset</span>, x <span id="L92" class="LineNr"> 92 </span> <span class="Comment"># save old next before changing it</span> -<span id="L93" class="LineNr"> 93 </span> next-node:&:duplex-list:_elem <span class="Special"><-</span> get *in, <span class="Constant">next:offset</span> -<span id="L94" class="LineNr"> 94 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">next:offset</span>, new-node -<span id="L95" class="LineNr"> 95 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant">prev:offset</span>, in -<span id="L96" class="LineNr"> 96 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant">next:offset</span>, next-node +<span id="L93" class="LineNr"> 93 </span> next-node:&:duplex-list:_elem <span class="Special"><-</span> get *in, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span> +<span id="L94" class="LineNr"> 94 </span> *in <span class="Special"><-</span> put *in, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, new-node +<span id="L95" class="LineNr"> 95 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, in +<span id="L96" class="LineNr"> 96 </span> *new-node <span class="Special"><-</span> put *new-node, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, next-node <span id="L97" class="LineNr"> 97 </span> <span class="muControl">return-unless</span> next-node -<span id="L98" class="LineNr"> 98 </span> *next-node <span class="Special"><-</span> put *next-node, <span class="Constant">prev:offset</span>, new-node +<span id="L98" class="LineNr"> 98 </span> *next-node <span class="Special"><-</span> put *next-node, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, new-node <span id="L99" class="LineNr"> 99 </span>] <span id="L100" class="LineNr">100 </span> <span id="L101" class="LineNr">101 </span><span class="muScenario">scenario</span> inserting-into-duplex-list [ @@ -162,22 +162,22 @@ if ('onhashchange' in window) { <span id="L104" class="LineNr">104 </span> list <span class="Special"><-</span> push<span class="Constant"> 4</span>, list <span id="L105" class="LineNr">105 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L106" class="LineNr">106 </span> run [ -<span id="L107" class="LineNr">107 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list <span class="Comment"># inside list</span> +<span id="L107" class="LineNr">107 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span class="Comment"># inside list</span> <span id="L108" class="LineNr">108 </span> list2 <span class="Special"><-</span> insert<span class="Constant"> 6</span>, list2 <span id="L109" class="LineNr">109 </span> <span class="Comment"># check structure like before</span> <span id="L110" class="LineNr">110 </span> list2 <span class="Special"><-</span> copy list <span id="L111" class="LineNr">111 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L112" class="LineNr">112 </span> list2 <span class="Special"><-</span> next list2 +<span id="L112" class="LineNr">112 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L113" class="LineNr">113 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L114" class="LineNr">114 </span> list2 <span class="Special"><-</span> next list2 +<span id="L114" class="LineNr">114 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L115" class="LineNr">115 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L116" class="LineNr">116 </span> list2 <span class="Special"><-</span> next list2 +<span id="L116" class="LineNr">116 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L117" class="LineNr">117 </span> 13:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L118" class="LineNr">118 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L118" class="LineNr">118 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L119" class="LineNr">119 </span> 20:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L120" class="LineNr">120 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L120" class="LineNr">120 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L121" class="LineNr">121 </span> 21:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L122" class="LineNr">122 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L122" class="LineNr">122 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L123" class="LineNr">123 </span> 22:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L124" class="LineNr">124 </span> 30:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list, list2 <span id="L125" class="LineNr">125 </span> ] @@ -199,23 +199,23 @@ if ('onhashchange' in window) { <span id="L141" class="LineNr">141 </span> list <span class="Special"><-</span> push<span class="Constant"> 4</span>, list <span id="L142" class="LineNr">142 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L143" class="LineNr">143 </span> run [ -<span id="L144" class="LineNr">144 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list <span class="Comment"># inside list</span> -<span id="L145" class="LineNr">145 </span> list2 <span class="Special"><-</span> next list2 <span class="Comment"># now at end of list</span> +<span id="L144" class="LineNr">144 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span class="Comment"># inside list</span> +<span id="L145" class="LineNr">145 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span class="Comment"># now at end of list</span> <span id="L146" class="LineNr">146 </span> list2 <span class="Special"><-</span> insert<span class="Constant"> 6</span>, list2 <span id="L147" class="LineNr">147 </span> <span class="Comment"># check structure like before</span> <span id="L148" class="LineNr">148 </span> list2 <span class="Special"><-</span> copy list <span id="L149" class="LineNr">149 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L150" class="LineNr">150 </span> list2 <span class="Special"><-</span> next list2 +<span id="L150" class="LineNr">150 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L151" class="LineNr">151 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L152" class="LineNr">152 </span> list2 <span class="Special"><-</span> next list2 +<span id="L152" class="LineNr">152 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L153" class="LineNr">153 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L154" class="LineNr">154 </span> list2 <span class="Special"><-</span> next list2 +<span id="L154" class="LineNr">154 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L155" class="LineNr">155 </span> 13:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L156" class="LineNr">156 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L156" class="LineNr">156 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L157" class="LineNr">157 </span> 20:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L158" class="LineNr">158 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L158" class="LineNr">158 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L159" class="LineNr">159 </span> 21:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L160" class="LineNr">160 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L160" class="LineNr">160 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L161" class="LineNr">161 </span> 22:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L162" class="LineNr">162 </span> 30:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list, list2 <span id="L163" class="LineNr">163 </span> ] @@ -241,17 +241,17 @@ if ('onhashchange' in window) { <span id="L183" class="LineNr">183 </span> <span class="Comment"># check structure like before</span> <span id="L184" class="LineNr">184 </span> list2:&:duplex-list:char <span class="Special"><-</span> copy list <span id="L185" class="LineNr">185 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L186" class="LineNr">186 </span> list2 <span class="Special"><-</span> next list2 +<span id="L186" class="LineNr">186 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L187" class="LineNr">187 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L188" class="LineNr">188 </span> list2 <span class="Special"><-</span> next list2 +<span id="L188" class="LineNr">188 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L189" class="LineNr">189 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L190" class="LineNr">190 </span> list2 <span class="Special"><-</span> next list2 +<span id="L190" class="LineNr">190 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L191" class="LineNr">191 </span> 13:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L192" class="LineNr">192 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L192" class="LineNr">192 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L193" class="LineNr">193 </span> 20:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L194" class="LineNr">194 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L194" class="LineNr">194 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L195" class="LineNr">195 </span> 21:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L196" class="LineNr">196 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L196" class="LineNr">196 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L197" class="LineNr">197 </span> 22:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L198" class="LineNr">198 </span> 30:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list, list2 <span id="L199" class="LineNr">199 </span> ] @@ -276,20 +276,20 @@ if ('onhashchange' in window) { <span id="L218" class="LineNr">218 </span> <span class="Constant">load-ingredients</span> <span id="L219" class="LineNr">219 </span> <span class="Comment"># if 'x' is null, return</span> <span id="L220" class="LineNr">220 </span> <span class="muControl">return-unless</span> x -<span id="L221" class="LineNr">221 </span> next-node:&:duplex-list:_elem <span class="Special"><-</span> get *x, <span class="Constant">next:offset</span> -<span id="L222" class="LineNr">222 </span> prev-node:&:duplex-list:_elem <span class="Special"><-</span> get *x, <span class="Constant">prev:offset</span> +<span id="L221" class="LineNr">221 </span> next-node:&:duplex-list:_elem <span class="Special"><-</span> get *x, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span> +<span id="L222" class="LineNr">222 </span> prev-node:&:duplex-list:_elem <span class="Special"><-</span> get *x, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span> <span id="L223" class="LineNr">223 </span> <span class="Comment"># null x's pointers</span> -<span id="L224" class="LineNr">224 </span> *x <span class="Special"><-</span> put *x, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span> -<span id="L225" class="LineNr">225 </span> *x <span class="Special"><-</span> put *x, <span class="Constant">prev:offset</span>,<span class="Constant"> 0</span> +<span id="L224" class="LineNr">224 </span> *x <span class="Special"><-</span> put *x, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>,<span class="Constant"> 0</span> +<span id="L225" class="LineNr">225 </span> *x <span class="Special"><-</span> put *x, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>,<span class="Constant"> 0</span> <span id="L226" class="LineNr">226 </span> <span class="Comment"># if next-node is not null, set its prev pointer</span> <span id="L227" class="LineNr">227 </span> <span class="Delimiter">{</span> <span id="L228" class="LineNr">228 </span> <span class="muControl">break-unless</span> next-node -<span id="L229" class="LineNr">229 </span> *next-node <span class="Special"><-</span> put *next-node, <span class="Constant">prev:offset</span>, prev-node +<span id="L229" class="LineNr">229 </span> *next-node <span class="Special"><-</span> put *next-node, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, prev-node <span id="L230" class="LineNr">230 </span> <span class="Delimiter">}</span> <span id="L231" class="LineNr">231 </span> <span class="Comment"># if prev-node is not null, set its next pointer and return</span> <span id="L232" class="LineNr">232 </span> <span class="Delimiter">{</span> <span id="L233" class="LineNr">233 </span> <span class="muControl">break-unless</span> prev-node -<span id="L234" class="LineNr">234 </span> *prev-node <span class="Special"><-</span> put *prev-node, <span class="Constant">next:offset</span>, next-node +<span id="L234" class="LineNr">234 </span> *prev-node <span class="Special"><-</span> put *prev-node, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, next-node <span id="L235" class="LineNr">235 </span> <span class="muControl">return</span> <span id="L236" class="LineNr">236 </span> <span class="Delimiter">}</span> <span id="L237" class="LineNr">237 </span> <span class="Comment"># if prev-node is null, then we removed the head node at 'in'</span> @@ -303,16 +303,16 @@ if ('onhashchange' in window) { <span id="L245" class="LineNr">245 </span> list <span class="Special"><-</span> push<span class="Constant"> 4</span>, list <span id="L246" class="LineNr">246 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L247" class="LineNr">247 </span> run [ -<span id="L248" class="LineNr">248 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list <span class="Comment"># second element</span> +<span id="L248" class="LineNr">248 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span class="Comment"># second element</span> <span id="L249" class="LineNr">249 </span> list <span class="Special"><-</span> remove list2, list <span id="L250" class="LineNr">250 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list2,<span class="Constant"> 0</span> <span id="L251" class="LineNr">251 </span> <span class="Comment"># check structure like before</span> <span id="L252" class="LineNr">252 </span> list2 <span class="Special"><-</span> copy list <span id="L253" class="LineNr">253 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L254" class="LineNr">254 </span> list2 <span class="Special"><-</span> next list2 +<span id="L254" class="LineNr">254 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L255" class="LineNr">255 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L256" class="LineNr">256 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list2 -<span id="L257" class="LineNr">257 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L256" class="LineNr">256 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 +<span id="L257" class="LineNr">257 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L258" class="LineNr">258 </span> 30:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L259" class="LineNr">259 </span> 40:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list, list2 <span id="L260" class="LineNr">260 </span> ] @@ -336,10 +336,10 @@ if ('onhashchange' in window) { <span id="L278" class="LineNr">278 </span> <span class="Comment"># check structure like before</span> <span id="L279" class="LineNr">279 </span> list2:&:duplex-list:char <span class="Special"><-</span> copy list <span id="L280" class="LineNr">280 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L281" class="LineNr">281 </span> list2 <span class="Special"><-</span> next list2 +<span id="L281" class="LineNr">281 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L282" class="LineNr">282 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L283" class="LineNr">283 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list2 -<span id="L284" class="LineNr">284 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L283" class="LineNr">283 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 +<span id="L284" class="LineNr">284 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L285" class="LineNr">285 </span> 30:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L286" class="LineNr">286 </span> 40:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list, list2 <span id="L287" class="LineNr">287 </span> ] @@ -359,17 +359,17 @@ if ('onhashchange' in window) { <span id="L301" class="LineNr">301 </span> list <span class="Special"><-</span> push<span class="Constant"> 5</span>, list <span id="L302" class="LineNr">302 </span> run [ <span id="L303" class="LineNr">303 </span> <span class="Comment"># delete last element</span> -<span id="L304" class="LineNr">304 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list -<span id="L305" class="LineNr">305 </span> list2 <span class="Special"><-</span> next list2 +<span id="L304" class="LineNr">304 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list +<span id="L305" class="LineNr">305 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L306" class="LineNr">306 </span> list <span class="Special"><-</span> remove list2, list <span id="L307" class="LineNr">307 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list2,<span class="Constant"> 0</span> <span id="L308" class="LineNr">308 </span> <span class="Comment"># check structure like before</span> <span id="L309" class="LineNr">309 </span> list2 <span class="Special"><-</span> copy list <span id="L310" class="LineNr">310 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L311" class="LineNr">311 </span> list2 <span class="Special"><-</span> next list2 +<span id="L311" class="LineNr">311 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 <span id="L312" class="LineNr">312 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 -<span id="L313" class="LineNr">313 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list2 -<span id="L314" class="LineNr">314 </span> list2 <span class="Special"><-</span> prev list2 +<span id="L313" class="LineNr">313 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 +<span id="L314" class="LineNr">314 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> list2 <span id="L315" class="LineNr">315 </span> 30:char/<span class="Special">raw</span> <span class="Special"><-</span> first list2 <span id="L316" class="LineNr">316 </span> 40:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal list, list2 <span id="L317" class="LineNr">317 </span> ] @@ -400,24 +400,24 @@ if ('onhashchange' in window) { <span id="L342" class="LineNr">342 </span><span class="Comment"># set end to 0 to delete everything past start.</span> <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> <span id="L344" class="LineNr">344 </span><span class="Comment"># clean way to return the new head pointer.</span> -<span id="L345" class="LineNr">345 </span><span class="muRecipe">def</span> remove-between start:&:duplex-list:_elem, end:&:duplex-list:_elem/contained-in:start<span class="muRecipe"> -> </span>start:&:duplex-list:_elem [ +<span id="L345" class="LineNr">345 </span><span class="muRecipe">def</span> <a href='065duplex_list.mu.html#L345'>remove-between</a> start:&:duplex-list:_elem, end:&:duplex-list:_elem/contained-in:start<span class="muRecipe"> -> </span>start:&:duplex-list:_elem [ <span id="L346" class="LineNr">346 </span> <span class="Constant">local-scope</span> <span id="L347" class="LineNr">347 </span> <span class="Constant">load-ingredients</span> -<span id="L348" class="LineNr">348 </span> next:&:duplex-list:_elem <span class="Special"><-</span> get *start, <span class="Constant">next:offset</span> -<span id="L349" class="LineNr">349 </span> nothing-to-delete?:bool <span class="Special"><-</span> equal next, end +<span id="L348" class="LineNr">348 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:_elem <span class="Special"><-</span> get *start, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span> +<span id="L349" class="LineNr">349 </span> nothing-to-delete?:bool <span class="Special"><-</span> equal <a href='065duplex_list.mu.html#L29'>next</a>, end <span id="L350" class="LineNr">350 </span> <span class="muControl">return-if</span> nothing-to-delete? -<span id="L351" class="LineNr">351 </span> assert next, <span class="Constant">[malformed duplex list]</span> +<span id="L351" class="LineNr">351 </span> assert <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">[malformed duplex list]</span> <span id="L352" class="LineNr">352 </span> <span class="Comment"># start->next->prev = 0</span> <span id="L353" class="LineNr">353 </span> <span class="Comment"># start->next = end</span> -<span id="L354" class="LineNr">354 </span> *next <span class="Special"><-</span> put *next, <span class="Constant">prev:offset</span>,<span class="Constant"> 0</span> -<span id="L355" class="LineNr">355 </span> *start <span class="Special"><-</span> put *start, <span class="Constant">next:offset</span>, end +<span id="L354" class="LineNr">354 </span> *next <span class="Special"><-</span> put *next, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>,<span class="Constant"> 0</span> +<span id="L355" class="LineNr">355 </span> *start <span class="Special"><-</span> put *start, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, end <span id="L356" class="LineNr">356 </span> <span class="muControl">return-unless</span> end <span id="L357" class="LineNr">357 </span> <span class="Comment"># end->prev->next = 0</span> <span id="L358" class="LineNr">358 </span> <span class="Comment"># end->prev = start</span> -<span id="L359" class="LineNr">359 </span> prev:&:duplex-list:_elem <span class="Special"><-</span> get *end, <span class="Constant">prev:offset</span> -<span id="L360" class="LineNr">360 </span> assert prev, <span class="Constant">[malformed duplex list - 2]</span> -<span id="L361" class="LineNr">361 </span> *prev <span class="Special"><-</span> put *prev, <span class="Constant">next:offset</span>,<span class="Constant"> 0</span> -<span id="L362" class="LineNr">362 </span> *end <span class="Special"><-</span> put *end, <span class="Constant">prev:offset</span>, start +<span id="L359" class="LineNr">359 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:_elem <span class="Special"><-</span> get *end, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span> +<span id="L360" class="LineNr">360 </span> assert <a href='065duplex_list.mu.html#L36'>prev</a>, <span class="Constant">[malformed duplex list - 2]</span> +<span id="L361" class="LineNr">361 </span> *prev <span class="Special"><-</span> put *prev, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>,<span class="Constant"> 0</span> +<span id="L362" class="LineNr">362 </span> *end <span class="Special"><-</span> put *end, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, start <span id="L363" class="LineNr">363 </span>] <span id="L364" class="LineNr">364 </span> <span id="L365" class="LineNr">365 </span><span class="muScenario">scenario</span> remove-range [ @@ -432,16 +432,16 @@ if ('onhashchange' in window) { <span id="L374" class="LineNr">374 </span> run [ <span id="L375" class="LineNr">375 </span> <span class="Comment"># delete 16 onwards</span> <span id="L376" class="LineNr">376 </span> <span class="Comment"># first pointer: to the third element</span> -<span id="L377" class="LineNr">377 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list -<span id="L378" class="LineNr">378 </span> list2 <span class="Special"><-</span> next list2 -<span id="L379" class="LineNr">379 </span> list2 <span class="Special"><-</span> remove-between list2,<span class="Constant"> 0</span> +<span id="L377" class="LineNr">377 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list +<span id="L378" class="LineNr">378 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 +<span id="L379" class="LineNr">379 </span> list2 <span class="Special"><-</span> <a href='065duplex_list.mu.html#L345'>remove-between</a> list2,<span class="Constant"> 0</span> <span id="L380" class="LineNr">380 </span> <span class="Comment"># now check the list</span> <span id="L381" class="LineNr">381 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L382" class="LineNr">382 </span> list <span class="Special"><-</span> next list +<span id="L382" class="LineNr">382 </span> list <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L383" class="LineNr">383 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L384" class="LineNr">384 </span> list <span class="Special"><-</span> next list +<span id="L384" class="LineNr">384 </span> list <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L385" class="LineNr">385 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L386" class="LineNr">386 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list +<span id="L386" class="LineNr">386 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L387" class="LineNr">387 </span> ] <span id="L388" class="LineNr">388 </span> memory-should-contain [ <span id="L389" class="LineNr">389 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 13</span> @@ -463,20 +463,20 @@ if ('onhashchange' in window) { <span id="L405" class="LineNr">405 </span> run [ <span id="L406" class="LineNr">406 </span> <span class="Comment"># delete 15, 16 and 17</span> <span id="L407" class="LineNr">407 </span> <span class="Comment"># start pointer: to the second element</span> -<span id="L408" class="LineNr">408 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list +<span id="L408" class="LineNr">408 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L409" class="LineNr">409 </span> <span class="Comment"># end pointer: to the last (sixth) element</span> -<span id="L410" class="LineNr">410 </span> end:&:duplex-list:char <span class="Special"><-</span> next list2 -<span id="L411" class="LineNr">411 </span> end <span class="Special"><-</span> next end -<span id="L412" class="LineNr">412 </span> end <span class="Special"><-</span> next end -<span id="L413" class="LineNr">413 </span> end <span class="Special"><-</span> next end -<span id="L414" class="LineNr">414 </span> remove-between list2, end +<span id="L410" class="LineNr">410 </span> end:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list2 +<span id="L411" class="LineNr">411 </span> end <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> end +<span id="L412" class="LineNr">412 </span> end <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> end +<span id="L413" class="LineNr">413 </span> end <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> end +<span id="L414" class="LineNr">414 </span> <a href='065duplex_list.mu.html#L345'>remove-between</a> list2, end <span id="L415" class="LineNr">415 </span> <span class="Comment"># now check the list</span> <span id="L416" class="LineNr">416 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L417" class="LineNr">417 </span> list <span class="Special"><-</span> next list +<span id="L417" class="LineNr">417 </span> list <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L418" class="LineNr">418 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L419" class="LineNr">419 </span> list <span class="Special"><-</span> next list +<span id="L419" class="LineNr">419 </span> list <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L420" class="LineNr">420 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L421" class="LineNr">421 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list +<span id="L421" class="LineNr">421 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L422" class="LineNr">422 </span> ] <span id="L423" class="LineNr">423 </span> memory-should-contain [ <span id="L424" class="LineNr">424 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 13</span> @@ -494,15 +494,15 @@ if ('onhashchange' in window) { <span id="L436" class="LineNr">436 </span> list <span class="Special"><-</span> push<span class="Constant"> 13</span>, list <span id="L437" class="LineNr">437 </span> run [ <span id="L438" class="LineNr">438 </span> <span class="Comment"># delete between first and second element (i.e. nothing)</span> -<span id="L439" class="LineNr">439 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list -<span id="L440" class="LineNr">440 </span> remove-between list, list2 +<span id="L439" class="LineNr">439 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list +<span id="L440" class="LineNr">440 </span> <a href='065duplex_list.mu.html#L345'>remove-between</a> list, list2 <span id="L441" class="LineNr">441 </span> <span class="Comment"># now check the list</span> <span id="L442" class="LineNr">442 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L443" class="LineNr">443 </span> list <span class="Special"><-</span> next list +<span id="L443" class="LineNr">443 </span> list <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L444" class="LineNr">444 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L445" class="LineNr">445 </span> list <span class="Special"><-</span> next list +<span id="L445" class="LineNr">445 </span> list <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L446" class="LineNr">446 </span> 12:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L447" class="LineNr">447 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list +<span id="L447" class="LineNr">447 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L448" class="LineNr">448 </span> ] <span id="L449" class="LineNr">449 </span> <span class="Comment"># no change</span> <span id="L450" class="LineNr">450 </span> memory-should-contain [ @@ -524,13 +524,13 @@ if ('onhashchange' in window) { <span id="L466" class="LineNr">466 </span> list <span class="Special"><-</span> push<span class="Constant"> 13</span>, list <span id="L467" class="LineNr">467 </span> run [ <span id="L468" class="LineNr">468 </span> <span class="Comment"># remove the third element and beyond</span> -<span id="L469" class="LineNr">469 </span> list2:&:duplex-list:char <span class="Special"><-</span> next list -<span id="L470" class="LineNr">470 </span> remove-between list2,<span class="Constant"> 0</span> +<span id="L469" class="LineNr">469 </span> list2:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list +<span id="L470" class="LineNr">470 </span> <a href='065duplex_list.mu.html#L345'>remove-between</a> list2,<span class="Constant"> 0</span> <span id="L471" class="LineNr">471 </span> <span class="Comment"># now check the list</span> <span id="L472" class="LineNr">472 </span> 10:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L473" class="LineNr">473 </span> list <span class="Special"><-</span> next list +<span id="L473" class="LineNr">473 </span> list <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L474" class="LineNr">474 </span> 11:char/<span class="Special">raw</span> <span class="Special"><-</span> get *list, <span class="Constant">value:offset</span> -<span id="L475" class="LineNr">475 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> next list +<span id="L475" class="LineNr">475 </span> 20:&:duplex-list:char/<span class="Special">raw</span> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> list <span id="L476" class="LineNr">476 </span> ] <span id="L477" class="LineNr">477 </span> memory-should-contain [ <span id="L478" class="LineNr">478 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 13</span> @@ -540,51 +540,51 @@ if ('onhashchange' in window) { <span id="L482" class="LineNr">482 </span>] <span id="L483" class="LineNr">483 </span> <span id="L484" class="LineNr">484 </span><span class="Comment"># insert list beginning at 'new' after 'in'</span> -<span id="L485" class="LineNr">485 </span><span class="muRecipe">def</span> insert-range in:&:duplex-list:_elem, start:&:duplex-list:_elem/contained-in:in<span class="muRecipe"> -> </span>in:&:duplex-list:_elem [ +<span id="L485" class="LineNr">485 </span><span class="muRecipe">def</span> <a href='065duplex_list.mu.html#L485'>insert-range</a> in:&:duplex-list:_elem, start:&:duplex-list:_elem/contained-in:in<span class="muRecipe"> -> </span>in:&:duplex-list:_elem [ <span id="L486" class="LineNr">486 </span> <span class="Constant">local-scope</span> <span id="L487" class="LineNr">487 </span> <span class="Constant">load-ingredients</span> <span id="L488" class="LineNr">488 </span> <span class="muControl">return-unless</span> in <span id="L489" class="LineNr">489 </span> <span class="muControl">return-unless</span> start <span id="L490" class="LineNr">490 </span> end:&:duplex-list:_elem <span class="Special"><-</span> copy start <span id="L491" class="LineNr">491 </span> <span class="Delimiter">{</span> -<span id="L492" class="LineNr">492 </span> next:&:duplex-list:_elem <span class="Special"><-</span> next end/insert-range -<span id="L493" class="LineNr">493 </span> <span class="muControl">break-unless</span> next -<span id="L494" class="LineNr">494 </span> end <span class="Special"><-</span> copy next +<span id="L492" class="LineNr">492 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:_elem <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> end/insert-range +<span id="L493" class="LineNr">493 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L29'>next</a> +<span id="L494" class="LineNr">494 </span> end <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L29'>next</a> <span id="L495" class="LineNr">495 </span> <span class="muControl">loop</span> <span id="L496" class="LineNr">496 </span> <span class="Delimiter">}</span> -<span id="L497" class="LineNr">497 </span> next:&:duplex-list:_elem <span class="Special"><-</span> next in -<span id="L498" class="LineNr">498 </span> *end <span class="Special"><-</span> put *end, <span class="Constant">next:offset</span>, next +<span id="L497" class="LineNr">497 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:_elem <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> in +<span id="L498" class="LineNr">498 </span> *end <span class="Special"><-</span> put *end, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, <a href='065duplex_list.mu.html#L29'>next</a> <span id="L499" class="LineNr">499 </span> <span class="Delimiter">{</span> -<span id="L500" class="LineNr">500 </span> <span class="muControl">break-unless</span> next -<span id="L501" class="LineNr">501 </span> *next <span class="Special"><-</span> put *next, <span class="Constant">prev:offset</span>, end +<span id="L500" class="LineNr">500 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L29'>next</a> +<span id="L501" class="LineNr">501 </span> *next <span class="Special"><-</span> put *next, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, end <span id="L502" class="LineNr">502 </span> <span class="Delimiter">}</span> -<span id="L503" class="LineNr">503 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">next:offset</span>, start -<span id="L504" class="LineNr">504 </span> *start <span class="Special"><-</span> put *start, <span class="Constant">prev:offset</span>, in +<span id="L503" class="LineNr">503 </span> *in <span class="Special"><-</span> put *in, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, start +<span id="L504" class="LineNr">504 </span> *start <span class="Special"><-</span> put *start, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, in <span id="L505" class="LineNr">505 </span>] <span id="L506" class="LineNr">506 </span> <span id="L507" class="LineNr">507 </span><span class="muRecipe">def</span> append in:&:duplex-list:_elem, new:&:duplex-list:_elem/contained-in:in<span class="muRecipe"> -> </span>in:&:duplex-list:_elem [ <span id="L508" class="LineNr">508 </span> <span class="Constant">local-scope</span> <span id="L509" class="LineNr">509 </span> <span class="Constant">load-ingredients</span> -<span id="L510" class="LineNr">510 </span> last:&:duplex-list:_elem <span class="Special"><-</span> last in -<span id="L511" class="LineNr">511 </span> *last <span class="Special"><-</span> put *last, <span class="Constant">next:offset</span>, new +<span id="L510" class="LineNr">510 </span> <a href='065duplex_list.mu.html#L516'>last</a>:&:duplex-list:_elem <span class="Special"><-</span> <a href='065duplex_list.mu.html#L516'>last</a> in +<span id="L511" class="LineNr">511 </span> *last <span class="Special"><-</span> put *last, <span class="Constant"><a href='065duplex_list.mu.html#L29'>next</a>:offset</span>, new <span id="L512" class="LineNr">512 </span> <span class="muControl">return-unless</span> new -<span id="L513" class="LineNr">513 </span> *new <span class="Special"><-</span> put *new, <span class="Constant">prev:offset</span>, last +<span id="L513" class="LineNr">513 </span> *new <span class="Special"><-</span> put *new, <span class="Constant"><a href='065duplex_list.mu.html#L36'>prev</a>:offset</span>, <a href='065duplex_list.mu.html#L516'>last</a> <span id="L514" class="LineNr">514 </span>] <span id="L515" class="LineNr">515 </span> -<span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> last in:&:duplex-list:_elem<span class="muRecipe"> -> </span>result:&:duplex-list:_elem [ +<span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> <a href='065duplex_list.mu.html#L516'>last</a> in:&:duplex-list:_elem<span class="muRecipe"> -> </span>result:&:duplex-list:_elem [ <span id="L517" class="LineNr">517 </span> <span class="Constant">local-scope</span> <span id="L518" class="LineNr">518 </span> <span class="Constant">load-ingredients</span> <span id="L519" class="LineNr">519 </span> result <span class="Special"><-</span> copy in <span id="L520" class="LineNr">520 </span> <span class="Delimiter">{</span> -<span id="L521" class="LineNr">521 </span> next:&:duplex-list:_elem <span class="Special"><-</span> next result -<span id="L522" class="LineNr">522 </span> <span class="muControl">break-unless</span> next -<span id="L523" class="LineNr">523 </span> result <span class="Special"><-</span> copy next +<span id="L521" class="LineNr">521 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:_elem <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> result +<span id="L522" class="LineNr">522 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L29'>next</a> +<span id="L523" class="LineNr">523 </span> result <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L29'>next</a> <span id="L524" class="LineNr">524 </span> <span class="muControl">loop</span> <span id="L525" class="LineNr">525 </span> <span class="Delimiter">}</span> <span id="L526" class="LineNr">526 </span>] <span id="L527" class="LineNr">527 </span> <span id="L528" class="LineNr">528 </span><span class="Comment"># helper for debugging</span> -<span id="L529" class="LineNr">529 </span><span class="muRecipe">def</span> dump-from x:&:duplex-list:_elem [ +<span id="L529" class="LineNr">529 </span><span class="muRecipe">def</span> <a href='065duplex_list.mu.html#L529'>dump-from</a> x:&:duplex-list:_elem [ <span id="L530" class="LineNr">530 </span> <span class="Constant">local-scope</span> <span id="L531" class="LineNr">531 </span> <span class="Constant">load-ingredients</span> <span id="L532" class="LineNr">532 </span> $print x, <span class="Constant">[: ]</span> @@ -592,7 +592,7 @@ if ('onhashchange' in window) { <span id="L534" class="LineNr">534 </span> <span class="muControl">break-unless</span> x <span id="L535" class="LineNr">535 </span> c:_elem <span class="Special"><-</span> get *x, <span class="Constant">value:offset</span> <span id="L536" class="LineNr">536 </span> $print c, <span class="Constant">[ ]</span> -<span id="L537" class="LineNr">537 </span> x <span class="Special"><-</span> next x +<span id="L537" class="LineNr">537 </span> x <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> x <span id="L538" class="LineNr">538 </span> <span class="Delimiter">{</span> <span id="L539" class="LineNr">539 </span> is-newline?:bool <span class="Special"><-</span> equal c, <span class="Constant">10/newline</span> <span id="L540" class="LineNr">540 </span> <span class="muControl">break-unless</span> is-newline? diff --git a/html/066stream.mu.html b/html/066stream.mu.html index b1180362..0354fc0a 100644 --- a/html/066stream.mu.html +++ b/html/066stream.mu.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <span id="L4" class="LineNr"> 4 </span> data:&:@:_elem <span id="L5" class="LineNr"> 5 </span>] <span id="L6" class="LineNr"> 6 </span> -<span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> new-stream s:&:@:_elem<span class="muRecipe"> -> </span>result:&:stream:_elem [ +<span id="L7" class="LineNr"> 7 </span><span class="muRecipe">def</span> <a href='066stream.mu.html#L7'>new-stream</a> s:&:@:_elem<span class="muRecipe"> -> </span>result:&:stream:_elem [ <span id="L8" class="LineNr"> 8 </span> <span class="Constant">local-scope</span> <span id="L9" class="LineNr"> 9 </span> <span class="Constant">load-ingredients</span> <span id="L10" class="LineNr">10 </span> result <span class="Special"><-</span> new <span class="Delimiter">{</span>(stream _elem): type<span class="Delimiter">}</span> @@ -69,7 +69,7 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr">12 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">data:offset</span>, s <span id="L13" class="LineNr">13 </span>] <span id="L14" class="LineNr">14 </span> -<span id="L15" class="LineNr">15 </span><span class="muRecipe">def</span> rewind in:&:stream:_elem<span class="muRecipe"> -> </span>in:&:stream:_elem [ +<span id="L15" class="LineNr">15 </span><span class="muRecipe">def</span> <a href='066stream.mu.html#L15'>rewind</a> in:&:stream:_elem<span class="muRecipe"> -> </span>in:&:stream:_elem [ <span id="L16" class="LineNr">16 </span> <span class="Constant">local-scope</span> <span id="L17" class="LineNr">17 </span> <span class="Constant">load-ingredients</span> <span id="L18" class="LineNr">18 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">index:offset</span>,<span class="Constant"> 0</span> @@ -93,7 +93,7 @@ if ('onhashchange' in window) { <span id="L36" class="LineNr">36 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">index:offset</span>, idx <span id="L37" class="LineNr">37 </span>] <span id="L38" class="LineNr">38 </span> -<span id="L39" class="LineNr">39 </span><span class="muRecipe">def</span> peek in:&:stream:_elem<span class="muRecipe"> -> </span>result:_elem, empty?:bool [ +<span id="L39" class="LineNr">39 </span><span class="muRecipe">def</span> <a href='066stream.mu.html#L39'>peek</a> in:&:stream:_elem<span class="muRecipe"> -> </span>result:_elem, empty?:bool [ <span id="L40" class="LineNr">40 </span> <span class="Constant">local-scope</span> <span id="L41" class="LineNr">41 </span> <span class="Constant">load-ingredients</span> <span id="L42" class="LineNr">42 </span> empty?:bool <span class="Special"><-</span> copy <span class="Constant">0/false</span> @@ -109,19 +109,19 @@ if ('onhashchange' in window) { <span id="L52" class="LineNr">52 </span> result <span class="Special"><-</span> index *s, idx <span id="L53" class="LineNr">53 </span>] <span id="L54" class="LineNr">54 </span> -<span id="L55" class="LineNr">55 </span><span class="muRecipe">def</span> read-line in:&:stream:char<span class="muRecipe"> -> </span>result:text, in:&:stream:char [ +<span id="L55" class="LineNr">55 </span><span class="muRecipe">def</span> <a href='066stream.mu.html#L55'>read-line</a> in:&:stream:char<span class="muRecipe"> -> </span>result:text, in:&:stream:char [ <span id="L56" class="LineNr">56 </span> <span class="Constant">local-scope</span> <span id="L57" class="LineNr">57 </span> <span class="Constant">load-ingredients</span> <span id="L58" class="LineNr">58 </span> idx:num <span class="Special"><-</span> get *in, <span class="Constant">index:offset</span> <span id="L59" class="LineNr">59 </span> s:text <span class="Special"><-</span> get *in, <span class="Constant">data:offset</span> <span id="L60" class="LineNr">60 </span> next-idx:num <span class="Special"><-</span> find-next s, <span class="Constant">10/newline</span>, idx -<span id="L61" class="LineNr">61 </span> result <span class="Special"><-</span> copy-range s, idx, next-idx +<span id="L61" class="LineNr">61 </span> result <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> s, idx, next-idx <span id="L62" class="LineNr">62 </span> idx <span class="Special"><-</span> add next-idx,<span class="Constant"> 1</span> <span class="Comment"># skip newline</span> <span id="L63" class="LineNr">63 </span> <span class="Comment"># write back</span> <span id="L64" class="LineNr">64 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">index:offset</span>, idx <span id="L65" class="LineNr">65 </span>] <span id="L66" class="LineNr">66 </span> -<span id="L67" class="LineNr">67 </span><span class="muRecipe">def</span> end-of-stream? in:&:stream:_elem<span class="muRecipe"> -> </span>result:bool [ +<span id="L67" class="LineNr">67 </span><span class="muRecipe">def</span> <a href='066stream.mu.html#L67'>end-of-stream?</a> in:&:stream:_elem<span class="muRecipe"> -> </span>result:bool [ <span id="L68" class="LineNr">68 </span> <span class="Constant">local-scope</span> <span id="L69" class="LineNr">69 </span> <span class="Constant">load-ingredients</span> <span id="L70" class="LineNr">70 </span> idx:num <span class="Special"><-</span> get *in, <span class="Constant">index:offset</span> diff --git a/html/067random.cc.html b/html/067random.cc.html index 390906b2..6d712c10 100644 --- a/html/067random.cc.html +++ b/html/067random.cc.html @@ -56,7 +56,7 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L2" class="LineNr"> 2 </span>REAL_RANDOM<span class="Delimiter">,</span> <span id="L3" class="LineNr"> 3 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L4" class="LineNr"> 4 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"real-random"</span><span class="Delimiter">,</span> REAL_RANDOM<span class="Delimiter">);</span> +<span id="L4" class="LineNr"> 4 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"real-random"</span><span class="Delimiter">,</span> REAL_RANDOM<span class="Delimiter">);</span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L6" class="LineNr"> 6 </span><span class="Normal">case</span> REAL_RANDOM: <span class="Delimiter">{</span> <span id="L7" class="LineNr"> 7 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -73,7 +73,7 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr">18 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L19" class="LineNr">19 </span>MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">,</span> <span id="L20" class="LineNr">20 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L21" class="LineNr">21 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"make-random-nondeterministic"</span><span class="Delimiter">,</span> MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">);</span> +<span id="L21" class="LineNr">21 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"make-random-nondeterministic"</span><span class="Delimiter">,</span> MAKE_RANDOM_NONDETERMINISTIC<span class="Delimiter">);</span> <span id="L22" class="LineNr">22 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L23" class="LineNr">23 </span><span class="Normal">case</span> MAKE_RANDOM_NONDETERMINISTIC: <span class="Delimiter">{</span> <span id="L24" class="LineNr">24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/068random.mu.html b/html/068random.mu.html index 1fa74952..daf2e458 100644 --- a/html/068random.mu.html +++ b/html/068random.mu.html @@ -55,7 +55,7 @@ if ('onhashchange' in window) { </head> <body onload='JumpToLine();'> <pre id='vimCodeElement'> -<span id="L1" class="LineNr"> 1 </span><span class="muRecipe">def</span> random generator:&:stream:num<span class="muRecipe"> -> </span>result:num, fail?:bool, generator:&:stream:num [ +<span id="L1" class="LineNr"> 1 </span><span class="muRecipe">def</span> <a href='068random.mu.html#L1'>random</a> generator:&:stream:num<span class="muRecipe"> -> </span>result:num, fail?:bool, generator:&:stream:num [ <span id="L2" class="LineNr"> 2 </span> <span class="Constant">local-scope</span> <span id="L3" class="LineNr"> 3 </span> <span class="Constant">load-ingredients</span> <span id="L4" class="LineNr"> 4 </span> <span class="Delimiter">{</span> @@ -68,7 +68,7 @@ if ('onhashchange' in window) { <span id="L11" class="LineNr">11 </span>] <span id="L12" class="LineNr">12 </span> <span id="L13" class="LineNr">13 </span><span class="Comment"># helper for tests</span> -<span id="L14" class="LineNr">14 </span><span class="muRecipe">def</span> assume-random-numbers<span class="muRecipe"> -> </span>result:&:stream:num [ +<span id="L14" class="LineNr">14 </span><span class="muRecipe">def</span> <a href='068random.mu.html#L14'>assume-random-numbers</a><span class="muRecipe"> -> </span>result:&:stream:num [ <span id="L15" class="LineNr">15 </span> <span class="Constant">local-scope</span> <span id="L16" class="LineNr">16 </span> <span class="Constant">load-ingredients</span> <span id="L17" class="LineNr">17 </span> <span class="Comment"># compute result-len, space to allocate in result</span> @@ -89,16 +89,16 @@ if ('onhashchange' in window) { <span id="L32" class="LineNr">32 </span> idx <span class="Special"><-</span> add idx,<span class="Constant"> 1</span> <span id="L33" class="LineNr">33 </span> <span class="muControl">loop</span> <span id="L34" class="LineNr">34 </span> <span class="Delimiter">}</span> -<span id="L35" class="LineNr">35 </span> result <span class="Special"><-</span> new-stream result-data +<span id="L35" class="LineNr">35 </span> result <span class="Special"><-</span> <a href='066stream.mu.html#L7'>new-stream</a> result-data <span id="L36" class="LineNr">36 </span>] <span id="L37" class="LineNr">37 </span> <span id="L38" class="LineNr">38 </span><span class="muScenario">scenario</span> random-numbers-in-scenario [ <span id="L39" class="LineNr">39 </span> <span class="Constant">local-scope</span> -<span id="L40" class="LineNr">40 </span> source:&:stream:num <span class="Special"><-</span> assume-random-numbers<span class="Constant"> 34</span>,<span class="Constant"> 35</span>,<span class="Constant"> 37</span> -<span id="L41" class="LineNr">41 </span> 1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special"><-</span> random source -<span id="L42" class="LineNr">42 </span> 3:num/<span class="Special">raw</span>, 4:bool/<span class="Special">raw</span> <span class="Special"><-</span> random source -<span id="L43" class="LineNr">43 </span> 5:num/<span class="Special">raw</span>, 6:bool/<span class="Special">raw</span> <span class="Special"><-</span> random source -<span id="L44" class="LineNr">44 </span> 7:num/<span class="Special">raw</span>, 8:bool/<span class="Special">raw</span> <span class="Special"><-</span> random source +<span id="L40" class="LineNr">40 </span> source:&:stream:num <span class="Special"><-</span> <a href='068random.mu.html#L14'>assume-random-numbers</a><span class="Constant"> 34</span>,<span class="Constant"> 35</span>,<span class="Constant"> 37</span> +<span id="L41" class="LineNr">41 </span> 1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='068random.mu.html#L1'>random</a> source +<span id="L42" class="LineNr">42 </span> 3:num/<span class="Special">raw</span>, 4:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='068random.mu.html#L1'>random</a> source +<span id="L43" class="LineNr">43 </span> 5:num/<span class="Special">raw</span>, 6:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='068random.mu.html#L1'>random</a> source +<span id="L44" class="LineNr">44 </span> 7:num/<span class="Special">raw</span>, 8:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='068random.mu.html#L1'>random</a> source <span id="L45" class="LineNr">45 </span> memory-should-contain [ <span id="L46" class="LineNr">46 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 34</span> <span id="L47" class="LineNr">47 </span> <span class="Constant"> 2</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># everything went well</span> @@ -111,20 +111,20 @@ if ('onhashchange' in window) { <span id="L54" class="LineNr">54 </span> ] <span id="L55" class="LineNr">55 </span>] <span id="L56" class="LineNr">56 </span> -<span id="L57" class="LineNr">57 </span><span class="muRecipe">def</span> random-in-range generator:&:stream:num, start:num, end:num<span class="muRecipe"> -> </span>result:num, fail?:bool, generator:&:stream:num [ +<span id="L57" class="LineNr">57 </span><span class="muRecipe">def</span> <a href='068random.mu.html#L57'>random-in-range</a> generator:&:stream:num, start:num, end:num<span class="muRecipe"> -> </span>result:num, fail?:bool, generator:&:stream:num [ <span id="L58" class="LineNr">58 </span> <span class="Constant">local-scope</span> <span id="L59" class="LineNr">59 </span> <span class="Constant">load-ingredients</span> -<span id="L60" class="LineNr">60 </span> result, fail?, generator <span class="Special"><-</span> random generator +<span id="L60" class="LineNr">60 </span> result, fail?, generator <span class="Special"><-</span> <a href='068random.mu.html#L1'>random</a> generator <span id="L61" class="LineNr">61 </span> <span class="muControl">return-if</span> fail? <span id="L62" class="LineNr">62 </span> delta:num <span class="Special"><-</span> subtract end, start <span id="L63" class="LineNr">63 </span> _, result <span class="Special"><-</span> divide-with-remainder result, delta <span id="L64" class="LineNr">64 </span> result <span class="Special"><-</span> add result, start <span id="L65" class="LineNr">65 </span>] <span id="L66" class="LineNr">66 </span> -<span id="L67" class="LineNr">67 </span><span class="muScenario">scenario</span> random-in-range [ +<span id="L67" class="LineNr">67 </span><span class="muScenario">scenario</span> <a href='068random.mu.html#L57'>random-in-range</a> [ <span id="L68" class="LineNr">68 </span> <span class="Constant">local-scope</span> -<span id="L69" class="LineNr">69 </span> source:&:stream:num <span class="Special"><-</span> assume-random-numbers<span class="Constant"> 91</span> -<span id="L70" class="LineNr">70 </span> 1:num/<span class="Special">raw</span> <span class="Special"><-</span> random-in-range source,<span class="Constant"> 40</span>,<span class="Constant"> 50</span> +<span id="L69" class="LineNr">69 </span> source:&:stream:num <span class="Special"><-</span> <a href='068random.mu.html#L14'>assume-random-numbers</a><span class="Constant"> 91</span> +<span id="L70" class="LineNr">70 </span> 1:num/<span class="Special">raw</span> <span class="Special"><-</span> <a href='068random.mu.html#L57'>random-in-range</a> source,<span class="Constant"> 40</span>,<span class="Constant"> 50</span> <span id="L71" class="LineNr">71 </span> memory-should-contain [ <span id="L72" class="LineNr">72 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 41</span> <span id="L73" class="LineNr">73 </span> ] diff --git a/html/069hash.cc.html b/html/069hash.cc.html index f4193143..7dabd8cb 100644 --- a/html/069hash.cc.html +++ b/html/069hash.cc.html @@ -72,11 +72,11 @@ if ('onhashchange' in window) { <span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L12" class="LineNr"> 12 </span>HASH<span class="Delimiter">,</span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L14" class="LineNr"> 14 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hash"</span><span class="Delimiter">,</span> HASH<span class="Delimiter">);</span> +<span id="L14" class="LineNr"> 14 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hash"</span><span class="Delimiter">,</span> HASH<span class="Delimiter">);</span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L16" class="LineNr"> 16 </span><span class="Normal">case</span> HASH: <span class="Delimiter">{</span> -<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> -<span id="L18" class="LineNr"> 18 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'hash' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L17" class="LineNr"> 17 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L18" class="LineNr"> 18 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'hash' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L19" class="LineNr"> 19 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L20" class="LineNr"> 20 </span> <span class="Delimiter">}</span> <span id="L21" class="LineNr"> 21 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -85,99 +85,99 @@ if ('onhashchange' in window) { <span id="L24" class="LineNr"> 24 </span><span class="Normal">case</span> HASH: <span class="Delimiter">{</span> <span id="L25" class="LineNr"> 25 </span> <span class="Normal">const</span> reagent& 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 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> -<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> +<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><a href='069hash.cc.html#L34'>hash</a><span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> input<span class="Delimiter">));</span> <span id="L28" class="LineNr"> 28 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L29" class="LineNr"> 29 </span><span class="Delimiter">}</span> <span id="L30" class="LineNr"> 30 </span> <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> <span id="L32" class="LineNr"> 32 </span> <span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L34" class="LineNr"> 34 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L34'>hash</a><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> <span id="L35" class="LineNr"> 35 </span> canonize<span class="Delimiter">(</span>r<span class="Delimiter">);</span> -<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> -<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> +<span id="L36" class="LineNr"> 36 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L174'>is_mu_text</a><span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Comment">// optimization</span> +<span id="L37" class="LineNr"> 37 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L68'>hash_mu_text</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<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> +<span id="L39" class="LineNr"> 39 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L56'>hash_mu_address</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<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> +<span id="L41" class="LineNr"> 41 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L51'>hash_mu_scalar</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<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> +<span id="L43" class="LineNr"> 43 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L77'>hash_mu_array</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<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> +<span id="L45" class="LineNr"> 45 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L91'>hash_mu_container</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <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> -<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> +<span id="L47" class="LineNr"> 47 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L106'>hash_mu_exclusive_container</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L48" class="LineNr"> 48 </span> assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span> <span id="L49" class="LineNr"> 49 </span><span class="Delimiter">}</span> <span id="L50" class="LineNr"> 50 </span> -<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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<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><<span class="Normal">size_t</span>><span class="Delimiter">(</span>input<span class="Delimiter">));</span> +<span id="L51" class="LineNr"> 51 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L51'>hash_mu_scalar</a><span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 : <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span> +<span id="L53" class="LineNr"> 53 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L119'>hash_iter</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> <span class="Normal">static_cast</span><<span class="Normal">size_t</span>><span class="Delimiter">(</span>input<span class="Delimiter">));</span> <span id="L54" class="LineNr"> 54 </span><span class="Delimiter">}</span> <span id="L55" class="LineNr"> 55 </span> -<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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L56" class="LineNr"> 56 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L56'>hash_mu_address</a><span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L58" class="LineNr"> 58 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << r<span class="Delimiter">.</span>value << <span class="Constant">" is "</span> << 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> << end<span class="Delimiter">();</span> -<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> +<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << r<span class="Delimiter">.</span>value << <span class="Constant">" is "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">))</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L59" class="LineNr"> 59 </span> r<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">));</span> <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> -<span id="L61" class="LineNr"> 61 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"skipping refcount at "</span> << r<span class="Delimiter">.</span>value << end<span class="Delimiter">();</span> -<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> +<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"skipping refcount at "</span> << r<span class="Delimiter">.</span>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L62" class="LineNr"> 62 </span> r<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><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 id="L63" class="LineNr"> 63 </span> <span class="Delimiter">}</span> <span id="L64" class="LineNr"> 64 </span> drop_from_type<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">"address"</span><span class="Delimiter">);</span> -<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> +<span id="L65" class="LineNr"> 65 </span> <span class="Identifier">return</span> <a href='069hash.cc.html#L34'>hash</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L66" class="LineNr"> 66 </span><span class="Delimiter">}</span> <span id="L67" class="LineNr"> 67 </span> -<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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<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 < SIZE<span class="Delimiter">(</span>input<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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><<span class="Normal">size_t</span>><span class="Delimiter">(</span>input<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span> +<span id="L68" class="LineNr"> 68 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L68'>hash_mu_text</a><span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L69" class="LineNr"> 69 </span> string input = <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">));</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>input<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L71" class="LineNr"> 71 </span> h = <a href='069hash.cc.html#L119'>hash_iter</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> <span class="Normal">static_cast</span><<span class="Normal">size_t</span>><span class="Delimiter">(</span>input<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)));</span> <span id="L72" class="LineNr"> 72 </span><span class="CommentedCode">//? cerr << i << ": " << h << '\n';</span> <span id="L73" class="LineNr"> 73 </span> <span class="Delimiter">}</span> <span id="L74" class="LineNr"> 74 </span> <span class="Identifier">return</span> h<span class="Delimiter">;</span> <span id="L75" class="LineNr"> 75 </span><span class="Delimiter">}</span> <span id="L76" class="LineNr"> 76 </span> -<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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L77" class="LineNr"> 77 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L77'>hash_mu_array</a><span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L78" class="LineNr"> 78 </span> <span class="Normal">int</span> size = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> r<span class="Delimiter">.</span>value<span class="Delimiter">);</span> <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> <span id="L80" class="LineNr"> 80 </span> <span class="Normal">delete</span> elem<span class="Delimiter">.</span>type<span class="Delimiter">;</span> -<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> -<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 < 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> +<span id="L81" class="LineNr"> 81 </span> elem<span class="Delimiter">.</span>type = <a href='032array.cc.html#L366'>copy_array_element</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span> +<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> <a href='043space.cc.html#L76'>address</a> = r<span class="Delimiter">.</span>value+<span class="Constant">1</span><span class="Delimiter">;</span> i < size<span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a> += size_of<span class="Delimiter">(</span>elem<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> -<span id="L84" class="LineNr"> 84 </span> tmp<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address<span class="Delimiter">);</span> -<span id="L85" class="LineNr"> 85 </span> h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> +<span id="L84" class="LineNr"> 84 </span> tmp<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> +<span id="L85" class="LineNr"> 85 </span> h = <a href='069hash.cc.html#L34'>hash</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> <span id="L86" class="LineNr"> 86 </span><span class="CommentedCode">//? cerr << i << " (" << address << "): " << h << '\n';</span> <span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span> <span id="L88" class="LineNr"> 88 </span> <span class="Identifier">return</span> h<span class="Delimiter">;</span> <span id="L89" class="LineNr"> 89 </span><span class="Delimiter">}</span> <span id="L90" class="LineNr"> 90 </span> -<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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L91" class="LineNr"> 91 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L91'>hash_mu_container</a><span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L92" class="LineNr"> 92 </span> type_info& 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">)-></span>value<span class="Delimiter">);</span> -<span id="L93" class="LineNr"> 93 </span> <span class="Normal">int</span> address = r<span class="Delimiter">.</span>value<span class="Delimiter">;</span> +<span id="L93" class="LineNr"> 93 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = r<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <span id="L94" class="LineNr"> 94 </span> <span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L95" class="LineNr"> 95 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L96" class="LineNr"> 96 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">);</span> +<span id="L95" class="LineNr"> 95 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L96" class="LineNr"> 96 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">);</span> <span id="L97" class="LineNr"> 97 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">"ignore-for-hash"</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L98" class="LineNr"> 98 </span> element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>address+offset<span class="Delimiter">);</span> -<span id="L99" class="LineNr"> 99 </span> h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> element<span class="Delimiter">);</span> +<span id="L98" class="LineNr"> 98 </span> element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>address+offset<span class="Delimiter">);</span> +<span id="L99" class="LineNr"> 99 </span> h = <a href='069hash.cc.html#L34'>hash</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> element<span class="Delimiter">);</span> <span id="L100" class="LineNr">100 </span><span class="CommentedCode">//? cerr << i << ": " << h << '\n';</span> <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> <span id="L102" class="LineNr">102 </span> <span class="Delimiter">}</span> <span id="L103" class="LineNr">103 </span> <span class="Identifier">return</span> h<span class="Delimiter">;</span> <span id="L104" class="LineNr">104 </span><span class="Delimiter">}</span> <span id="L105" class="LineNr">105 </span> -<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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L106" class="LineNr">106 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L106'>hash_mu_exclusive_container</a><span class="Delimiter">(</span><span class="Normal">size_t</span> h<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L108" class="LineNr">108 </span> assert<span class="Delimiter">(</span>type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> <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> <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> <span id="L111" class="LineNr">111 </span> <span class="Comment">// todo: move this error to container definition time</span> <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">"ignore-for-hash"</span><span class="Delimiter">))</span> -<span id="L113" class="LineNr">113 </span> raise << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">": /ignore-for-hash won't work in exclusive containers</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> -<span id="L115" class="LineNr">115 </span> h = hash<span class="Delimiter">(</span>h<span class="Delimiter">,</span> variant<span class="Delimiter">);</span> +<span id="L113" class="LineNr">113 </span> <a href='003trace.cc.html#L178'>raise</a> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">": /ignore-for-hash won't work in exclusive containers</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> variant<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><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> +<span id="L115" class="LineNr">115 </span> h = <a href='069hash.cc.html#L34'>hash</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> variant<span class="Delimiter">);</span> <span id="L116" class="LineNr">116 </span> <span class="Identifier">return</span> h<span class="Delimiter">;</span> <span id="L117" class="LineNr">117 </span><span class="Delimiter">}</span> <span id="L118" class="LineNr">118 </span> -<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> +<span id="L119" class="LineNr">119 </span><span class="Normal">size_t</span> <a href='069hash.cc.html#L119'>hash_iter</a><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> <span id="L120" class="LineNr">120 </span> h += input<span class="Delimiter">;</span> <span id="L121" class="LineNr">121 </span> h += <span class="Delimiter">(</span>h<<<span class="Constant">10</span><span class="Delimiter">);</span> <span id="L122" class="LineNr">122 </span> h ^= <span class="Delimiter">(</span>h>><span class="Constant">6</span><span class="Delimiter">);</span> @@ -193,12 +193,12 @@ if ('onhashchange' in window) { <span id="L132" class="LineNr">132 </span> <span class="Normal">x</span>:num <span id="L133" class="LineNr">133 </span> <span class="Normal">y</span>:<span class="Normal">char</span> <span id="L134" class="LineNr">134 </span>] -<span id="L135" class="LineNr">135 </span><span class="muRecipe">def</span> main [ +<span id="L135" class="LineNr">135 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L136" class="LineNr">136 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a -<span id="L137" class="LineNr">137 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:foo +<span id="L137" class="LineNr">137 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:foo <span id="L138" class="LineNr">138 </span> <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num <span id="L139" class="LineNr">139 </span> <span class="Constant">4</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">98</span>/a -<span id="L140" class="LineNr">140 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>hash <span class="Constant">4</span>:foo +<span id="L140" class="LineNr">140 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">4</span>:foo <span id="L141" class="LineNr">141 </span> <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num <span id="L142" class="LineNr">142 </span> <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num <span id="L143" class="LineNr">143 </span>] @@ -214,12 +214,12 @@ if ('onhashchange' in window) { <span id="L153" class="LineNr">153 </span> <span class="Normal">a</span>:num <span id="L154" class="LineNr">154 </span> <span class="Normal">b</span>:num <span id="L155" class="LineNr">155 </span>] -<span id="L156" class="LineNr">156 </span><span class="muRecipe">def</span> main [ +<span id="L156" class="LineNr">156 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L157" class="LineNr">157 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </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 id="L158" class="LineNr">158 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:foo +<span id="L158" class="LineNr">158 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:foo <span id="L159" class="LineNr">159 </span> <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num <span id="L160" class="LineNr">160 </span> <span class="Constant">5</span>:foo<span class="Special"> <- </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 id="L161" class="LineNr">161 </span> <span class="Constant">8</span>:num<span class="Special"> <- </span>hash <span class="Constant">5</span>:foo +<span id="L161" class="LineNr">161 </span> <span class="Constant">8</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">5</span>:foo <span id="L162" class="LineNr">162 </span> <span class="Identifier">return</span>-unless <span class="Constant">8</span>:num <span id="L163" class="LineNr">163 </span> <span class="Constant">9</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">4</span>:num<span class="Delimiter">,</span> <span class="Constant">8</span>:num <span id="L164" class="LineNr">164 </span>] @@ -231,12 +231,12 @@ if ('onhashchange' in window) { <span id="L170" class="LineNr">170 </span> <span class="Normal">x</span>:num <span id="L171" class="LineNr">171 </span> <span class="Normal">y</span>:<span class="Normal">char</span>/ignore-<span class="Normal">for</span>-hash <span id="L172" class="LineNr">172 </span>] -<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> main [ +<span id="L173" class="LineNr">173 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L174" class="LineNr">174 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a -<span id="L175" class="LineNr">175 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:foo +<span id="L175" class="LineNr">175 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:foo <span id="L176" class="LineNr">176 </span> <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num <span id="L177" class="LineNr">177 </span> <span class="Constant">4</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">98</span>/a -<span id="L178" class="LineNr">178 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>hash <span class="Constant">4</span>:foo +<span id="L178" class="LineNr">178 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">4</span>:foo <span id="L179" class="LineNr">179 </span> <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num <span id="L180" class="LineNr">180 </span> <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num <span id="L181" class="LineNr">181 </span>] @@ -247,59 +247,59 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr">186 </span><span class="Comment">//: current implementation works like we think it does.</span> <span id="L187" class="LineNr">187 </span> <span id="L188" class="LineNr">188 </span><span class="Delimiter">:(scenario hash_of_zero_address)</span> -<span id="L189" class="LineNr">189 </span><span class="muRecipe">def</span> main [ +<span id="L189" class="LineNr">189 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L190" class="LineNr">190 </span> <span class="Constant">1</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L191" class="LineNr">191 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:&:num +<span id="L191" class="LineNr">191 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:&:num <span id="L192" class="LineNr">192 </span>] <span id="L193" class="LineNr">193 </span><span class="traceContains">+mem: storing 0 in location 2</span> <span id="L194" class="LineNr">194 </span> <span id="L195" class="LineNr">195 </span><span class="Comment">//: This is probably too aggressive, but we need some way to avoid depending</span> <span id="L196" class="LineNr">196 </span><span class="Comment">//: on the precise bit pattern of a floating-point number.</span> <span id="L197" class="LineNr">197 </span><span class="Delimiter">:(scenario hash_of_numbers_ignores_fractional_part)</span> -<span id="L198" class="LineNr">198 </span><span class="muRecipe">def</span> main [ -<span id="L199" class="LineNr">199 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>hash <span class="Constant">1.5</span> -<span id="L200" class="LineNr">200 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span> +<span id="L198" class="LineNr">198 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L199" class="LineNr">199 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1.5</span> +<span id="L200" class="LineNr">200 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span> <span id="L201" class="LineNr">201 </span> <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">1</span>:num<span class="Delimiter">,</span> <span class="Constant">2</span>:num <span id="L202" class="LineNr">202 </span>] <span id="L203" class="LineNr">203 </span><span class="traceContains">+mem: storing 1 in location 3</span> <span id="L204" class="LineNr">204 </span> <span id="L205" class="LineNr">205 </span><span class="Delimiter">:(scenario hash_of_array_same_as_string)</span> -<span id="L206" class="LineNr">206 </span><span class="muRecipe">def</span> main [ +<span id="L206" class="LineNr">206 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L207" class="LineNr">207 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> <span id="L208" class="LineNr">208 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">97</span> <span id="L209" class="LineNr">209 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">98</span> <span id="L210" class="LineNr">210 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">99</span> -<span id="L211" class="LineNr">211 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>hash <span class="Constant">10</span>:@:num/unsafe +<span id="L211" class="LineNr">211 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">10</span>:@:num/unsafe <span id="L212" class="LineNr">212 </span> <span class="Identifier">return</span>-unless <span class="Constant">2</span>:num <span id="L213" class="LineNr">213 </span> <span class="Constant">3</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] -<span id="L214" class="LineNr">214 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>hash <span class="Constant">3</span>:text +<span id="L214" class="LineNr">214 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">3</span>:text <span id="L215" class="LineNr">215 </span> <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num <span id="L216" class="LineNr">216 </span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num <span id="L217" class="LineNr">217 </span>] <span id="L218" class="LineNr">218 </span><span class="traceContains">+mem: storing 1 in location 5</span> <span id="L219" class="LineNr">219 </span> <span id="L220" class="LineNr">220 </span><span class="Delimiter">:(scenario hash_ignores_address_value)</span> -<span id="L221" class="LineNr">221 </span><span class="muRecipe">def</span> main [ +<span id="L221" class="LineNr">221 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L222" class="LineNr">222 </span> <span class="Constant">1</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L223" class="LineNr">223 </span> *<span class="Constant">1</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L224" class="LineNr">224 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:&:num +<span id="L224" class="LineNr">224 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:&:num <span id="L225" class="LineNr">225 </span> <span class="Constant">3</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L226" class="LineNr">226 </span> *<span class="Constant">3</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L227" class="LineNr">227 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>hash <span class="Constant">3</span>:&:num +<span id="L227" class="LineNr">227 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">3</span>:&:num <span id="L228" class="LineNr">228 </span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num <span id="L229" class="LineNr">229 </span>] <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> <span id="L231" class="LineNr">231 </span><span class="traceContains">+mem: storing 1 in location 5</span> <span id="L232" class="LineNr">232 </span> <span id="L233" class="LineNr">233 </span><span class="Delimiter">:(scenario hash_ignores_address_refcount)</span> -<span id="L234" class="LineNr">234 </span><span class="muRecipe">def</span> main [ +<span id="L234" class="LineNr">234 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L235" class="LineNr">235 </span> <span class="Constant">1</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L236" class="LineNr">236 </span> *<span class="Constant">1</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L237" class="LineNr">237 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:&:num +<span id="L237" class="LineNr">237 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:&:num <span id="L238" class="LineNr">238 </span> <span class="Identifier">return</span>-unless <span class="Constant">2</span>:num <span id="L239" class="LineNr">239 </span> <span class="Comment"># increment refcount</span> <span id="L240" class="LineNr">240 </span> <span class="Constant">3</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:&:num -<span id="L241" class="LineNr">241 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>hash <span class="Constant">3</span>:&:num +<span id="L241" class="LineNr">241 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">3</span>:&:num <span id="L242" class="LineNr">242 </span> <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num <span id="L243" class="LineNr">243 </span> <span class="Constant">5</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">4</span>:num <span id="L244" class="LineNr">244 </span>] @@ -315,12 +315,12 @@ if ('onhashchange' in window) { <span id="L254" class="LineNr">254 </span> <span class="Normal">x</span>:num <span id="L255" class="LineNr">255 </span> <span class="Normal">y</span>:<span class="Normal">char</span> <span id="L256" class="LineNr">256 </span>] -<span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> main [ +<span id="L257" class="LineNr">257 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L258" class="LineNr">258 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a -<span id="L259" class="LineNr">259 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:foo +<span id="L259" class="LineNr">259 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:foo <span id="L260" class="LineNr">260 </span> <span class="Identifier">return</span>-unless <span class="Constant">3</span>:num <span id="L261" class="LineNr">261 </span> <span class="Constant">4</span>:bar<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">97</span>/a -<span id="L262" class="LineNr">262 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>hash <span class="Constant">4</span>:bar +<span id="L262" class="LineNr">262 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">4</span>:bar <span id="L263" class="LineNr">263 </span> <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num <span id="L264" class="LineNr">264 </span> <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">3</span>:num<span class="Delimiter">,</span> <span class="Constant">6</span>:num <span id="L265" class="LineNr">265 </span>] @@ -333,16 +333,16 @@ if ('onhashchange' in window) { <span id="L272" class="LineNr">272 </span> <span class="Normal">y</span>:<span class="Normal">char</span> <span id="L273" class="LineNr">273 </span> <span class="Normal">z</span>:&:num <span id="L274" class="LineNr">274 </span>] -<span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> main [ +<span id="L275" class="LineNr">275 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L276" class="LineNr">276 </span> <span class="Constant">1</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L277" class="LineNr">277 </span> *<span class="Constant">1</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L278" class="LineNr">278 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </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>:&:num -<span id="L279" class="LineNr">279 </span> <span class="Constant">5</span>:num<span class="Special"> <- </span>hash <span class="Constant">2</span>:foo +<span id="L279" class="LineNr">279 </span> <span class="Constant">5</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">2</span>:foo <span id="L280" class="LineNr">280 </span> <span class="Identifier">return</span>-unless <span class="Constant">5</span>:num <span id="L281" class="LineNr">281 </span> <span class="Constant">6</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L282" class="LineNr">282 </span> *<span class="Constant">6</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L283" class="LineNr">283 </span> <span class="Constant">7</span>:foo<span class="Special"> <- </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>:&:num -<span id="L284" class="LineNr">284 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>hash <span class="Constant">7</span>:foo +<span id="L284" class="LineNr">284 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">7</span>:foo <span id="L285" class="LineNr">285 </span> <span class="Identifier">return</span>-unless <span class="Constant">10</span>:num <span id="L286" class="LineNr">286 </span> <span class="Constant">11</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">5</span>:num<span class="Delimiter">,</span> <span class="Constant">10</span>:num <span id="L287" class="LineNr">287 </span>] @@ -359,12 +359,12 @@ if ('onhashchange' in window) { <span id="L298" class="LineNr">298 </span> <span class="Normal">x</span>:num <span id="L299" class="LineNr">299 </span> <span class="Normal">y</span>:num <span id="L300" class="LineNr">300 </span>] -<span id="L301" class="LineNr">301 </span><span class="muRecipe">def</span> main [ +<span id="L301" class="LineNr">301 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L302" class="LineNr">302 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </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 id="L303" class="LineNr">303 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:foo +<span id="L303" class="LineNr">303 </span> <span class="Constant">6</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:foo <span id="L304" class="LineNr">304 </span> <span class="Identifier">return</span>-unless <span class="Constant">6</span>:num <span id="L305" class="LineNr">305 </span> <span class="Constant">7</span>:foo<span class="Special"> <- </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 id="L306" class="LineNr">306 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>hash <span class="Constant">7</span>:foo +<span id="L306" class="LineNr">306 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">7</span>:foo <span id="L307" class="LineNr">307 </span> <span class="Identifier">return</span>-unless <span class="Constant">12</span>:num <span id="L308" class="LineNr">308 </span> <span class="Constant">13</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">6</span>:num<span class="Delimiter">,</span> <span class="Constant">12</span>:num <span id="L309" class="LineNr">309 </span>] @@ -380,12 +380,12 @@ if ('onhashchange' in window) { <span id="L319" class="LineNr">319 </span> <span class="Normal">a</span>:num <span id="L320" class="LineNr">320 </span> <span class="Normal">b</span>:num <span id="L321" class="LineNr">321 </span>] -<span id="L322" class="LineNr">322 </span><span class="muRecipe">def</span> main [ +<span id="L322" class="LineNr">322 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L323" class="LineNr">323 </span> <span class="Constant">1</span>:foo<span class="Special"> <- </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 id="L324" class="LineNr">324 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:foo +<span id="L324" class="LineNr">324 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:foo <span id="L325" class="LineNr">325 </span> <span class="Identifier">return</span>-unless <span class="Constant">4</span>:num <span id="L326" class="LineNr">326 </span> <span class="Constant">5</span>:bar<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> -<span id="L327" class="LineNr">327 </span> <span class="Constant">7</span>:num<span class="Special"> <- </span>hash <span class="Constant">5</span>:bar +<span id="L327" class="LineNr">327 </span> <span class="Constant">7</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">5</span>:bar <span id="L328" class="LineNr">328 </span> <span class="Identifier">return</span>-unless <span class="Constant">7</span>:num <span id="L329" class="LineNr">329 </span> <span class="Constant">8</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">4</span>:num<span class="Delimiter">,</span> <span class="Constant">7</span>:num <span id="L330" class="LineNr">330 </span>] @@ -397,9 +397,9 @@ if ('onhashchange' in window) { <span id="L336" class="LineNr">336 </span><span class="Comment">//: version around and check that the new one is consistent with it.</span> <span id="L337" class="LineNr">337 </span> <span id="L338" class="LineNr">338 </span><span class="Delimiter">:(scenario hash_matches_old_version)</span> -<span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> main [ +<span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L340" class="LineNr">340 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [abc] -<span id="L341" class="LineNr">341 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>hash <span class="Constant">1</span>:text +<span id="L341" class="LineNr">341 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span><a href='069hash.cc.html#L34'>hash</a> <span class="Constant">1</span>:text <span id="L342" class="LineNr">342 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>hash_old <span class="Constant">1</span>:text <span id="L343" class="LineNr">343 </span> <span class="Constant">4</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">3</span>:num <span id="L344" class="LineNr">344 </span>] @@ -408,25 +408,25 @@ if ('onhashchange' in window) { <span id="L347" class="LineNr">347 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L348" class="LineNr">348 </span>HASH_OLD<span class="Delimiter">,</span> <span id="L349" class="LineNr">349 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L350" class="LineNr">350 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hash_old"</span><span class="Delimiter">,</span> HASH_OLD<span class="Delimiter">);</span> +<span id="L350" class="LineNr">350 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hash_old"</span><span class="Delimiter">,</span> HASH_OLD<span class="Delimiter">);</span> <span id="L351" class="LineNr">351 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L352" class="LineNr">352 </span><span class="Normal">case</span> HASH_OLD: <span class="Delimiter">{</span> -<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> -<span id="L354" class="LineNr">354 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'hash_old' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L353" class="LineNr">353 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L354" class="LineNr">354 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'hash_old' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L355" class="LineNr">355 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L356" class="LineNr">356 </span> <span class="Delimiter">}</span> <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> -<span id="L358" class="LineNr">358 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'hash_old' currently only supports texts (address array character), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L358" class="LineNr">358 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'hash_old' currently only supports texts (address array character), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L359" class="LineNr">359 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L360" class="LineNr">360 </span> <span class="Delimiter">}</span> <span id="L361" class="LineNr">361 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L362" class="LineNr">362 </span><span class="Delimiter">}</span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L364" class="LineNr">364 </span><span class="Normal">case</span> HASH_OLD: <span class="Delimiter">{</span> -<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> +<span id="L365" class="LineNr">365 </span> string input = <a href='038new_text.cc.html#L143'>read_mu_text</a><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 id="L366" class="LineNr">366 </span> <span class="Normal">size_t</span> h = <span class="Constant">0</span> <span class="Delimiter">;</span> <span id="L367" class="LineNr">367 </span> -<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 < SIZE<span class="Delimiter">(</span>input<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>input<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L369" class="LineNr">369 </span> h += <span class="Normal">static_cast</span><<span class="Normal">size_t</span>><span class="Delimiter">(</span>input<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span id="L370" class="LineNr">370 </span> h += <span class="Delimiter">(</span>h<<<span class="Constant">10</span><span class="Delimiter">);</span> <span id="L371" class="LineNr">371 </span> h ^= <span class="Delimiter">(</span>h>><span class="Constant">6</span><span class="Delimiter">);</span> diff --git a/html/070table.mu.html b/html/070table.mu.html index 2146305a..0c3af41e 100644 --- a/html/070table.mu.html +++ b/html/070table.mu.html @@ -63,7 +63,7 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span> <span id="L6" class="LineNr"> 6 </span><span class="muScenario">scenario</span> table-read-write [ <span id="L7" class="LineNr"> 7 </span> <span class="Constant">local-scope</span> -<span id="L8" class="LineNr"> 8 </span> tab:&:table:num:num <span class="Special"><-</span> new-table<span class="Constant"> 30</span> +<span id="L8" class="LineNr"> 8 </span> tab:&:table:num:num <span class="Special"><-</span> <a href='070table.mu.html#L56'>new-table</a><span class="Constant"> 30</span> <span id="L9" class="LineNr"> 9 </span> run [ <span id="L10" class="LineNr"> 10 </span> put-index tab,<span class="Constant"> 12</span>,<span class="Constant"> 34</span> <span id="L11" class="LineNr"> 11 </span> 60:num/<span class="Special">raw</span>, 61:bool/<span class="Special">raw</span> <span class="Special"><-</span> index tab,<span class="Constant"> 12</span> @@ -76,7 +76,7 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr"> 18 </span> <span id="L19" class="LineNr"> 19 </span><span class="muScenario">scenario</span> table-read-write-non-integer [ <span id="L20" class="LineNr"> 20 </span> <span class="Constant">local-scope</span> -<span id="L21" class="LineNr"> 21 </span> tab:&:table:text:num <span class="Special"><-</span> new-table<span class="Constant"> 30</span> +<span id="L21" class="LineNr"> 21 </span> tab:&:table:text:num <span class="Special"><-</span> <a href='070table.mu.html#L56'>new-table</a><span class="Constant"> 30</span> <span id="L22" class="LineNr"> 22 </span> run [ <span id="L23" class="LineNr"> 23 </span> put-index tab, <span class="Constant">[abc def]</span>,<span class="Constant"> 34</span> <span id="L24" class="LineNr"> 24 </span> 1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special"><-</span> index tab, <span class="Constant">[abc def]</span> @@ -89,7 +89,7 @@ if ('onhashchange' in window) { <span id="L31" class="LineNr"> 31 </span> <span id="L32" class="LineNr"> 32 </span><span class="muScenario">scenario</span> table-read-not-found [ <span id="L33" class="LineNr"> 33 </span> <span class="Constant">local-scope</span> -<span id="L34" class="LineNr"> 34 </span> tab:&:table:text:num <span class="Special"><-</span> new-table<span class="Constant"> 30</span> +<span id="L34" class="LineNr"> 34 </span> tab:&:table:text:num <span class="Special"><-</span> <a href='070table.mu.html#L56'>new-table</a><span class="Constant"> 30</span> <span id="L35" class="LineNr"> 35 </span> run [ <span id="L36" class="LineNr"> 36 </span> 1:num/<span class="Special">raw</span>, 2:bool/<span class="Special">raw</span> <span class="Special"><-</span> index tab, <span class="Constant">[abc def]</span> <span id="L37" class="LineNr"> 37 </span> ] @@ -101,7 +101,7 @@ if ('onhashchange' in window) { <span id="L43" class="LineNr"> 43 </span> <span id="L44" class="LineNr"> 44 </span><span class="muData">container</span> table:_key:_value [ <span id="L45" class="LineNr"> 45 </span> length:num -<span id="L46" class="LineNr"> 46 </span> capacity:num +<span id="L46" class="LineNr"> 46 </span> <a href='075channel.mu.html#L379'>capacity</a>:num <span id="L47" class="LineNr"> 47 </span> data:&:@:table-row:_key:_value <span id="L48" class="LineNr"> 48 </span>] <span id="L49" class="LineNr"> 49 </span> @@ -111,12 +111,12 @@ if ('onhashchange' in window) { <span id="L53" class="LineNr"> 53 </span> value:_value <span id="L54" class="LineNr"> 54 </span>] <span id="L55" class="LineNr"> 55 </span> -<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> new-table capacity:num<span class="muRecipe"> -> </span>result:&:table:_key:_value [ +<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> <a href='070table.mu.html#L56'>new-table</a> <a href='075channel.mu.html#L379'>capacity</a>:num<span class="muRecipe"> -> </span>result:&:table:_key:_value [ <span id="L57" class="LineNr"> 57 </span> <span class="Constant">local-scope</span> <span id="L58" class="LineNr"> 58 </span> <span class="Constant">load-ingredients</span> <span id="L59" class="LineNr"> 59 </span> result <span class="Special"><-</span> new <span class="Delimiter">{</span>(table _key _value): type<span class="Delimiter">}</span> -<span id="L60" class="LineNr"> 60 </span> data:&:@:table-row:_key:_value <span class="Special"><-</span> new <span class="Delimiter">{</span>(table-row _key _value): type<span class="Delimiter">}</span>, capacity -<span id="L61" class="LineNr"> 61 </span> *result <span class="Special"><-</span> merge <span class="Constant">0/length</span>, capacity, data +<span id="L60" class="LineNr"> 60 </span> data:&:@:table-row:_key:_value <span class="Special"><-</span> new <span class="Delimiter">{</span>(table-row _key _value): type<span class="Delimiter">}</span>, <a href='075channel.mu.html#L379'>capacity</a> +<span id="L61" class="LineNr"> 61 </span> *result <span class="Special"><-</span> merge <span class="Constant">0/length</span>, <a href='075channel.mu.html#L379'>capacity</a>, data <span id="L62" class="LineNr"> 62 </span>] <span id="L63" class="LineNr"> 63 </span> <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> @@ -125,10 +125,10 @@ if ('onhashchange' in window) { <span id="L67" class="LineNr"> 67 </span> <span class="Constant">local-scope</span> <span id="L68" class="LineNr"> 68 </span> <span class="Constant">load-ingredients</span> <span id="L69" class="LineNr"> 69 </span> hash:num <span class="Special"><-</span> hash key -<span id="L70" class="LineNr"> 70 </span> hash <span class="Special"><-</span> abs hash -<span id="L71" class="LineNr"> 71 </span> capacity:num <span class="Special"><-</span> get *table, <span class="Constant">capacity:offset</span> -<span id="L72" class="LineNr"> 72 </span> _, hash-key:num <span class="Special"><-</span> divide-with-remainder hash, capacity -<span id="L73" class="LineNr"> 73 </span> hash-key <span class="Special"><-</span> abs hash-key <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span> +<span id="L70" class="LineNr"> 70 </span> hash <span class="Special"><-</span> <a href='070table.mu.html#L103'>abs</a> hash +<span id="L71" class="LineNr"> 71 </span> <a href='075channel.mu.html#L379'>capacity</a>:num <span class="Special"><-</span> get *table, <span class="Constant"><a href='075channel.mu.html#L379'>capacity</a>:offset</span> +<span id="L72" class="LineNr"> 72 </span> _, hash-key:num <span class="Special"><-</span> divide-with-remainder hash, <a href='075channel.mu.html#L379'>capacity</a> +<span id="L73" class="LineNr"> 73 </span> hash-key <span class="Special"><-</span> <a href='070table.mu.html#L103'>abs</a> hash-key <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span> <span id="L74" class="LineNr"> 74 </span> table-data:&:@:table-row:_key:_value <span class="Special"><-</span> get *table, <span class="Constant">data:offset</span> <span id="L75" class="LineNr"> 75 </span> x:table-row:_key:_value <span class="Special"><-</span> index *table-data, hash-key <span id="L76" class="LineNr"> 76 </span> occupied?:bool <span class="Special"><-</span> get x, <span class="Constant">occupied?:offset</span> @@ -142,10 +142,10 @@ if ('onhashchange' in window) { <span id="L84" class="LineNr"> 84 </span> <span class="Constant">local-scope</span> <span id="L85" class="LineNr"> 85 </span> <span class="Constant">load-ingredients</span> <span id="L86" class="LineNr"> 86 </span> hash:num <span class="Special"><-</span> hash key -<span id="L87" class="LineNr"> 87 </span> hash <span class="Special"><-</span> abs hash -<span id="L88" class="LineNr"> 88 </span> capacity:num <span class="Special"><-</span> get *table, <span class="Constant">capacity:offset</span> -<span id="L89" class="LineNr"> 89 </span> _, hash-key:num <span class="Special"><-</span> divide-with-remainder hash, capacity -<span id="L90" class="LineNr"> 90 </span> hash-key <span class="Special"><-</span> abs hash-key <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span> +<span id="L87" class="LineNr"> 87 </span> hash <span class="Special"><-</span> <a href='070table.mu.html#L103'>abs</a> hash +<span id="L88" class="LineNr"> 88 </span> <a href='075channel.mu.html#L379'>capacity</a>:num <span class="Special"><-</span> get *table, <span class="Constant"><a href='075channel.mu.html#L379'>capacity</a>:offset</span> +<span id="L89" class="LineNr"> 89 </span> _, hash-key:num <span class="Special"><-</span> divide-with-remainder hash, <a href='075channel.mu.html#L379'>capacity</a> +<span id="L90" class="LineNr"> 90 </span> hash-key <span class="Special"><-</span> <a href='070table.mu.html#L103'>abs</a> hash-key <span class="Comment"># in case hash overflows from a double into a negative integer inside 'divide-with-remainder' above</span> <span id="L91" class="LineNr"> 91 </span> table-data:&:@:table-row:_key:_value <span class="Special"><-</span> get *table, <span class="Constant">data:offset</span> <span id="L92" class="LineNr"> 92 </span> x:table-row:_key:_value <span class="Special"><-</span> index *table-data, hash-key <span id="L93" class="LineNr"> 93 </span> empty:&:_value <span class="Special"><-</span> new <span class="Constant">_value:type</span> @@ -158,7 +158,7 @@ if ('onhashchange' in window) { <span id="L100" class="LineNr">100 </span> result <span class="Special"><-</span> get x, <span class="Constant">value:offset</span> <span id="L101" class="LineNr">101 </span>] <span id="L102" class="LineNr">102 </span> -<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> abs n:num<span class="muRecipe"> -> </span>result:num [ +<span id="L103" class="LineNr">103 </span><span class="muRecipe">def</span> <a href='070table.mu.html#L103'>abs</a> n:num<span class="muRecipe"> -> </span>result:num [ <span id="L104" class="LineNr">104 </span> <span class="Constant">local-scope</span> <span id="L105" class="LineNr">105 </span> <span class="Constant">load-ingredients</span> <span id="L106" class="LineNr">106 </span> positive?:bool <span class="Special"><-</span> greater-or-equal n,<span class="Constant"> 0</span> diff --git a/html/071recipe.cc.html b/html/071recipe.cc.html index 960feaa3..e899e16f 100644 --- a/html/071recipe.cc.html +++ b/html/071recipe.cc.html @@ -65,7 +65,7 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span><span class="Comment">//: todo: support storing shape-shifting recipes into recipe variables and calling them</span> <span id="L6" class="LineNr"> 6 </span> <span id="L7" class="LineNr"> 7 </span><span class="Delimiter">:(scenario call_literal_recipe)</span> -<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> main [ +<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L9" class="LineNr"> 9 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>call f<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L10" class="LineNr"> 10 </span>] <span id="L11" class="LineNr"> 11 </span><span class="muRecipe">def</span> f x:num<span class="muRecipe"> -> </span>y:num [ @@ -76,9 +76,9 @@ if ('onhashchange' in window) { <span id="L16" class="LineNr"> 16 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L17" class="LineNr"> 17 </span> <span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario call_variable)</span> -<span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> main [ -<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"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f -<span id="L21" class="LineNr"> 21 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -> </span>number<span class="Delimiter">)},</span> <span class="Constant">34</span> +<span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L20" class="LineNr"> 20 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> number<span class="muRecipe"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f +<span id="L21" class="LineNr"> 21 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> number<span class="muRecipe"> -> </span>number<span class="Delimiter">)},</span> <span class="Constant">34</span> <span id="L22" class="LineNr"> 22 </span>] <span id="L23" class="LineNr"> 23 </span><span class="muRecipe">def</span> f x:num<span class="muRecipe"> -> </span>y:num [ <span id="L24" class="LineNr"> 24 </span> local-scope @@ -88,46 +88,46 @@ if ('onhashchange' in window) { <span id="L28" class="LineNr"> 28 </span><span class="traceContains">+mem: storing 34 in location 2</span> <span id="L29" class="LineNr"> 29 </span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before "End Mu Types Initialization")</span> -<span id="L31" class="LineNr"> 31 </span>put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"recipe-literal"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L31" class="LineNr"> 31 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"recipe-literal"</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L32" class="LineNr"> 32 </span><span class="Comment">// 'recipe' variables can store recipe-literal</span> -<span id="L33" class="LineNr"> 33 </span>type_ordinal recipe = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"recipe"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<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">"recipe"</span><span class="Delimiter">;</span> +<span id="L33" class="LineNr"> 33 </span><a href='010vm.cc.html#L124'>type_ordinal</a> <a href='010vm.cc.html#L19'>recipe</a> = <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"recipe"</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L34" class="LineNr"> 34 </span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Type<span class="Delimiter">,</span> <a href='010vm.cc.html#L19'>recipe</a><span class="Delimiter">).</span>name = <span class="Constant">"recipe"</span><span class="Delimiter">;</span> <span id="L35" class="LineNr"> 35 </span> -<span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(after "Begin transform_names Ingredient Special-cases(ingredient, inst, caller)")</span> -<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> -<span id="L38" class="LineNr"> 38 </span> initialize_recipe_literal<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span> +<span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(after "Begin <a href='042name.cc.html#L37'>transform_names</a> Ingredient Special-cases(ingredient, inst, caller)")</span> +<span id="L37" class="LineNr"> 37 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L47'>is_recipe_literal</a><span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L38" class="LineNr"> 38 </span> <a href='071recipe.cc.html#L56'>initialize_recipe_literal</a><span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span> <span id="L39" class="LineNr"> 39 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L40" class="LineNr"> 40 </span><span class="Delimiter">}</span> -<span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(after "Begin transform_names Product Special-cases(product, inst, caller)")</span> -<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> -<span id="L43" class="LineNr"> 43 </span> initialize_recipe_literal<span class="Delimiter">(</span>product<span class="Delimiter">);</span> +<span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(after "Begin <a href='042name.cc.html#L37'>transform_names</a> Product Special-cases(product, inst, caller)")</span> +<span id="L42" class="LineNr"> 42 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L47'>is_recipe_literal</a><span class="Delimiter">(</span>product<span class="Delimiter">,</span> caller<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L43" class="LineNr"> 43 </span> <a href='071recipe.cc.html#L56'>initialize_recipe_literal</a><span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L44" class="LineNr"> 44 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L45" class="LineNr"> 45 </span><span class="Delimiter">}</span> <span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(code)</span> -<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& x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L47" class="LineNr"> 47 </span><span class="Normal">bool</span> <a href='071recipe.cc.html#L47'>is_recipe_literal</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<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> -<span id="L51" class="LineNr"> 51 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"you can't use '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' as a recipe literal when it's also a variable</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L50" class="LineNr"> 50 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L60'>contains_reagent_with_type</a><span class="Delimiter">(</span>caller<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L51" class="LineNr"> 51 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"you can't use '"</span> << x<span class="Delimiter">.</span>name << <span class="Constant">"' as a recipe literal when it's also a variable</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L52" class="LineNr"> 52 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L53" class="LineNr"> 53 </span> <span class="Delimiter">}</span> <span id="L54" class="LineNr"> 54 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">}</span> -<span id="L56" class="LineNr"> 56 </span><span class="Normal">void</span> initialize_recipe_literal<span class="Delimiter">(</span>reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L56" class="LineNr"> 56 </span><span class="Normal">void</span> <a href='071recipe.cc.html#L56'>initialize_recipe_literal</a><span class="Delimiter">(</span>reagent& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"recipe-literal"</span><span class="Delimiter">);</span> -<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> +<span id="L58" class="LineNr"> 58 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><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 id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span> -<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& caller<span class="Delimiter">,</span> <span class="Normal">const</span> string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L60" class="LineNr"> 60 </span><span class="Normal">bool</span> <a href='071recipe.cc.html#L60'>contains_reagent_with_type</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& caller<span class="Delimiter">,</span> <span class="Normal">const</span> string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L62" class="LineNr"> 62 </span> <span class="Normal">const</span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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> -<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 < SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> -<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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L64" class="LineNr"> 64 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L70'>is_matching_non_recipe_literal</a><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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L66" class="LineNr"> 66 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L70'>is_matching_non_recipe_literal</a><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 id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span> <span id="L68" class="LineNr"> 68 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L69" class="LineNr"> 69 </span><span class="Delimiter">}</span> -<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& x<span class="Delimiter">,</span> <span class="Normal">const</span> string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L70" class="LineNr"> 70 </span><span class="Normal">bool</span> <a href='071recipe.cc.html#L70'>is_matching_non_recipe_literal</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& x<span class="Delimiter">,</span> <span class="Normal">const</span> string& name<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> @@ -138,26 +138,26 @@ if ('onhashchange' in window) { <span id="L78" class="LineNr"> 78 </span><span class="Comment">//: assume variable types override recipe literals.</span> <span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(scenario error_on_recipe_literal_used_as_a_variable)</span> <span id="L80" class="LineNr"> 80 </span><span class="Special">% Hide_errors = true;</span> -<span id="L81" class="LineNr"> 81 </span><span class="muRecipe">def</span> main [ +<span id="L81" class="LineNr"> 81 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L82" class="LineNr"> 82 </span> local-scope <span id="L83" class="LineNr"> 83 </span> <span class="Normal">a</span>:<span class="Normal">bool</span><span class="Special"> <- </span>equal <span class="Identifier">break</span> <span class="Constant">0</span> <span id="L84" class="LineNr"> 84 </span> <span class="Normal">break</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L85" class="LineNr"> 85 </span>] -<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> -<span id="L87" class="LineNr"> 87 </span><span class="traceContains">+error: main: missing type for 'break' in 'a:bool <- equal break, 0'</span> +<span id="L86" class="LineNr"> 86 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: you can't use 'break' as a recipe literal when it's also a variable</span> +<span id="L87" class="LineNr"> 87 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: missing type for 'break' in 'a:bool <- equal break, 0'</span> <span id="L88" class="LineNr"> 88 </span> <span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L90" class="LineNr"> 90 </span>CALL<span class="Delimiter">,</span> <span id="L91" class="LineNr"> 91 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L92" class="LineNr"> 92 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"call"</span><span class="Delimiter">,</span> CALL<span class="Delimiter">);</span> +<span id="L92" class="LineNr"> 92 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"call"</span><span class="Delimiter">,</span> CALL<span class="Delimiter">);</span> <span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L94" class="LineNr"> 94 </span><span class="Normal">case</span> CALL: <span class="Delimiter">{</span> <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> -<span id="L96" class="LineNr"> 96 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'call' requires at least one ingredient (the recipe to call)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L96" class="LineNr"> 96 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'call' requires at least one ingredient (the <a href='010vm.cc.html#L19'>recipe</a> to call)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L97" class="LineNr"> 97 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L98" class="LineNr"> 98 </span> <span class="Delimiter">}</span> <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> -<span id="L100" class="LineNr">100 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'call' should be a recipe, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L100" class="LineNr">100 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'call' should be a <a href='010vm.cc.html#L19'>recipe</a>, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L101" class="LineNr">101 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L102" class="LineNr">102 </span> <span class="Delimiter">}</span> <span id="L103" class="LineNr">103 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -167,14 +167,14 @@ if ('onhashchange' in window) { <span id="L107" class="LineNr">107 </span> <span class="Comment">// Begin Call</span> <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> <span id="L109" class="LineNr">109 </span> ++Trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">;</span> -<span id="L110" class="LineNr">110 </span> trace<span class="Delimiter">(</span><span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"indirect 'call': incrementing callstack depth to "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << end<span class="Delimiter">();</span> +<span id="L110" class="LineNr">110 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"indirect 'call': incrementing callstack depth to "</span> << Trace_stream<span class="Delimiter">-></span>callstack_depth << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L111" class="LineNr">111 </span> assert<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>callstack_depth < <span class="Constant">9000</span><span class="Delimiter">);</span> <span class="Comment">// 9998-101 plus cushion</span> <span id="L112" class="LineNr">112 </span> <span class="Delimiter">}</span> <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> -<span id="L114" class="LineNr">114 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to call empty recipe in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'"</span> << end<span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to call empty <a href='010vm.cc.html#L19'>recipe</a> in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L115" class="LineNr">115 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L116" class="LineNr">116 </span> <span class="Delimiter">}</span> -<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> +<span id="L117" class="LineNr">117 </span> <a href='010vm.cc.html#L32'>instruction</a><span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> call_instruction = current_instruction<span class="Delimiter">();</span> <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> <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> <span id="L120" class="LineNr">120 </span> Current_routine<span class="Delimiter">-></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> @@ -187,7 +187,7 @@ if ('onhashchange' in window) { <span id="L127" class="LineNr">127 </span> <span id="L128" class="LineNr">128 </span><span class="Delimiter">:(scenario call_check_literal_recipe)</span> <span id="L129" class="LineNr">129 </span><span class="Special">% Hide_errors = true;</span> -<span id="L130" class="LineNr">130 </span><span class="muRecipe">def</span> main [ +<span id="L130" class="LineNr">130 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L131" class="LineNr">131 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>call f<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L132" class="LineNr">132 </span>] <span id="L133" class="LineNr">133 </span><span class="muRecipe">def</span> f x:point<span class="muRecipe"> -> </span>y:point [ @@ -195,71 +195,71 @@ if ('onhashchange' in window) { <span id="L135" class="LineNr">135 </span> load-ingredients <span id="L136" class="LineNr">136 </span> y<span class="Special"> <- </span>copy x <span id="L137" class="LineNr">137 </span>] -<span id="L138" class="LineNr">138 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '1:num <- call f, 34'</span> -<span id="L139" class="LineNr">139 </span><span class="traceContains">+error: main: product 0 has the wrong type at '1:num <- call f, 34'</span> +<span id="L138" class="LineNr">138 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: ingredient 0 has the wrong type at '1:num <- call f, 34'</span> +<span id="L139" class="LineNr">139 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product 0 has the wrong type at '1:num <- call f, 34'</span> <span id="L140" class="LineNr">140 </span> <span id="L141" class="LineNr">141 </span><span class="Delimiter">:(scenario call_check_variable_recipe)</span> <span id="L142" class="LineNr">142 </span><span class="Special">% Hide_errors = true;</span> -<span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> main [ -<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"> -> </span>point<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f -<span id="L145" class="LineNr">145 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe point<span class="muRecipe"> -> </span>point<span class="Delimiter">)},</span> <span class="Constant">34</span> +<span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L144" class="LineNr">144 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> point<span class="muRecipe"> -> </span>point<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f +<span id="L145" class="LineNr">145 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> point<span class="muRecipe"> -> </span>point<span class="Delimiter">)},</span> <span class="Constant">34</span> <span id="L146" class="LineNr">146 </span>] <span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> f x:point<span class="muRecipe"> -> </span>y:point [ <span id="L148" class="LineNr">148 </span> local-scope <span id="L149" class="LineNr">149 </span> load-ingredients <span id="L150" class="LineNr">150 </span> y<span class="Special"> <- </span>copy x <span id="L151" class="LineNr">151 </span>] -<span id="L152" class="LineNr">152 </span><span class="traceContains">+error: main: ingredient 0 has the wrong type at '2:num <- call {1: (recipe point -> point)}, 34'</span> -<span id="L153" class="LineNr">153 </span><span class="traceContains">+error: main: product 0 has the wrong type at '2:num <- call {1: (recipe point -> point)}, 34'</span> +<span id="L152" class="LineNr">152 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: ingredient 0 has the wrong type at '2:num <- call {1: (recipe point -> point)}, 34'</span> +<span id="L153" class="LineNr">153 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product 0 has the wrong type at '2:num <- call {1: (recipe point -> point)}, 34'</span> <span id="L154" class="LineNr">154 </span> <span id="L155" class="LineNr">155 </span><span class="Delimiter">:(after "Transform.push_back(check_instruction)")</span> -<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> +<span id="L156" class="LineNr">156 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='071recipe.cc.html#L158'>check_indirect_calls_against_header</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span id="L157" class="LineNr">157 </span><span class="Delimiter">:(code)</span> -<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> -<span id="L159" class="LineNr">159 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- type-check 'call' instructions inside recipe "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << end<span class="Delimiter">();</span> +<span id="L158" class="LineNr">158 </span><span class="Normal">void</span> <a href='071recipe.cc.html#L158'>check_indirect_calls_against_header</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L159" class="LineNr">159 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- type-check 'call' instructions inside <a href='010vm.cc.html#L19'>recipe</a> "</span> << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L160" class="LineNr">160 </span> <span class="Normal">const</span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L162" class="LineNr">162 </span> <span class="Normal">const</span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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> <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> <span id="L165" class="LineNr">165 </span> <span class="Normal">const</span> reagent& 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 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> -<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> +<span id="L167" class="LineNr">167 </span> <span class="Normal">const</span> <a href='010vm.cc.html#L19'>recipe</a> 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> : <a href='071recipe.cc.html#L200'>from_reagent</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> <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> -<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> -<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 < 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 id="L169" class="LineNr">169 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L189'>is_indirect_call_with_ingredients</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><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 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> -<span id="L172" class="LineNr">172 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient "</span> << i-<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span> << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L172" class="LineNr">172 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"ingredient "</span> << i-<span class="Comment">/*</span><span class="Comment">skip callee</span><span class="Comment">*/</span><span class="Constant">1</span> << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L173" class="LineNr">173 </span> <span class="Delimiter">}</span> <span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span> -<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> -<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 < 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 id="L175" class="LineNr">175 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L194'>is_indirect_call_with_products</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><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 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> <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> -<span id="L179" class="LineNr">179 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product "</span> << i << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L179" class="LineNr">179 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"product "</span> << i << <span class="Constant">" has the wrong type at '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L180" class="LineNr">180 </span> <span class="Delimiter">}</span> <span id="L181" class="LineNr">181 </span> <span class="Delimiter">}</span> <span id="L182" class="LineNr">182 </span> <span class="Delimiter">}</span> <span id="L183" class="LineNr">183 </span><span class="Delimiter">}</span> <span id="L184" class="LineNr">184 </span> -<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> -<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> +<span id="L185" class="LineNr">185 </span><span class="Normal">bool</span> <a href='071recipe.cc.html#L185'>is_indirect_call</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L186" class="LineNr">186 </span> <span class="Identifier">return</span> <a href='071recipe.cc.html#L189'>is_indirect_call_with_ingredients</a><span class="Delimiter">(</span>r<span class="Delimiter">)</span> || <a href='071recipe.cc.html#L194'>is_indirect_call_with_products</a><span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span id="L187" class="LineNr">187 </span><span class="Delimiter">}</span> <span id="L188" class="LineNr">188 </span> -<span id="L189" class="LineNr">189 </span><span class="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 id="L189" class="LineNr">189 </span><span class="Normal">bool</span> <a href='071recipe.cc.html#L189'>is_indirect_call_with_ingredients</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L191" class="LineNr">191 </span> <span class="Comment">// End is_indirect_call_with_ingredients Special-cases</span> <span id="L192" class="LineNr">192 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L193" class="LineNr">193 </span><span class="Delimiter">}</span> -<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> +<span id="L194" class="LineNr">194 </span><span class="Normal">bool</span> <a href='071recipe.cc.html#L194'>is_indirect_call_with_products</a><span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L196" class="LineNr">196 </span> <span class="Comment">// End is_indirect_call_with_products Special-cases</span> <span id="L197" class="LineNr">197 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L198" class="LineNr">198 </span><span class="Delimiter">}</span> <span id="L199" class="LineNr">199 </span> -<span id="L200" class="LineNr">200 </span><span class="muRecipe">recipe</span> from_reagent<span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L200" class="LineNr">200 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> <a href='071recipe.cc.html#L200'>from_reagent</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L201" class="LineNr">201 </span> assert<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<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> +<span id="L202" class="LineNr">202 </span> <a href='010vm.cc.html#L19'>recipe</a> result_header<span class="Delimiter">;</span> <span class="Comment">// will contain only ingredients and products, nothing else</span> <span id="L203" class="LineNr">203 </span> result_header<span class="Delimiter">.</span>has_header = <span class="Constant">true</span><span class="Delimiter">;</span> <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">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L205" class="LineNr">205 </span> assert<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name == <span class="Constant">"recipe"</span><span class="Delimiter">);</span> @@ -274,51 +274,51 @@ if ('onhashchange' in window) { <span id="L214" class="LineNr">214 </span> curr = curr<span class="Delimiter">-></span>right<span class="Delimiter">;</span> <span class="Comment">// skip delimiter</span> <span id="L215" class="LineNr">215 </span> <span class="Identifier">goto</span> read_products<span class="Delimiter">;</span> <span id="L216" class="LineNr">216 </span> <span class="Delimiter">}</span> -<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">-></span>left<span class="Delimiter">));</span> +<span id="L217" class="LineNr">217 </span> result_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='071recipe.cc.html#L261'>next_recipe_reagent</a><span class="Delimiter">(</span>curr<span class="Delimiter">-></span>left<span class="Delimiter">));</span> <span id="L218" class="LineNr">218 </span> <span class="Delimiter">}</span> <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> <span id="L220" class="LineNr">220 </span> assert<span class="Delimiter">(</span>curr<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<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> +<span id="L221" class="LineNr">221 </span> result_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='071recipe.cc.html#L261'>next_recipe_reagent</a><span class="Delimiter">(</span>curr<span class="Delimiter">));</span> <span id="L222" class="LineNr">222 </span> <span class="Identifier">return</span> result_header<span class="Delimiter">;</span> <span class="Comment">// no products</span> <span id="L223" class="LineNr">223 </span> <span class="Delimiter">}</span> <span id="L224" class="LineNr">224 </span> <span class="Normal">read_products</span>: <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 && !curr<span class="Delimiter">-></span>atom<span class="Delimiter">;</span> curr = curr<span class="Delimiter">-></span>right<span class="Delimiter">)</span> -<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">-></span>left<span class="Delimiter">));</span> +<span id="L226" class="LineNr">226 </span> result_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='071recipe.cc.html#L261'>next_recipe_reagent</a><span class="Delimiter">(</span>curr<span class="Delimiter">-></span>left<span class="Delimiter">));</span> <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> <span id="L228" class="LineNr">228 </span> assert<span class="Delimiter">(</span>curr<span class="Delimiter">-></span>atom<span class="Delimiter">);</span> -<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> +<span id="L229" class="LineNr">229 </span> result_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='071recipe.cc.html#L261'>next_recipe_reagent</a><span class="Delimiter">(</span>curr<span class="Delimiter">));</span> <span id="L230" class="LineNr">230 </span> <span class="Delimiter">}</span> <span id="L231" class="LineNr">231 </span> <span class="Identifier">return</span> result_header<span class="Delimiter">;</span> <span id="L232" class="LineNr">232 </span><span class="Delimiter">}</span> <span id="L233" class="LineNr">233 </span> <span id="L234" class="LineNr">234 </span><span class="Delimiter">:(before "End Unit Tests")</span> -<span id="L235" class="LineNr">235 </span><span class="Normal">void</span> test_from_reagent_atomic<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L235" class="LineNr">235 </span><span class="Normal">void</span> <a href='071recipe.cc.html#L235'>test_from_reagent_atomic</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L236" class="LineNr">236 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"{f: recipe}"</span><span class="Delimiter">);</span> -<span id="L237" class="LineNr">237 </span> recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span> -<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> -<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> +<span id="L237" class="LineNr">237 </span> <a href='010vm.cc.html#L19'>recipe</a> r_header = <a href='071recipe.cc.html#L200'>from_reagent</a><span class="Delimiter">(</span>a<span class="Delimiter">);</span> +<span id="L238" class="LineNr">238 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> +<span id="L239" class="LineNr">239 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span> -<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> +<span id="L241" class="LineNr">241 </span><span class="Normal">void</span> <a href='071recipe.cc.html#L241'>test_from_reagent_non_atomic</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L242" class="LineNr">242 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"{f: (recipe number -> number)}"</span><span class="Delimiter">);</span> -<span id="L243" class="LineNr">243 </span> recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span> -<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> -<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> +<span id="L243" class="LineNr">243 </span> <a href='010vm.cc.html#L19'>recipe</a> r_header = <a href='071recipe.cc.html#L200'>from_reagent</a><span class="Delimiter">(</span>a<span class="Delimiter">);</span> +<span id="L244" class="LineNr">244 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L245" class="LineNr">245 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L246" class="LineNr">246 </span><span class="Delimiter">}</span> -<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> +<span id="L247" class="LineNr">247 </span><span class="Normal">void</span> <a href='071recipe.cc.html#L247'>test_from_reagent_reads_ingredient_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L248" class="LineNr">248 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"{f: (recipe number number)}"</span><span class="Delimiter">);</span> -<span id="L249" class="LineNr">249 </span> recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span> -<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> -<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> +<span id="L249" class="LineNr">249 </span> <a href='010vm.cc.html#L19'>recipe</a> r_header = <a href='071recipe.cc.html#L200'>from_reagent</a><span class="Delimiter">(</span>a<span class="Delimiter">);</span> +<span id="L250" class="LineNr">250 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L251" class="LineNr">251 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L252" class="LineNr">252 </span><span class="Delimiter">}</span> -<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> +<span id="L253" class="LineNr">253 </span><span class="Normal">void</span> <a href='071recipe.cc.html#L253'>test_from_reagent_reads_sole_ingredient_at_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L254" class="LineNr">254 </span> reagent a<span class="Delimiter">(</span><span class="Constant">"{f: (recipe number)}"</span><span class="Delimiter">);</span> -<span id="L255" class="LineNr">255 </span> recipe r_header = from_reagent<span class="Delimiter">(</span>a<span class="Delimiter">);</span> -<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> -<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> +<span id="L255" class="LineNr">255 </span> <a href='010vm.cc.html#L19'>recipe</a> r_header = <a href='071recipe.cc.html#L200'>from_reagent</a><span class="Delimiter">(</span>a<span class="Delimiter">);</span> +<span id="L256" class="LineNr">256 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L257" class="LineNr">257 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>r_header<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L258" class="LineNr">258 </span><span class="Delimiter">}</span> <span id="L259" class="LineNr">259 </span> <span id="L260" class="LineNr">260 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L261" class="LineNr">261 </span>reagent <a href='071recipe.cc.html#L261'>next_recipe_reagent</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L262" class="LineNr">262 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">-></span>left<span class="Delimiter">)</span> <span class="Identifier">return</span> reagent<span class="Delimiter">(</span><span class="Constant">"recipe:"</span>+curr<span class="Delimiter">-></span>name<span class="Delimiter">);</span> <span id="L263" class="LineNr">263 </span> reagent result<span class="Delimiter">;</span> <span id="L264" class="LineNr">264 </span> result<span class="Delimiter">.</span>name = <span class="Constant">"recipe"</span><span class="Delimiter">;</span> @@ -326,7 +326,7 @@ if ('onhashchange' in window) { <span id="L266" class="LineNr">266 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L267" class="LineNr">267 </span><span class="Delimiter">}</span> <span id="L268" class="LineNr">268 </span> -<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& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L269" class="LineNr">269 </span><span class="Normal">bool</span> <a href='071recipe.cc.html#L269'>is_mu_recipe</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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">-></span>atom<span class="Delimiter">)</span> <span id="L272" class="LineNr">272 </span> <span class="Identifier">return</span> r<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name == <span class="Constant">"recipe-literal"</span><span class="Delimiter">;</span> @@ -337,43 +337,43 @@ if ('onhashchange' in window) { <span id="L277" class="LineNr">277 </span> <span id="L278" class="LineNr">278 </span><span class="Delimiter">:(scenario copy_typecheck_recipe_variable)</span> <span id="L279" class="LineNr">279 </span><span class="Special">% Hide_errors = true;</span> -<span id="L280" class="LineNr">280 </span><span class="muRecipe">def</span> main [ +<span id="L280" class="LineNr">280 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L281" class="LineNr">281 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span class="Comment"># abc def</span> -<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"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f <span class="Comment"># store literal in a matching variable</span> -<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"> -> </span>boolean<span class="Delimiter">)}</span><span class="Special"> <- </span>copy <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span>recipe number<span class="muRecipe"> -> </span>number<span class="Delimiter">)}</span> <span class="Comment"># mismatch between recipe variables</span> +<span id="L282" class="LineNr">282 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> number<span class="muRecipe"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f <span class="Comment"># store literal in a matching variable</span> +<span id="L283" class="LineNr">283 </span> <span class="Delimiter">{</span><span class="Constant">2</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> boolean<span class="muRecipe"> -> </span>boolean<span class="Delimiter">)}</span><span class="Special"> <- </span>copy <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> number<span class="muRecipe"> -> </span>number<span class="Delimiter">)}</span> <span class="Comment"># mismatch between recipe variables</span> <span id="L284" class="LineNr">284 </span>] <span id="L285" class="LineNr">285 </span><span class="muRecipe">def</span> f x:num<span class="muRecipe"> -> </span>y:num [ <span id="L286" class="LineNr">286 </span> local-scope <span id="L287" class="LineNr">287 </span> load-ingredients <span id="L288" class="LineNr">288 </span> y<span class="Special"> <- </span>copy x <span id="L289" class="LineNr">289 </span>] -<span id="L290" class="LineNr">290 </span><span class="traceContains">+error: main: can't copy '{1: (recipe number -> number)}' to '{2: (recipe boolean -> boolean)}'; types don't match</span> +<span id="L290" class="LineNr">290 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: can't copy '{1: (recipe number -> number)}' to '{2: (recipe boolean -> boolean)}'; types don't match</span> <span id="L291" class="LineNr">291 </span> <span id="L292" class="LineNr">292 </span><span class="Delimiter">:(scenario copy_typecheck_recipe_variable_2)</span> <span id="L293" class="LineNr">293 </span><span class="Special">% Hide_errors = true;</span> -<span id="L294" class="LineNr">294 </span><span class="muRecipe">def</span> main [ -<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"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f <span class="Comment"># mismatch with a recipe literal</span> +<span id="L294" class="LineNr">294 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L295" class="LineNr">295 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> number<span class="muRecipe"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f <span class="Comment"># mismatch with a recipe literal</span> <span id="L296" class="LineNr">296 </span>] <span id="L297" class="LineNr">297 </span><span class="muRecipe">def</span> f x:<span class="Normal">bool</span><span class="muRecipe"> -> </span>y:<span class="Normal">bool</span> [ <span id="L298" class="LineNr">298 </span> local-scope <span id="L299" class="LineNr">299 </span> load-ingredients <span id="L300" class="LineNr">300 </span> y<span class="Special"> <- </span>copy x <span id="L301" class="LineNr">301 </span>] -<span id="L302" class="LineNr">302 </span><span class="traceContains">+error: main: can't copy 'f' to '{1: (recipe number -> number)}'; types don't match</span> +<span id="L302" class="LineNr">302 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: can't copy 'f' to '{1: (recipe number -> number)}'; types don't match</span> <span id="L303" class="LineNr">303 </span> <span id="L304" class="LineNr">304 </span><span class="Delimiter">:(before "End Matching Types For Literal(to)")</span> -<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> +<span id="L305" class="LineNr">305 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L269'>is_mu_recipe</a><span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span class="Delimiter">{</span> <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> -<span id="L307" class="LineNr">307 </span> raise << <span class="Constant">"trying to store recipe "</span> << from<span class="Delimiter">.</span>name << <span class="Constant">" into "</span> << to_string<span class="Delimiter">(</span>to<span class="Delimiter">)</span> << <span class="Constant">" but there's no such recipe</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L307" class="LineNr">307 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"trying to store <a href='010vm.cc.html#L19'>recipe</a> "</span> << from<span class="Delimiter">.</span>name << <span class="Constant">" into "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>to<span class="Delimiter">)</span> << <span class="Constant">" but there's no such recipe</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L308" class="LineNr">308 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L309" class="LineNr">309 </span> <span class="Delimiter">}</span> <span id="L310" class="LineNr">310 </span> <span class="Normal">const</span> recipe& rrhs = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> from<span class="Delimiter">.</span>value<span class="Delimiter">);</span> -<span id="L311" class="LineNr">311 </span> <span class="Normal">const</span> recipe& rlhs = from_reagent<span class="Delimiter">(</span>to<span class="Delimiter">);</span> -<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 < 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 id="L311" class="LineNr">311 </span> <span class="Normal">const</span> recipe& rlhs = <a href='071recipe.cc.html#L200'>from_reagent</a><span class="Delimiter">(</span>to<span class="Delimiter">);</span> +<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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>rrhs<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L314" class="LineNr">314 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L315" class="LineNr">315 </span> <span class="Delimiter">}</span> -<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 < 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 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 < min<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>rlhs<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>rrhs<span class="Delimiter">.</span>products<span class="Delimiter">));</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L318" class="LineNr">318 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L319" class="LineNr">319 </span> <span class="Delimiter">}</span> @@ -381,10 +381,10 @@ if ('onhashchange' in window) { <span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span> <span id="L322" class="LineNr">322 </span> <span id="L323" class="LineNr">323 </span><span class="Delimiter">:(scenario call_variable_compound_ingredient)</span> -<span id="L324" class="LineNr">324 </span><span class="muRecipe">def</span> main [ -<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"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f +<span id="L324" class="LineNr">324 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L325" class="LineNr">325 </span> <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span><span class="muRecipe"> -> </span>number<span class="Delimiter">)}</span><span class="Special"> <- </span>copy f <span id="L326" class="LineNr">326 </span> <span class="Constant">2</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L327" class="LineNr">327 </span> <span class="Constant">3</span>:num<span class="Special"> <- </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"> -> </span>number<span class="Delimiter">)},</span> <span class="Constant">2</span>:&:num +<span id="L327" class="LineNr">327 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>call <span class="Delimiter">{</span><span class="Constant">1</span>: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> number<span class="Delimiter">)</span><span class="muRecipe"> -> </span>number<span class="Delimiter">)},</span> <span class="Constant">2</span>:&:num <span id="L328" class="LineNr">328 </span>] <span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> f x:&:num<span class="muRecipe"> -> </span>y:num [ <span id="L330" class="LineNr">330 </span> local-scope @@ -399,33 +399,33 @@ if ('onhashchange' in window) { <span id="L339" class="LineNr">339 </span><span class="muRecipe">def</span> foo [ <span id="L340" class="LineNr">340 </span> local-scope <span id="L341" class="LineNr">341 </span>] -<span id="L342" class="LineNr">342 </span><span class="muRecipe">def</span> main [ +<span id="L342" class="LineNr">342 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L343" class="LineNr">343 </span> local-scope <span id="L344" class="LineNr">344 </span> <span class="Delimiter">{</span> <span id="L345" class="LineNr">345 </span> <span class="Identifier">break</span>-<span class="Normal">if</span> foo <span id="L346" class="LineNr">346 </span> <span class="Delimiter">}</span> <span id="L347" class="LineNr">347 </span>] <span id="L348" class="LineNr">348 </span><span class="Comment"># error should be as if foo is not a recipe</span> -<span id="L349" class="LineNr">349 </span><span class="traceContains">+error: main: missing type for 'foo' in 'break-if foo'</span> +<span id="L349" class="LineNr">349 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: missing type for 'foo' in 'break-if foo'</span> <span id="L350" class="LineNr">350 </span> <span id="L351" class="LineNr">351 </span><span class="Delimiter">:(before "End JUMP_IF Checks")</span> -<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> +<span id="L352" class="LineNr">352 </span><a href='071recipe.cc.html#L356'>check_for_recipe_literals</a><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 id="L353" class="LineNr">353 </span><span class="Delimiter">:(before "End JUMP_UNLESS Checks")</span> -<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> +<span id="L354" class="LineNr">354 </span><a href='071recipe.cc.html#L356'>check_for_recipe_literals</a><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 id="L355" class="LineNr">355 </span><span class="Delimiter">:(code)</span> -<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& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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 < 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 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> -<span id="L359" class="LineNr">359 </span> raise << maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"missing type for '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L356" class="LineNr">356 </span><span class="Normal">void</span> <a href='071recipe.cc.html#L356'>check_for_recipe_literals</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L358" class="LineNr">358 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='071recipe.cc.html#L269'>is_mu_recipe</a><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 id="L359" class="LineNr">359 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> << <span class="Constant">"missing type for '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>original_string << <span class="Constant">"' in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="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> -<span id="L361" class="LineNr">361 </span> raise << <span class="Constant">" did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L361" class="LineNr">361 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" did you forget 'load-ingredients'?</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L362" class="LineNr">362 </span> <span class="Delimiter">}</span> <span id="L363" class="LineNr">363 </span> <span class="Delimiter">}</span> <span id="L364" class="LineNr">364 </span><span class="Delimiter">}</span> <span id="L365" class="LineNr">365 </span> <span id="L366" class="LineNr">366 </span><span class="Delimiter">:(scenario load_ingredients_missing_error_3)</span> <span id="L367" class="LineNr">367 </span><span class="Special">% Hide_errors = true;</span> -<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"> -> </span>num<span class="Delimiter">)}</span> [ +<span id="L368" class="LineNr">368 </span><span class="muRecipe">def</span> foo <span class="Delimiter">{</span>f: <span class="Delimiter">(</span><a href='010vm.cc.html#L19'>recipe</a> num<span class="muRecipe"> -> </span>num<span class="Delimiter">)}</span> [ <span id="L369" class="LineNr">369 </span> local-scope <span id="L370" class="LineNr">370 </span> <span class="Normal">b</span>:num<span class="Special"> <- </span>call f<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L371" class="LineNr">371 </span>] diff --git a/html/072scheduler.cc.html b/html/072scheduler.cc.html index 746d808c..811770b5 100644 --- a/html/072scheduler.cc.html +++ b/html/072scheduler.cc.html @@ -86,9 +86,9 @@ if ('onhashchange' in window) { <span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before "Running One Instruction")</span> <span id="L26" class="LineNr"> 26 </span> ++Current_routine<span class="Delimiter">-></span>instructions_run_this_scheduling_slice<span class="Delimiter">;</span> <span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(replace{} "bool should_continue_running(const routine* current_routine)")</span> -<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> +<span id="L28" class="LineNr"> 28 </span><span class="Normal">bool</span> <a href='072scheduler.cc.html#L28'>should_continue_running</a><span class="Delimiter">(</span><span class="Normal">const</span> routine* current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L30" class="LineNr"> 30 </span> <span class="Identifier">return</span> Current_routine<span class="Delimiter">-></span>state == RUNNING +<span id="L30" class="LineNr"> 30 </span> <span class="Identifier">return</span> Current_routine<span class="Delimiter">-></span>state == <a href='072scheduler.cc.html#L41'>RUNNING</a> <span id="L31" class="LineNr"> 31 </span> && Current_routine<span class="Delimiter">-></span>instructions_run_this_scheduling_slice < Scheduling_interval<span class="Delimiter">;</span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">}</span> <span id="L33" class="LineNr"> 33 </span><span class="Delimiter">:(after "stop_running_current_routine:")</span> @@ -98,24 +98,24 @@ if ('onhashchange' in window) { <span id="L37" class="LineNr"> 37 </span><span class="Comment">//: now the rest of the scheduler is clean</span> <span id="L38" class="LineNr"> 38 </span> <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before "struct routine")</span> -<span id="L40" class="LineNr"> 40 </span><span class="Normal">enum</span> routine_state <span class="Delimiter">{</span> -<span id="L41" class="LineNr"> 41 </span> RUNNING<span class="Delimiter">,</span> -<span id="L42" class="LineNr"> 42 </span> COMPLETED<span class="Delimiter">,</span> +<span id="L40" class="LineNr"> 40 </span><span class="Normal">enum</span> <a href='072scheduler.cc.html#L40'>routine_state</a> <span class="Delimiter">{</span> +<span id="L41" class="LineNr"> 41 </span> <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">,</span> +<span id="L42" class="LineNr"> 42 </span> <a href='072scheduler.cc.html#L42'>COMPLETED</a><span class="Delimiter">,</span> <span id="L43" class="LineNr"> 43 </span> <span class="Comment">// End routine States</span> <span id="L44" class="LineNr"> 44 </span><span class="Delimiter">};</span> <span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(before "End routine Fields")</span> -<span id="L46" class="LineNr"> 46 </span><span class="Normal">enum</span> routine_state state<span class="Delimiter">;</span> +<span id="L46" class="LineNr"> 46 </span><span class="Normal">enum</span> <a href='072scheduler.cc.html#L40'>routine_state</a> state<span class="Delimiter">;</span> <span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(before "End routine Constructor")</span> -<span id="L48" class="LineNr"> 48 </span>state = RUNNING<span class="Delimiter">;</span> +<span id="L48" class="LineNr"> 48 </span>state = <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">;</span> <span id="L49" class="LineNr"> 49 </span> <span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L51" class="LineNr"> 51 </span>vector<routine*> Routines<span class="Delimiter">;</span> <span id="L52" class="LineNr"> 52 </span><span class="Normal">int</span> Current_routine_index = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before "End Setup")</span> <span id="L54" class="LineNr"> 54 </span>Scheduling_interval = <span class="Constant">500</span><span class="Delimiter">;</span> -<span id="L55" class="LineNr"> 55 </span>Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(replace{} "void run(const recipe_ordinal r)")</span> -<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> +<span id="L55" class="LineNr"> 55 </span>Routines<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(replace{} "void run(const <a href='010vm.cc.html#L14'>recipe_ordinal</a> r)")</span> +<span id="L57" class="LineNr"> 57 </span><span class="Normal">void</span> run<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> <span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span> <span id="L60" class="LineNr"> 60 </span> @@ -124,14 +124,14 @@ if ('onhashchange' in window) { <span id="L63" class="LineNr"> 63 </span> Routines<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>rr<span class="Delimiter">);</span> <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> <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> -<span id="L66" class="LineNr"> 66 </span> skip_to_next_routine<span class="Delimiter">();</span> +<span id="L66" class="LineNr"> 66 </span> <a href='072scheduler.cc.html#L91'>skip_to_next_routine</a><span class="Delimiter">();</span> <span id="L67" class="LineNr"> 67 </span> assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span> -<span id="L68" class="LineNr"> 68 </span> assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>state == RUNNING<span class="Delimiter">);</span> -<span id="L69" class="LineNr"> 69 </span> trace<span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << current_routine_label<span class="Delimiter">()</span> << end<span class="Delimiter">();</span> +<span id="L68" class="LineNr"> 68 </span> assert<span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>state == <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">);</span> +<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9990</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <a href='072scheduler.cc.html#L103'>current_routine_label</a><span class="Delimiter">()</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L70" class="LineNr"> 70 </span> run_current_routine<span class="Delimiter">();</span> <span id="L71" class="LineNr"> 71 </span> <span class="Comment">// Scheduler State Transitions</span> <span id="L72" class="LineNr"> 72 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>completed<span class="Delimiter">())</span> -<span id="L73" class="LineNr"> 73 </span> Current_routine<span class="Delimiter">-></span>state = COMPLETED<span class="Delimiter">;</span> +<span id="L73" class="LineNr"> 73 </span> Current_routine<span class="Delimiter">-></span>state = <a href='072scheduler.cc.html#L42'>COMPLETED</a><span class="Delimiter">;</span> <span id="L74" class="LineNr"> 74 </span> <span class="Comment">// End Scheduler State Transitions</span> <span id="L75" class="LineNr"> 75 </span> <span id="L76" class="LineNr"> 76 </span> <span class="Comment">// Scheduler Cleanup</span> @@ -140,20 +140,20 @@ if ('onhashchange' in window) { <span id="L79" class="LineNr"> 79 </span> <span class="Comment">// End Run Routine</span> <span id="L80" class="LineNr"> 80 </span><span class="Delimiter">}</span> <span id="L81" class="LineNr"> 81 </span> -<span id="L82" class="LineNr"> 82 </span><span class="Normal">bool</span> all_routines_done<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">)-></span>state == RUNNING<span class="Delimiter">)</span> +<span id="L82" class="LineNr"> 82 </span><span class="Normal">bool</span> <a href='072scheduler.cc.html#L82'>all_routines_done</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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">)-></span>state == <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">)</span> <span id="L85" class="LineNr"> 85 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">}</span> <span id="L87" class="LineNr"> 87 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span> <span id="L89" class="LineNr"> 89 </span> <span id="L90" class="LineNr"> 90 </span><span class="Comment">// skip Current_routine_index past non-RUNNING routines</span> -<span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> skip_to_next_routine<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L91" class="LineNr"> 91 </span><span class="Normal">void</span> <a href='072scheduler.cc.html#L91'>skip_to_next_routine</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L92" class="LineNr"> 92 </span> assert<span class="Delimiter">(</span>!Routines<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> -<span id="L93" class="LineNr"> 93 </span> assert<span class="Delimiter">(</span>Current_routine_index < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">));</span> +<span id="L93" class="LineNr"> 93 </span> assert<span class="Delimiter">(</span>Current_routine_index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">));</span> <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> -<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">)-></span>state == RUNNING<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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">)-></span>state == <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L96" class="LineNr"> 96 </span> Current_routine_index = i<span class="Delimiter">;</span> <span id="L97" class="LineNr"> 97 </span> Current_routine = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L98" class="LineNr"> 98 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> @@ -161,14 +161,14 @@ if ('onhashchange' in window) { <span id="L100" class="LineNr">100 </span> <span class="Delimiter">}</span> <span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span> <span id="L102" class="LineNr">102 </span> -<span id="L103" class="LineNr">103 </span>string current_routine_label<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L104" class="LineNr">104 </span> <span class="Identifier">return</span> routine_label<span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span> +<span id="L103" class="LineNr">103 </span>string <a href='072scheduler.cc.html#L103'>current_routine_label</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L104" class="LineNr">104 </span> <span class="Identifier">return</span> <a href='072scheduler.cc.html#L107'>routine_label</a><span class="Delimiter">(</span>Current_routine<span class="Delimiter">);</span> <span id="L105" class="LineNr">105 </span><span class="Delimiter">}</span> <span id="L106" class="LineNr">106 </span> -<span id="L107" class="LineNr">107 </span>string routine_label<span class="Delimiter">(</span>routine* r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L107" class="LineNr">107 </span>string <a href='072scheduler.cc.html#L107'>routine_label</a><span class="Delimiter">(</span>routine* r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L108" class="LineNr">108 </span> ostringstream result<span class="Delimiter">;</span> <span id="L109" class="LineNr">109 </span> <span class="Normal">const</span> call_stack& calls = r<span class="Delimiter">-></span>calls<span class="Delimiter">;</span> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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 << <span class="Constant">'/'</span><span class="Delimiter">;</span> <span id="L112" class="LineNr">112 </span> result << get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> p<span class="Delimiter">-></span>running_recipe<span class="Delimiter">).</span>name<span class="Delimiter">;</span> <span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span> @@ -176,15 +176,15 @@ if ('onhashchange' in window) { <span id="L115" class="LineNr">115 </span><span class="Delimiter">}</span> <span id="L116" class="LineNr">116 </span> <span id="L117" class="LineNr">117 </span><span class="Delimiter">:(before "End Teardown")</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <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> -<span id="L120" class="LineNr">120 </span>Routines<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L120" class="LineNr">120 </span>Routines<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L121" class="LineNr">121 </span>Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L122" class="LineNr">122 </span> <span id="L123" class="LineNr">123 </span><span class="Comment">//: special case for the very first routine</span> <span id="L124" class="LineNr">124 </span><span class="Delimiter">:(replace{} "void run_main(int argc, char* argv[])")</span> -<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> -<span id="L126" class="LineNr">126 </span> recipe_ordinal r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">);</span> +<span id="L125" class="LineNr">125 </span><span class="Normal">void</span> <a href='072scheduler.cc.html#L125'>run_main</a><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> +<span id="L126" class="LineNr">126 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r = get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"main"</span><span class="Delimiter">);</span> <span id="L127" class="LineNr">127 </span> assert<span class="Delimiter">(</span>r<span class="Delimiter">);</span> <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> <span id="L129" class="LineNr">129 </span> <span class="Comment">// pass in commandline args as ingredients to main</span> @@ -192,9 +192,9 @@ if ('onhashchange' in window) { <span id="L131" class="LineNr">131 </span> Current_routine = main_routine<span class="Delimiter">;</span> <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 < argc<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L133" class="LineNr">133 </span> vector<<span class="Normal">double</span>> arg<span class="Delimiter">;</span> -<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> +<span id="L134" class="LineNr">134 </span> arg<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>argv[i]<span class="Delimiter">));</span> <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> -<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> +<span id="L136" class="LineNr">136 </span> <a href='001help.cc.html#L218'>put</a><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> <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> <span id="L138" class="LineNr">138 </span> <span class="Delimiter">}</span> <span id="L139" class="LineNr">139 </span> run<span class="Delimiter">(</span>main_routine<span class="Delimiter">);</span> @@ -224,15 +224,15 @@ if ('onhashchange' in window) { <span id="L163" class="LineNr">163 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L164" class="LineNr">164 </span>START_RUNNING<span class="Delimiter">,</span> <span id="L165" class="LineNr">165 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L166" class="LineNr">166 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"start-running"</span><span class="Delimiter">,</span> START_RUNNING<span class="Delimiter">);</span> +<span id="L166" class="LineNr">166 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"start-running"</span><span class="Delimiter">,</span> START_RUNNING<span class="Delimiter">);</span> <span id="L167" class="LineNr">167 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L168" class="LineNr">168 </span><span class="Normal">case</span> START_RUNNING: <span class="Delimiter">{</span> <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> -<span id="L170" class="LineNr">170 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'start-running' requires at least one ingredient: the recipe to start running</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L170" class="LineNr">170 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'start-running' requires at least one ingredient: the <a href='010vm.cc.html#L19'>recipe</a> to start running</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L171" class="LineNr">171 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L172" class="LineNr">172 </span> <span class="Delimiter">}</span> <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> -<span id="L174" class="LineNr">174 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'start-running' should be a recipe, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'start-running' should be a <a href='010vm.cc.html#L19'>recipe</a>, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L175" class="LineNr">175 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L176" class="LineNr">176 </span> <span class="Delimiter">}</span> <span id="L177" class="LineNr">177 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -242,7 +242,7 @@ if ('onhashchange' in window) { <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> <span id="L182" class="LineNr">182 </span> new_routine<span class="Delimiter">-></span>parent_index = Current_routine_index<span class="Delimiter">;</span> <span id="L183" class="LineNr">183 </span> <span class="Comment">// populate ingredients</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><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 id="L185" class="LineNr">185 </span> new_routine<span class="Delimiter">-></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> <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> <span id="L187" class="LineNr">187 </span> canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span> @@ -314,14 +314,14 @@ if ('onhashchange' in window) { <span id="L253" class="LineNr">253 </span><span class="traceContains">+error: f1: ingredient 0 has the wrong type at 'start-running f2, 3'</span> <span id="L254" class="LineNr">254 </span> <span id="L255" class="LineNr">255 </span><span class="Comment">// 'start-running' only uses the ingredients of the callee, not its products</span> -<span id="L256" class="LineNr">256 </span><span class="Delimiter">:(before "End is_indirect_call_with_ingredients Special-cases")</span> +<span id="L256" class="LineNr">256 </span><span class="Delimiter">:(before "End <a href='071recipe.cc.html#L189'>is_indirect_call_with_ingredients</a> Special-cases")</span> <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> <span id="L258" class="LineNr">258 </span> <span id="L259" class="LineNr">259 </span><span class="Comment">//: more complex: refcounting management when starting up new routines</span> <span id="L260" class="LineNr">260 </span> <span id="L261" class="LineNr">261 </span><span class="Delimiter">:(scenario start_running_immediately_updates_refcounts_of_ingredients)</span> <span id="L262" class="LineNr">262 </span><span class="Special">% Scheduling_interval = 1;</span> -<span id="L263" class="LineNr">263 </span><span class="muRecipe">def</span> main [ +<span id="L263" class="LineNr">263 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L264" class="LineNr">264 </span> local-scope <span id="L265" class="LineNr">265 </span> create-<span class="Normal">new</span>-routine <span id="L266" class="LineNr">266 </span> <span class="Comment"># padding to make sure we run new-routine before returning</span> @@ -347,12 +347,12 @@ if ('onhashchange' in window) { <span id="L286" class="LineNr">286 </span><span class="Comment">//: ingredients right at call time, and stop incrementing refcounts inside</span> <span id="L287" class="LineNr">287 </span><span class="Comment">//: next-ingredient</span> <span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before "End Populate Call Ingredient")</span> -<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> +<span id="L289" class="LineNr">289 </span><a href='036refcount.cc.html#L34'>increment_any_refcounts</a><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 id="L290" class="LineNr">290 </span><span class="Delimiter">:(before "End Populate start-running Ingredient")</span> -<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> -<span id="L292" class="LineNr">292 </span><span class="Delimiter">:(before "End should_update_refcounts_in_write_memory Special-cases For Primitives")</span> +<span id="L291" class="LineNr">291 </span><a href='036refcount.cc.html#L34'>increment_any_refcounts</a><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 id="L292" class="LineNr">292 </span><span class="Delimiter">:(before "End <a href='043space.cc.html#L285'>should_update_refcounts_in_write_memory</a> Special-cases For Primitives")</span> <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> -<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> > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L294" class="LineNr">294 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='044space_surround.cc.html#L52'>space_index</a><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">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <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">"raw"</span><span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L296" class="LineNr">296 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L297" class="LineNr">297 </span><span class="Delimiter">}</span> @@ -360,7 +360,7 @@ if ('onhashchange' in window) { <span id="L299" class="LineNr">299 </span><span class="Comment">// ensure this works with indirect calls using 'call' as well</span> <span id="L300" class="LineNr">300 </span><span class="Delimiter">:(scenario start_running_immediately_updates_refcounts_of_ingredients_of_indirect_calls)</span> <span id="L301" class="LineNr">301 </span><span class="Special">% Scheduling_interval = 1;</span> -<span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> main [ +<span id="L302" class="LineNr">302 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L303" class="LineNr">303 </span> local-scope <span id="L304" class="LineNr">304 </span> <span class="Normal">n</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L305" class="LineNr">305 </span> *n<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -387,7 +387,7 @@ if ('onhashchange' in window) { <span id="L326" class="LineNr">326 </span> <span class="Normal">n2</span>:num<span class="Special"> <- </span>add *n/space:<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L327" class="LineNr">327 </span> <span class="Identifier">return</span> n2 <span id="L328" class="LineNr">328 </span>] -<span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> main [ +<span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L330" class="LineNr">330 </span> local-scope <span id="L331" class="LineNr">331 </span> <span class="Normal">n</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">12000</span>/unsafe <span class="Comment"># pretend allocation with a known address</span> <span id="L332" class="LineNr">332 </span> *n<span class="Special"> <- </span>copy <span class="Constant">23</span> @@ -413,8 +413,8 @@ if ('onhashchange' in window) { <span id="L352" class="LineNr">352 </span><span class="Comment">//: this scenario will require some careful setup in escaped C++</span> <span id="L353" class="LineNr">353 </span><span class="Comment">//: (straining our tangle capabilities to near-breaking point)</span> <span id="L354" class="LineNr">354 </span><span class="Delimiter">:(scenario scheduler_skips_completed_routines)</span> -<span id="L355" class="LineNr">355 </span><span class="Special">% recipe_ordinal f1 = load("recipe f1 [\n1:num <- copy 0\n]\n").front();</span> -<span id="L356" class="LineNr">356 </span><span class="Special">% recipe_ordinal f2 = load("recipe f2 [\n2:num <- copy 0\n]\n").front();</span> +<span id="L355" class="LineNr">355 </span><span class="Special">% <a href='010vm.cc.html#L14'>recipe_ordinal</a> f1 = load("recipe f1 [\n1:num <- copy 0\n]\n").front();</span> +<span id="L356" class="LineNr">356 </span><span class="Special">% <a href='010vm.cc.html#L14'>recipe_ordinal</a> f2 = load("recipe f2 [\n2:num <- copy 0\n]\n").front();</span> <span id="L357" class="LineNr">357 </span><span class="Special">% Routines.push_back(new routine(f1)); // f1 meant to run</span> <span id="L358" class="LineNr">358 </span><span class="Special">% Routines.push_back(new routine(f2));</span> <span id="L359" class="LineNr">359 </span><span class="Special">% Routines.back()->state = COMPLETED; // f2 not meant to run</span> @@ -459,15 +459,15 @@ if ('onhashchange' in window) { <span id="L398" class="LineNr">398 </span><span class="traceContains">+error: f2: divide by zero in '3:num <- divide-with-remainder 4, 0'</span> <span id="L399" class="LineNr">399 </span><span class="traceAbsent">-error: f2: divide by zero in '4:num <- divide-with-remainder 4, 0'</span> <span id="L400" class="LineNr">400 </span> -<span id="L401" class="LineNr">401 </span><span class="Delimiter">:(after "operator<<(ostream& os, unused end)")</span> +<span id="L401" class="LineNr">401 </span><span class="Delimiter">:(after "operator<<(ostream& os, <a href='001help.cc.html#L255'>unused</a> end)")</span> <span id="L402" class="LineNr">402 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream && Trace_stream<span class="Delimiter">-></span>curr_label == <span class="Constant">"error"</span> && Current_routine<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L403" class="LineNr">403 </span> Current_routine<span class="Delimiter">-></span>state = COMPLETED<span class="Delimiter">;</span> +<span id="L403" class="LineNr">403 </span> Current_routine<span class="Delimiter">-></span>state = <a href='072scheduler.cc.html#L42'>COMPLETED</a><span class="Delimiter">;</span> <span id="L404" class="LineNr">404 </span> <span class="Delimiter">}</span> <span id="L405" class="LineNr">405 </span> <span id="L406" class="LineNr">406 </span><span class="SalientComment">//:: Routines are marked completed when their parent completes.</span> <span id="L407" class="LineNr">407 </span> <span id="L408" class="LineNr">408 </span><span class="Delimiter">:(scenario scheduler_kills_orphans)</span> -<span id="L409" class="LineNr">409 </span><span class="muRecipe">def</span> main [ +<span id="L409" class="LineNr">409 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L410" class="LineNr">410 </span> start-running f1 <span id="L411" class="LineNr">411 </span> <span class="Comment"># f1 never actually runs because its parent completes without waiting for it</span> <span id="L412" class="LineNr">412 </span>] @@ -477,19 +477,19 @@ if ('onhashchange' in window) { <span id="L416" class="LineNr">416 </span><span class="traceAbsent">-schedule: f1</span> <span id="L417" class="LineNr">417 </span> <span id="L418" class="LineNr">418 </span><span class="Delimiter">:(before "End Scheduler Cleanup")</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">)-></span>state == COMPLETED<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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">)-></span>state == <a href='072scheduler.cc.html#L42'>COMPLETED</a><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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">)-></span>parent_index < <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 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> <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> -<span id="L424" class="LineNr">424 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = COMPLETED<span class="Delimiter">;</span> +<span id="L424" class="LineNr">424 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = <a href='072scheduler.cc.html#L42'>COMPLETED</a><span class="Delimiter">;</span> <span id="L425" class="LineNr">425 </span> <span class="Delimiter">}</span> <span id="L426" class="LineNr">426 </span><span class="Delimiter">}</span> <span id="L427" class="LineNr">427 </span> <span id="L428" class="LineNr">428 </span><span class="Delimiter">:(code)</span> <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> <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 >= <span class="Constant">0</span><span class="Delimiter">;</span> j = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">)-></span>parent_index<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">)-></span>state == COMPLETED<span class="Delimiter">)</span> +<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">)-></span>state == <a href='072scheduler.cc.html#L42'>COMPLETED</a><span class="Delimiter">)</span> <span id="L432" class="LineNr">432 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L433" class="LineNr">433 </span> <span class="Delimiter">}</span> <span id="L434" class="LineNr">434 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> @@ -515,15 +515,15 @@ if ('onhashchange' in window) { <span id="L454" class="LineNr">454 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L455" class="LineNr">455 </span>ROUTINE_STATE<span class="Delimiter">,</span> <span id="L456" class="LineNr">456 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L457" class="LineNr">457 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"routine-state"</span><span class="Delimiter">,</span> ROUTINE_STATE<span class="Delimiter">);</span> +<span id="L457" class="LineNr">457 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"routine-state"</span><span class="Delimiter">,</span> ROUTINE_STATE<span class="Delimiter">);</span> <span id="L458" class="LineNr">458 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L459" class="LineNr">459 </span><span class="Normal">case</span> ROUTINE_STATE: <span class="Delimiter">{</span> -<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> -<span id="L461" class="LineNr">461 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'routine-state' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L460" class="LineNr">460 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L461" class="LineNr">461 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'routine-state' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L462" class="LineNr">462 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L463" class="LineNr">463 </span> <span class="Delimiter">}</span> <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> -<span id="L465" class="LineNr">465 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'routine-state' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L465" class="LineNr">465 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'routine-state' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L466" class="LineNr">466 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L467" class="LineNr">467 </span> <span class="Delimiter">}</span> <span id="L468" class="LineNr">468 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -532,7 +532,7 @@ if ('onhashchange' in window) { <span id="L471" class="LineNr">471 </span><span class="Normal">case</span> ROUTINE_STATE: <span class="Delimiter">{</span> <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> <span id="L473" class="LineNr">473 </span> <span class="Normal">int</span> result = -<span class="Constant">1</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L476" class="LineNr">476 </span> result = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state<span class="Delimiter">;</span> <span id="L477" class="LineNr">477 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -548,15 +548,15 @@ if ('onhashchange' in window) { <span id="L487" class="LineNr">487 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L488" class="LineNr">488 </span>STOP<span class="Delimiter">,</span> <span id="L489" class="LineNr">489 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L490" class="LineNr">490 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"stop"</span><span class="Delimiter">,</span> STOP<span class="Delimiter">);</span> +<span id="L490" class="LineNr">490 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"stop"</span><span class="Delimiter">,</span> STOP<span class="Delimiter">);</span> <span id="L491" class="LineNr">491 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L492" class="LineNr">492 </span><span class="Normal">case</span> STOP: <span class="Delimiter">{</span> -<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> -<span id="L494" class="LineNr">494 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'stop' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L493" class="LineNr">493 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L494" class="LineNr">494 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'stop' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L495" class="LineNr">495 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L496" class="LineNr">496 </span> <span class="Delimiter">}</span> <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> -<span id="L498" class="LineNr">498 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'stop' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L498" class="LineNr">498 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'stop' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L499" class="LineNr">499 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L500" class="LineNr">500 </span> <span class="Delimiter">}</span> <span id="L501" class="LineNr">501 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -564,9 +564,9 @@ if ('onhashchange' in window) { <span id="L503" class="LineNr">503 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L504" class="LineNr">504 </span><span class="Normal">case</span> STOP: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L508" class="LineNr">508 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = COMPLETED<span class="Delimiter">;</span> +<span id="L508" class="LineNr">508 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = <a href='072scheduler.cc.html#L42'>COMPLETED</a><span class="Delimiter">;</span> <span id="L509" class="LineNr">509 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L510" class="LineNr">510 </span> <span class="Delimiter">}</span> <span id="L511" class="LineNr">511 </span> <span class="Delimiter">}</span> @@ -576,14 +576,14 @@ if ('onhashchange' in window) { <span id="L515" class="LineNr">515 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L516" class="LineNr">516 </span>_DUMP_ROUTINES<span class="Delimiter">,</span> <span id="L517" class="LineNr">517 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L518" class="LineNr">518 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-routines"</span><span class="Delimiter">,</span> _DUMP_ROUTINES<span class="Delimiter">);</span> +<span id="L518" class="LineNr">518 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-routines"</span><span class="Delimiter">,</span> _DUMP_ROUTINES<span class="Delimiter">);</span> <span id="L519" class="LineNr">519 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L520" class="LineNr">520 </span><span class="Normal">case</span> _DUMP_ROUTINES: <span class="Delimiter">{</span> <span id="L521" class="LineNr">521 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L522" class="LineNr">522 </span><span class="Delimiter">}</span> <span id="L523" class="LineNr">523 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L524" class="LineNr">524 </span><span class="Normal">case</span> _DUMP_ROUTINES: <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L526" class="LineNr">526 </span> cerr << i << <span class="Constant">": "</span> << Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>id << <span class="Constant">' '</span> << Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state << <span class="Constant">' '</span> << Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>parent_index << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L527" class="LineNr">527 </span> <span class="Delimiter">}</span> <span id="L528" class="LineNr">528 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -613,7 +613,7 @@ if ('onhashchange' in window) { <span id="L552" class="LineNr">552 </span><span class="Delimiter">:(before "End Scheduler State Transitions")</span> <span id="L553" class="LineNr">553 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>limit >= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L554" class="LineNr">554 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_routine<span class="Delimiter">-></span>limit <= Scheduling_interval<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L555" class="LineNr">555 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"discontinuing routine "</span> << Current_routine<span class="Delimiter">-></span>id << end<span class="Delimiter">();</span> +<span id="L555" class="LineNr">555 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"discontinuing routine "</span> << Current_routine<span class="Delimiter">-></span>id << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L556" class="LineNr">556 </span> Current_routine<span class="Delimiter">-></span>state = DISCONTINUED<span class="Delimiter">;</span> <span id="L557" class="LineNr">557 </span> Current_routine<span class="Delimiter">-></span>limit = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L558" class="LineNr">558 </span> <span class="Delimiter">}</span> @@ -624,14 +624,14 @@ if ('onhashchange' in window) { <span id="L563" class="LineNr">563 </span> <span id="L564" class="LineNr">564 </span><span class="Delimiter">:(before "End Test Teardown")</span> <span id="L565" class="LineNr">565 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed && any_routines_with_error<span class="Delimiter">())</span> -<span id="L566" class="LineNr">566 </span> raise << <span class="Constant">"some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L566" class="LineNr">566 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L567" class="LineNr">567 </span><span class="Delimiter">:(before "End Mu Test Teardown")</span> <span id="L568" class="LineNr">568 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed && any_routines_with_error<span class="Delimiter">())</span> -<span id="L569" class="LineNr">569 </span> raise << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L569" class="LineNr">569 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L570" class="LineNr">570 </span> <span id="L571" class="LineNr">571 </span><span class="Delimiter">:(code)</span> <span id="L572" class="LineNr">572 </span><span class="Normal">bool</span> any_routines_with_error<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>state == DISCONTINUED<span class="Delimiter">)</span> <span id="L575" class="LineNr">575 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L576" class="LineNr">576 </span> <span class="Delimiter">}</span> @@ -646,19 +646,19 @@ if ('onhashchange' in window) { <span id="L585" class="LineNr">585 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L586" class="LineNr">586 </span>LIMIT_TIME<span class="Delimiter">,</span> <span id="L587" class="LineNr">587 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L588" class="LineNr">588 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"limit-time"</span><span class="Delimiter">,</span> LIMIT_TIME<span class="Delimiter">);</span> +<span id="L588" class="LineNr">588 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"limit-time"</span><span class="Delimiter">,</span> LIMIT_TIME<span class="Delimiter">);</span> <span id="L589" class="LineNr">589 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L590" class="LineNr">590 </span><span class="Normal">case</span> LIMIT_TIME: <span class="Delimiter">{</span> -<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> -<span id="L592" class="LineNr">592 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'limit-time' requires exactly two ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L591" class="LineNr">591 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L592" class="LineNr">592 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'limit-time' requires exactly two ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L593" class="LineNr">593 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L594" class="LineNr">594 </span> <span class="Delimiter">}</span> <span id="L595" class="LineNr">595 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L596" class="LineNr">596 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'limit-time' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L596" class="LineNr">596 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'limit-time' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L597" class="LineNr">597 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L598" class="LineNr">598 </span> <span class="Delimiter">}</span> <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> -<span id="L600" class="LineNr">600 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'limit-time' should be a number (of instructions to run for), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L600" class="LineNr">600 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'limit-time' should be a number (of instructions to run for), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L601" class="LineNr">601 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L602" class="LineNr">602 </span> <span class="Delimiter">}</span> <span id="L603" class="LineNr">603 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -666,7 +666,7 @@ if ('onhashchange' in window) { <span id="L605" class="LineNr">605 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L606" class="LineNr">606 </span><span class="Normal">case</span> LIMIT_TIME: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L610" class="LineNr">610 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></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 id="L611" class="LineNr">611 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -684,15 +684,15 @@ if ('onhashchange' in window) { <span id="L623" class="LineNr">623 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L624" class="LineNr">624 </span>NUMBER_OF_INSTRUCTIONS<span class="Delimiter">,</span> <span id="L625" class="LineNr">625 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L626" class="LineNr">626 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"number-of-instructions"</span><span class="Delimiter">,</span> NUMBER_OF_INSTRUCTIONS<span class="Delimiter">);</span> +<span id="L626" class="LineNr">626 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"number-of-instructions"</span><span class="Delimiter">,</span> NUMBER_OF_INSTRUCTIONS<span class="Delimiter">);</span> <span id="L627" class="LineNr">627 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L628" class="LineNr">628 </span><span class="Normal">case</span> NUMBER_OF_INSTRUCTIONS: <span class="Delimiter">{</span> -<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> -<span id="L630" class="LineNr">630 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'number-of-instructions' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L629" class="LineNr">629 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L630" class="LineNr">630 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'number-of-instructions' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L631" class="LineNr">631 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L632" class="LineNr">632 </span> <span class="Delimiter">}</span> <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> -<span id="L634" class="LineNr">634 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'number-of-instructions' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L634" class="LineNr">634 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'number-of-instructions' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L635" class="LineNr">635 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L636" class="LineNr">636 </span> <span class="Delimiter">}</span> <span id="L637" class="LineNr">637 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -701,7 +701,7 @@ if ('onhashchange' in window) { <span id="L640" class="LineNr">640 </span><span class="Normal">case</span> NUMBER_OF_INSTRUCTIONS: <span class="Delimiter">{</span> <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> <span id="L642" class="LineNr">642 </span> <span class="Normal">int</span> result = -<span class="Constant">1</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L645" class="LineNr">645 </span> result = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>instructions_run<span class="Delimiter">;</span> <span id="L646" class="LineNr">646 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/073wait.cc.html b/html/073wait.cc.html index 8abb58f7..a0dac113 100644 --- a/html/073wait.cc.html +++ b/html/073wait.cc.html @@ -94,34 +94,34 @@ if ('onhashchange' in window) { <span id="L33" class="LineNr"> 33 </span>waiting_on_location = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L34" class="LineNr"> 34 </span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before "End Mu Test Teardown")</span> -<span id="L36" class="LineNr"> 36 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed && any_routines_waiting<span class="Delimiter">())</span> -<span id="L37" class="LineNr"> 37 </span> raise << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": deadlock!</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L36" class="LineNr"> 36 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed && <a href='073wait.cc.html#L47'>any_routines_waiting</a><span class="Delimiter">())</span> +<span id="L37" class="LineNr"> 37 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": deadlock!</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L38" class="LineNr"> 38 </span><span class="Delimiter">:(before "End Run Routine")</span> -<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> -<span id="L40" class="LineNr"> 40 </span> raise << <span class="Constant">"deadlock!</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L41" class="LineNr"> 41 </span> dump_waiting_routines<span class="Delimiter">();</span> +<span id="L39" class="LineNr"> 39 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='073wait.cc.html#L47'>any_routines_waiting</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"deadlock!</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L41" class="LineNr"> 41 </span> <a href='073wait.cc.html#L54'>dump_waiting_routines</a><span class="Delimiter">();</span> <span id="L42" class="LineNr"> 42 </span><span class="Delimiter">}</span> <span id="L43" class="LineNr"> 43 </span><span class="Delimiter">:(before "End Test Teardown")</span> <span id="L44" class="LineNr"> 44 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Passed && any_routines_with_error<span class="Delimiter">())</span> -<span id="L45" class="LineNr"> 45 </span> raise << <span class="Constant">"some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L45" class="LineNr"> 45 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"some routines died with errors</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(code)</span> -<span id="L47" class="LineNr"> 47 </span><span class="Normal">bool</span> any_routines_waiting<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L47" class="LineNr"> 47 </span><span class="Normal">bool</span> <a href='073wait.cc.html#L47'>any_routines_waiting</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>state == WAITING<span class="Delimiter">)</span> <span id="L50" class="LineNr"> 50 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L51" class="LineNr"> 51 </span> <span class="Delimiter">}</span> <span id="L52" class="LineNr"> 52 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L53" class="LineNr"> 53 </span><span class="Delimiter">}</span> -<span id="L54" class="LineNr"> 54 </span><span class="Normal">void</span> dump_waiting_routines<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L54" class="LineNr"> 54 </span><span class="Normal">void</span> <a href='073wait.cc.html#L54'>dump_waiting_routines</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>state == WAITING<span class="Delimiter">)</span> -<span id="L57" class="LineNr"> 57 </span> cerr << i << <span class="Constant">": "</span> << routine_label<span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L57" class="LineNr"> 57 </span> cerr << i << <span class="Constant">": "</span> << <a href='072scheduler.cc.html#L107'>routine_label</a><span class="Delimiter">(</span>Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L58" class="LineNr"> 58 </span> <span class="Delimiter">}</span> <span id="L59" class="LineNr"> 59 </span><span class="Delimiter">}</span> <span id="L60" class="LineNr"> 60 </span> <span id="L61" class="LineNr"> 61 </span><span class="Delimiter">:(scenario wait_for_location_can_deadlock)</span> <span id="L62" class="LineNr"> 62 </span><span class="Special">% Hide_errors = true;</span> -<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> main [ +<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L64" class="LineNr"> 64 </span> <span class="Constant">10</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L65" class="LineNr"> 65 </span> <span class="Constant">20</span>:location<span class="Special"> <- </span>copy <span class="Constant">10</span>/unsafe <span id="L66" class="LineNr"> 66 </span> wait-<span class="Normal">for</span>-reset-then-set <span class="Constant">20</span>:location @@ -135,28 +135,28 @@ if ('onhashchange' in window) { <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L75" class="LineNr"> 75 </span>WAIT_FOR_RESET_THEN_SET<span class="Delimiter">,</span> <span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L77" class="LineNr"> 77 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-reset-then-set"</span><span class="Delimiter">,</span> WAIT_FOR_RESET_THEN_SET<span class="Delimiter">);</span> +<span id="L77" class="LineNr"> 77 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-reset-then-set"</span><span class="Delimiter">,</span> WAIT_FOR_RESET_THEN_SET<span class="Delimiter">);</span> <span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L79" class="LineNr"> 79 </span><span class="Normal">case</span> WAIT_FOR_RESET_THEN_SET: <span class="Delimiter">{</span> -<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> -<span id="L81" class="LineNr"> 81 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-reset-then-set' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L80" class="LineNr"> 80 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L81" class="LineNr"> 81 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-reset-then-set' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L82" class="LineNr"> 82 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L83" class="LineNr"> 83 </span> <span class="Delimiter">}</span> <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> -<span id="L85" class="LineNr"> 85 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-reset-then-set' requires a location ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L85" class="LineNr"> 85 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-reset-then-set' requires a location ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L86" class="LineNr"> 86 </span> <span class="Delimiter">}</span> <span id="L87" class="LineNr"> 87 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span> <span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L90" class="LineNr"> 90 </span><span class="Normal">case</span> WAIT_FOR_RESET_THEN_SET: <span class="Delimiter">{</span> <span id="L91" class="LineNr"> 91 </span> <span class="Normal">int</span> loc = <span class="Normal">static_cast</span><<span class="Normal">int</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 id="L92" class="LineNr"> 92 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"wait: *"</span> << loc << <span class="Constant">" = "</span> << get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> -<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> -<span id="L94" class="LineNr"> 94 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << loc << <span class="Constant">" is already 0; setting"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L92" class="LineNr"> 92 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"wait: *"</span> << loc << <span class="Constant">" = "</span> << <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L94" class="LineNr"> 94 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"location "</span> << loc << <span class="Constant">" is already 0; setting"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L95" class="LineNr"> 95 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L96" class="LineNr"> 96 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L97" class="LineNr"> 97 </span> <span class="Delimiter">}</span> -<span id="L98" class="LineNr"> 98 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"waiting for location "</span> << loc << <span class="Constant">" to reset"</span> << end<span class="Delimiter">();</span> +<span id="L98" class="LineNr"> 98 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"waiting for location "</span> << loc << <span class="Constant">" to reset"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L99" class="LineNr"> 99 </span> Current_routine<span class="Delimiter">-></span>state = WAITING<span class="Delimiter">;</span> <span id="L100" class="LineNr">100 </span> Current_routine<span class="Delimiter">-></span>waiting_on_location = loc<span class="Delimiter">;</span> <span id="L101" class="LineNr">101 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -166,36 +166,36 @@ if ('onhashchange' in window) { <span id="L105" class="LineNr">105 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L106" class="LineNr">106 </span>RESET<span class="Delimiter">,</span> <span id="L107" class="LineNr">107 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L108" class="LineNr">108 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"reset"</span><span class="Delimiter">,</span> RESET<span class="Delimiter">);</span> +<span id="L108" class="LineNr">108 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"reset"</span><span class="Delimiter">,</span> RESET<span class="Delimiter">);</span> <span id="L109" class="LineNr">109 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L110" class="LineNr">110 </span><span class="Normal">case</span> RESET: <span class="Delimiter">{</span> -<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> -<span id="L112" class="LineNr">112 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'reset' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L111" class="LineNr">111 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L112" class="LineNr">112 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'reset' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L113" class="LineNr">113 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L114" class="LineNr">114 </span> <span class="Delimiter">}</span> <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> -<span id="L116" class="LineNr">116 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'reset' requires a location ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L116" class="LineNr">116 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'reset' requires a location ingredient, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L117" class="LineNr">117 </span> <span class="Delimiter">}</span> <span id="L118" class="LineNr">118 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L119" class="LineNr">119 </span><span class="Delimiter">}</span> <span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L121" class="LineNr">121 </span><span class="Normal">case</span> RESET: <span class="Delimiter">{</span> <span id="L122" class="LineNr">122 </span> <span class="Normal">int</span> loc = <span class="Normal">static_cast</span><<span class="Normal">int</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 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> -<span id="L124" class="LineNr">124 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"reset: *"</span> << loc << <span class="Constant">" = "</span> << get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L123" class="LineNr">123 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L124" class="LineNr">124 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"reset: *"</span> << loc << <span class="Constant">" = "</span> << <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L125" class="LineNr">125 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L126" class="LineNr">126 </span><span class="Delimiter">}</span> <span id="L127" class="LineNr">127 </span> <span id="L128" class="LineNr">128 </span><span class="Comment">//: scheduler tweak to get routines out of that state</span> <span id="L129" class="LineNr">129 </span> <span id="L130" class="LineNr">130 </span><span class="Delimiter">:(before "End Scheduler State Transitions")</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <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">)-></span>waiting_on_location<span class="Delimiter">;</span> -<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>loc && 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> -<span id="L135" class="LineNr">135 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"waking up routine "</span> << Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>id << end<span class="Delimiter">();</span> -<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> -<span id="L137" class="LineNr">137 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = RUNNING<span class="Delimiter">;</span> +<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>loc && <a href='001help.cc.html#L225'>get_or_insert</a><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> +<span id="L135" class="LineNr">135 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"waking up routine "</span> << Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>id << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L136" class="LineNr">136 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> loc<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L137" class="LineNr">137 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">;</span> <span id="L138" class="LineNr">138 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>waiting_on_location = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L139" class="LineNr">139 </span> <span class="Delimiter">}</span> <span id="L140" class="LineNr">140 </span><span class="Delimiter">}</span> @@ -205,7 +205,7 @@ if ('onhashchange' in window) { <span id="L144" class="LineNr">144 </span><span class="Comment">//: containers within containers yet.</span> <span id="L145" class="LineNr">145 </span> <span id="L146" class="LineNr">146 </span><span class="Delimiter">:(scenario get_location)</span> -<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [ +<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L148" class="LineNr">148 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L149" class="LineNr">149 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L150" class="LineNr">150 </span> <span class="Constant">15</span>:location<span class="Special"> <- </span>get-location <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span> @@ -215,36 +215,36 @@ if ('onhashchange' in window) { <span id="L154" class="LineNr">154 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L155" class="LineNr">155 </span>GET_LOCATION<span class="Delimiter">,</span> <span id="L156" class="LineNr">156 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L157" class="LineNr">157 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"get-location"</span><span class="Delimiter">,</span> GET_LOCATION<span class="Delimiter">);</span> +<span id="L157" class="LineNr">157 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"get-location"</span><span class="Delimiter">,</span> GET_LOCATION<span class="Delimiter">);</span> <span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L159" class="LineNr">159 </span><span class="Normal">case</span> GET_LOCATION: <span class="Delimiter">{</span> -<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> -<span id="L161" class="LineNr">161 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get-location' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L160" class="LineNr">160 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L161" class="LineNr">161 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get-location' expects exactly 2 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L162" class="LineNr">162 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L163" class="LineNr">163 </span> <span class="Delimiter">}</span> <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> <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> <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> -<span id="L167" class="LineNr">167 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get-location' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L167" class="LineNr">167 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get-location' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L168" class="LineNr">168 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L169" class="LineNr">169 </span> <span class="Delimiter">}</span> <span id="L170" class="LineNr">170 </span> <span class="Normal">const</span> type_tree* base_root_type = base<span class="Delimiter">.</span>type<span class="Delimiter">-></span>atom ? base<span class="Delimiter">.</span>type : base<span class="Delimiter">.</span>type<span class="Delimiter">-></span>left<span class="Delimiter">;</span> -<span id="L171" class="LineNr">171 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_root_type<span class="Delimiter">-></span>atom || base_root_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L172" class="LineNr">172 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get-location' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L171" class="LineNr">171 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_root_type<span class="Delimiter">-></span>atom || base_root_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_root_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L172" class="LineNr">172 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'get-location' should be a container, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L173" class="LineNr">173 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span> -<span id="L175" class="LineNr">175 </span> type_ordinal base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">-></span>value<span class="Delimiter">;</span> +<span id="L175" class="LineNr">175 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">-></span>value<span class="Delimiter">;</span> <span id="L176" class="LineNr">176 </span> <span class="Normal">const</span> reagent& offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="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> -<span id="L178" class="LineNr">178 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'get-location' should have type 'offset', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L178" class="LineNr">178 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'get-location' should have type 'offset', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L179" class="LineNr">179 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L180" class="LineNr">180 </span> <span class="Delimiter">}</span> <span id="L181" class="LineNr">181 </span> <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L182" class="LineNr">182 </span> <span class="Comment">//: later layers will permit non-integer offsets</span> -<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> -<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> -<span id="L185" class="LineNr">185 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= 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> -<span id="L186" class="LineNr">186 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset "</span> << offset_value << <span class="Constant">" for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L183" class="LineNr">183 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L184" class="LineNr">184 </span> offset_value = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<span id="L185" class="LineNr">185 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L186" class="LineNr">186 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset "</span> << offset_value << <span class="Constant">" for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L187" class="LineNr">187 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L188" class="LineNr">188 </span> <span class="Delimiter">}</span> <span id="L189" class="LineNr">189 </span> <span class="Delimiter">}</span> @@ -253,7 +253,7 @@ if ('onhashchange' in window) { <span id="L192" class="LineNr">192 </span> <span class="Delimiter">}</span> <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> <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> -<span id="L195" class="LineNr">195 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get-location "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to type location but '"</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 << <span class="Constant">"' has type '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L195" class="LineNr">195 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get-location "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to type location but '"</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 << <span class="Constant">"' has type '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L196" class="LineNr">196 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L197" class="LineNr">197 </span> <span class="Delimiter">}</span> <span id="L198" class="LineNr">198 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -264,23 +264,23 @@ if ('onhashchange' in window) { <span id="L203" class="LineNr">203 </span> canonize<span class="Delimiter">(</span>base<span class="Delimiter">);</span> <span id="L204" class="LineNr">204 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <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> -<span id="L206" class="LineNr">206 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L207" class="LineNr">207 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> <span id="L209" class="LineNr">209 </span> <span class="Normal">const</span> type_tree* base_type = get_base_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <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> -<span id="L211" class="LineNr">211 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// copied from Check above</span> +<span id="L211" class="LineNr">211 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// copied from Check above</span> <span id="L212" class="LineNr">212 </span> <span class="Normal">int</span> result = base_address<span class="Delimiter">;</span> <span id="L213" class="LineNr">213 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i < offset<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> -<span id="L214" class="LineNr">214 </span> result += size_of<span class="Delimiter">(</span>element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">));</span> -<span id="L215" class="LineNr">215 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << result << end<span class="Delimiter">();</span> +<span id="L214" class="LineNr">214 </span> result += size_of<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">));</span> +<span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << result << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L216" class="LineNr">216 </span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L217" class="LineNr">217 </span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span> <span id="L218" class="LineNr">218 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L219" class="LineNr">219 </span><span class="Delimiter">}</span> <span id="L220" class="LineNr">220 </span> <span id="L221" class="LineNr">221 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L222" class="LineNr">222 </span><span class="Normal">bool</span> <a href='073wait.cc.html#L222'>is_mu_location</a><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 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> <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> <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">-></span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> @@ -289,23 +289,23 @@ if ('onhashchange' in window) { <span id="L228" class="LineNr">228 </span> <span id="L229" class="LineNr">229 </span><span class="Delimiter">:(scenario get_location_out_of_bounds)</span> <span id="L230" class="LineNr">230 </span><span class="Special">% Hide_errors = true;</span> -<span id="L231" class="LineNr">231 </span><span class="muRecipe">def</span> main [ +<span id="L231" class="LineNr">231 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L232" class="LineNr">232 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L233" class="LineNr">233 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L234" class="LineNr">234 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> <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> <span id="L236" class="LineNr">236 </span>] -<span id="L237" class="LineNr">237 </span><span class="traceContains">+error: main: invalid offset 2 for 'point-number'</span> +<span id="L237" class="LineNr">237 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid offset 2 for 'point-number'</span> <span id="L238" class="LineNr">238 </span> <span id="L239" class="LineNr">239 </span><span class="Delimiter">:(scenario get_location_out_of_bounds_2)</span> <span id="L240" class="LineNr">240 </span><span class="Special">% Hide_errors = true;</span> -<span id="L241" class="LineNr">241 </span><span class="muRecipe">def</span> main [ +<span id="L241" class="LineNr">241 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L242" class="LineNr">242 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L243" class="LineNr">243 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> <span id="L244" class="LineNr">244 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> <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> <span id="L246" class="LineNr">246 </span>] -<span id="L247" class="LineNr">247 </span><span class="traceContains">+error: main: invalid offset -1 for 'point-number'</span> +<span id="L247" class="LineNr">247 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid offset -1 for 'point-number'</span> <span id="L248" class="LineNr">248 </span> <span id="L249" class="LineNr">249 </span><span class="Delimiter">:(scenario get_location_product_type_mismatch)</span> <span id="L250" class="LineNr">250 </span><span class="Special">% Hide_errors = true;</span> @@ -313,16 +313,16 @@ if ('onhashchange' in window) { <span id="L252" class="LineNr">252 </span> <span class="Normal">x</span>:<span class="Normal">bool</span> <span id="L253" class="LineNr">253 </span> <span class="Normal">y</span>:<span class="Normal">bool</span> <span id="L254" class="LineNr">254 </span>] -<span id="L255" class="LineNr">255 </span><span class="muRecipe">def</span> main [ +<span id="L255" class="LineNr">255 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L256" class="LineNr">256 </span> <span class="Constant">12</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">1</span> <span id="L257" class="LineNr">257 </span> <span class="Constant">13</span>:<span class="Normal">bool</span><span class="Special"> <- </span>copy <span class="Constant">0</span> <span id="L258" class="LineNr">258 </span> <span class="Constant">15</span>:<span class="Normal">bool</span><span class="Special"> <- </span>get-location <span class="Constant">12</span>:boolbool<span class="Delimiter">,</span> <span class="Constant">1:offset</span> <span id="L259" class="LineNr">259 </span>] -<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> +<span id="L260" class="LineNr">260 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'get-location 12:boolbool, 1:offset' should write to type location but '15' has type 'boolean'</span> <span id="L261" class="LineNr">261 </span> <span id="L262" class="LineNr">262 </span><span class="Delimiter">:(scenario get_location_indirect)</span> <span id="L263" class="LineNr">263 </span><span class="Comment"># 'get-location' can read from container address</span> -<span id="L264" class="LineNr">264 </span><span class="muRecipe">def</span> main [ +<span id="L264" class="LineNr">264 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L265" class="LineNr">265 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L266" class="LineNr">266 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L267" class="LineNr">267 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -332,7 +332,7 @@ if ('onhashchange' in window) { <span id="L271" class="LineNr">271 </span><span class="traceContains">+mem: storing 11 in location 4</span> <span id="L272" class="LineNr">272 </span> <span id="L273" class="LineNr">273 </span><span class="Delimiter">:(scenario get_location_indirect_2)</span> -<span id="L274" class="LineNr">274 </span><span class="muRecipe">def</span> main [ +<span id="L274" class="LineNr">274 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L275" class="LineNr">275 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">10</span> <span id="L276" class="LineNr">276 </span> <span class="Comment"># 10 reserved for refcount</span> <span id="L277" class="LineNr">277 </span> <span class="Constant">11</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -382,15 +382,15 @@ if ('onhashchange' in window) { <span id="L321" class="LineNr">321 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L322" class="LineNr">322 </span>WAIT_FOR_ROUTINE<span class="Delimiter">,</span> <span id="L323" class="LineNr">323 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L324" class="LineNr">324 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-routine"</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE<span class="Delimiter">);</span> +<span id="L324" class="LineNr">324 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-routine"</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE<span class="Delimiter">);</span> <span id="L325" class="LineNr">325 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L326" class="LineNr">326 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE: <span class="Delimiter">{</span> -<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> -<span id="L328" class="LineNr">328 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-routine' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L327" class="LineNr">327 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L328" class="LineNr">328 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-routine' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L329" class="LineNr">329 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L330" class="LineNr">330 </span> <span class="Delimiter">}</span> <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> -<span id="L332" class="LineNr">332 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'wait-for-routine' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L332" class="LineNr">332 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'wait-for-routine' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L333" class="LineNr">333 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L334" class="LineNr">334 </span> <span class="Delimiter">}</span> <span id="L335" class="LineNr">335 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -398,12 +398,12 @@ if ('onhashchange' in window) { <span id="L337" class="LineNr">337 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L338" class="LineNr">338 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE: <span class="Delimiter">{</span> <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">-></span>id<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L340" class="LineNr">340 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"routine can't wait for itself! '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L340" class="LineNr">340 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"routine can't wait for itself! '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L341" class="LineNr">341 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L342" class="LineNr">342 </span> <span class="Delimiter">}</span> <span id="L343" class="LineNr">343 </span> Current_routine<span class="Delimiter">-></span>state = WAITING<span class="Delimiter">;</span> <span id="L344" class="LineNr">344 </span> Current_routine<span class="Delimiter">-></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> -<span id="L345" class="LineNr">345 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"waiting for routine "</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> << end<span class="Delimiter">();</span> +<span id="L345" class="LineNr">345 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"waiting for routine "</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 href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L346" class="LineNr">346 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L347" class="LineNr">347 </span><span class="Delimiter">}</span> <span id="L348" class="LineNr">348 </span> @@ -411,18 +411,18 @@ if ('onhashchange' in window) { <span id="L350" class="LineNr">350 </span><span class="Comment">// Wake up any routines waiting for other routines to complete.</span> <span id="L351" class="LineNr">351 </span><span class="Comment">// Important: this must come after the scheduler loop above giving routines</span> <span id="L352" class="LineNr">352 </span><span class="Comment">// waiting for locations to change a chance to wake up.</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L355" class="LineNr">355 </span> routine* waiter = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L356" class="LineNr">356 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!waiter<span class="Delimiter">-></span>waiting_on_routine<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L357" class="LineNr">357 </span> <span class="Normal">int</span> id = waiter<span class="Delimiter">-></span>waiting_on_routine<span class="Delimiter">;</span> <span id="L358" class="LineNr">358 </span> assert<span class="Delimiter">(</span>id != waiter<span class="Delimiter">-></span>id<span class="Delimiter">);</span> <span class="Comment">// routine can't wait on itself</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L361" class="LineNr">361 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-></span>id == id && waitee<span class="Delimiter">-></span>state != RUNNING && waitee<span class="Delimiter">-></span>state != WAITING<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L361" class="LineNr">361 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-></span>id == id && waitee<span class="Delimiter">-></span>state != <a href='072scheduler.cc.html#L41'>RUNNING</a> && waitee<span class="Delimiter">-></span>state != WAITING<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L362" class="LineNr">362 </span> <span class="Comment">// routine is COMPLETED or DISCONTINUED</span> -<span id="L363" class="LineNr">363 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"waking up routine "</span> << waiter<span class="Delimiter">-></span>id << end<span class="Delimiter">();</span> -<span id="L364" class="LineNr">364 </span> waiter<span class="Delimiter">-></span>state = RUNNING<span class="Delimiter">;</span> +<span id="L363" class="LineNr">363 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"waking up routine "</span> << waiter<span class="Delimiter">-></span>id << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L364" class="LineNr">364 </span> waiter<span class="Delimiter">-></span>state = <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">;</span> <span id="L365" class="LineNr">365 </span> waiter<span class="Delimiter">-></span>waiting_on_routine = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L366" class="LineNr">366 </span> <span class="Delimiter">}</span> <span id="L367" class="LineNr">367 </span> <span class="Delimiter">}</span> @@ -433,7 +433,7 @@ if ('onhashchange' in window) { <span id="L372" class="LineNr">372 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L373" class="LineNr">373 </span>SWITCH<span class="Delimiter">,</span> <span id="L374" class="LineNr">374 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L375" class="LineNr">375 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"switch"</span><span class="Delimiter">,</span> SWITCH<span class="Delimiter">);</span> +<span id="L375" class="LineNr">375 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"switch"</span><span class="Delimiter">,</span> SWITCH<span class="Delimiter">);</span> <span id="L376" class="LineNr">376 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L377" class="LineNr">377 </span><span class="Normal">case</span> SWITCH: <span class="Delimiter">{</span> <span id="L378" class="LineNr">378 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -481,11 +481,11 @@ if ('onhashchange' in window) { <span id="L420" class="LineNr">420 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L421" class="LineNr">421 </span>CURRENT_ROUTINE_IS_BLOCKED<span class="Delimiter">,</span> <span id="L422" class="LineNr">422 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L423" class="LineNr">423 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"current-routine-is-blocked"</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_BLOCKED<span class="Delimiter">);</span> +<span id="L423" class="LineNr">423 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"current-routine-is-blocked"</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_BLOCKED<span class="Delimiter">);</span> <span id="L424" class="LineNr">424 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L425" class="LineNr">425 </span><span class="Normal">case</span> CURRENT_ROUTINE_IS_BLOCKED: <span class="Delimiter">{</span> <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> -<span id="L427" class="LineNr">427 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'current-routine-is-blocked' should have no ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L427" class="LineNr">427 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'current-routine-is-blocked' should have no ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L428" class="LineNr">428 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L429" class="LineNr">429 </span> <span class="Delimiter">}</span> <span id="L430" class="LineNr">430 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -499,11 +499,11 @@ if ('onhashchange' in window) { <span id="L438" class="LineNr">438 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L439" class="LineNr">439 </span>CURRENT_ROUTINE_IS_UNBLOCKED<span class="Delimiter">,</span> <span id="L440" class="LineNr">440 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L441" class="LineNr">441 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"current-routine-is-unblocked"</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_UNBLOCKED<span class="Delimiter">);</span> +<span id="L441" class="LineNr">441 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"current-routine-is-unblocked"</span><span class="Delimiter">,</span> CURRENT_ROUTINE_IS_UNBLOCKED<span class="Delimiter">);</span> <span id="L442" class="LineNr">442 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L443" class="LineNr">443 </span><span class="Normal">case</span> CURRENT_ROUTINE_IS_UNBLOCKED: <span class="Delimiter">{</span> <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> -<span id="L445" class="LineNr">445 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'current-routine-is-unblocked' should have no ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L445" class="LineNr">445 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'current-routine-is-unblocked' should have no ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L446" class="LineNr">446 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L447" class="LineNr">447 </span> <span class="Delimiter">}</span> <span id="L448" class="LineNr">448 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -544,15 +544,15 @@ if ('onhashchange' in window) { <span id="L483" class="LineNr">483 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L484" class="LineNr">484 </span>WAIT_FOR_ROUTINE_TO_BLOCK<span class="Delimiter">,</span> <span id="L485" class="LineNr">485 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L486" class="LineNr">486 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-routine-to-block"</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE_TO_BLOCK<span class="Delimiter">);</span> +<span id="L486" class="LineNr">486 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-routine-to-block"</span><span class="Delimiter">,</span> WAIT_FOR_ROUTINE_TO_BLOCK<span class="Delimiter">);</span> <span id="L487" class="LineNr">487 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L488" class="LineNr">488 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE_TO_BLOCK: <span class="Delimiter">{</span> -<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> -<span id="L490" class="LineNr">490 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-routine-to-block' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L489" class="LineNr">489 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L490" class="LineNr">490 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'wait-for-routine-to-block' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L491" class="LineNr">491 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L492" class="LineNr">492 </span> <span class="Delimiter">}</span> <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> -<span id="L494" class="LineNr">494 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'wait-for-routine-to-block' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L494" class="LineNr">494 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'wait-for-routine-to-block' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L495" class="LineNr">495 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L496" class="LineNr">496 </span> <span class="Delimiter">}</span> <span id="L497" class="LineNr">497 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -560,29 +560,29 @@ if ('onhashchange' in window) { <span id="L499" class="LineNr">499 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L500" class="LineNr">500 </span><span class="Normal">case</span> WAIT_FOR_ROUTINE_TO_BLOCK: <span class="Delimiter">{</span> <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">-></span>id<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L502" class="LineNr">502 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"routine can't wait for itself! '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L502" class="LineNr">502 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"routine can't wait for itself! '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L503" class="LineNr">503 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L504" class="LineNr">504 </span> <span class="Delimiter">}</span> <span id="L505" class="LineNr">505 </span> Current_routine<span class="Delimiter">-></span>state = WAITING<span class="Delimiter">;</span> <span id="L506" class="LineNr">506 </span> Current_routine<span class="Delimiter">-></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> -<span id="L507" class="LineNr">507 </span> trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"waiting for routine "</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">" to block"</span> << end<span class="Delimiter">();</span> +<span id="L507" class="LineNr">507 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"waiting for routine "</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">" to block"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L508" class="LineNr">508 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L509" class="LineNr">509 </span><span class="Delimiter">}</span> <span id="L510" class="LineNr">510 </span> <span id="L511" class="LineNr">511 </span><span class="Delimiter">:(before "End Scheduler State Transitions")</span> <span id="L512" class="LineNr">512 </span><span class="Comment">// Wake up any routines waiting for other routines to stop running.</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>state != WAITING<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L515" class="LineNr">515 </span> routine* waiter = Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L516" class="LineNr">516 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!waiter<span class="Delimiter">-></span>waiting_on_routine_to_block<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L517" class="LineNr">517 </span> <span class="Normal">int</span> id = waiter<span class="Delimiter">-></span>waiting_on_routine_to_block<span class="Delimiter">;</span> <span id="L518" class="LineNr">518 </span> assert<span class="Delimiter">(</span>id != waiter<span class="Delimiter">-></span>id<span class="Delimiter">);</span> <span class="Comment">// routine can't wait on itself</span> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L521" class="LineNr">521 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-></span>id != id<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L522" class="LineNr">522 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-></span>state != RUNNING || waitee<span class="Delimiter">-></span>blocked<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L523" class="LineNr">523 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"waking up routine "</span> << waiter<span class="Delimiter">-></span>id << <span class="Constant">" because routine "</span> << waitee<span class="Delimiter">-></span>id << <span class="Constant">" is blocked"</span> << end<span class="Delimiter">();</span> -<span id="L524" class="LineNr">524 </span> waiter<span class="Delimiter">-></span>state = RUNNING<span class="Delimiter">;</span> +<span id="L522" class="LineNr">522 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>waitee<span class="Delimiter">-></span>state != <a href='072scheduler.cc.html#L41'>RUNNING</a> || waitee<span class="Delimiter">-></span>blocked<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L523" class="LineNr">523 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"schedule"</span><span class="Delimiter">)</span> << <span class="Constant">"waking up routine "</span> << waiter<span class="Delimiter">-></span>id << <span class="Constant">" because routine "</span> << waitee<span class="Delimiter">-></span>id << <span class="Constant">" is blocked"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L524" class="LineNr">524 </span> waiter<span class="Delimiter">-></span>state = <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">;</span> <span id="L525" class="LineNr">525 </span> waiter<span class="Delimiter">-></span>waiting_on_routine_to_block = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L526" class="LineNr">526 </span> <span class="Delimiter">}</span> <span id="L527" class="LineNr">527 </span> <span class="Delimiter">}</span> @@ -593,15 +593,15 @@ if ('onhashchange' in window) { <span id="L532" class="LineNr">532 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L533" class="LineNr">533 </span>RESTART<span class="Delimiter">,</span> <span id="L534" class="LineNr">534 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L535" class="LineNr">535 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"restart"</span><span class="Delimiter">,</span> RESTART<span class="Delimiter">);</span> +<span id="L535" class="LineNr">535 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"restart"</span><span class="Delimiter">,</span> RESTART<span class="Delimiter">);</span> <span id="L536" class="LineNr">536 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L537" class="LineNr">537 </span><span class="Normal">case</span> RESTART: <span class="Delimiter">{</span> -<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> -<span id="L539" class="LineNr">539 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'restart' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L538" class="LineNr">538 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L539" class="LineNr">539 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'restart' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L540" class="LineNr">540 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L541" class="LineNr">541 </span> <span class="Delimiter">}</span> <span id="L542" class="LineNr">542 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L543" class="LineNr">543 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'restart' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L543" class="LineNr">543 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'restart' should be a routine id generated by 'start-running', but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L544" class="LineNr">544 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L545" class="LineNr">545 </span> <span class="Delimiter">}</span> <span id="L546" class="LineNr">546 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -609,10 +609,10 @@ if ('onhashchange' in window) { <span id="L548" class="LineNr">548 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L549" class="LineNr">549 </span><span class="Normal">case</span> RESTART: <span class="Delimiter">{</span> <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> -<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 < SIZE<span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Routines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>id == id<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">)-></span>state == WAITING<span class="Delimiter">)</span> -<span id="L554" class="LineNr">554 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = RUNNING<span class="Delimiter">;</span> +<span id="L554" class="LineNr">554 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>state = <a href='072scheduler.cc.html#L41'>RUNNING</a><span class="Delimiter">;</span> <span id="L555" class="LineNr">555 </span> Routines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)-></span>blocked = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L556" class="LineNr">556 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L557" class="LineNr">557 </span> <span class="Delimiter">}</span> @@ -622,7 +622,7 @@ if ('onhashchange' in window) { <span id="L561" class="LineNr">561 </span> <span id="L562" class="LineNr">562 </span><span class="Delimiter">:(scenario cannot_restart_completed_routine)</span> <span id="L563" class="LineNr">563 </span><span class="Special">% Scheduling_interval = 1;</span> -<span id="L564" class="LineNr">564 </span><span class="muRecipe">def</span> main [ +<span id="L564" class="LineNr">564 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L565" class="LineNr">565 </span> local-scope <span id="L566" class="LineNr">566 </span> <span class="Normal">r</span>:num/routine-id<span class="Special"> <- </span>start-running f <span id="L567" class="LineNr">567 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># wait for f to be scheduled</span> @@ -637,7 +637,7 @@ if ('onhashchange' in window) { <span id="L576" class="LineNr">576 </span> <span id="L577" class="LineNr">577 </span><span class="Delimiter">:(scenario restart_blocked_routine)</span> <span id="L578" class="LineNr">578 </span><span class="Special">% Scheduling_interval = 1;</span> -<span id="L579" class="LineNr">579 </span><span class="muRecipe">def</span> main [ +<span id="L579" class="LineNr">579 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L580" class="LineNr">580 </span> local-scope <span id="L581" class="LineNr">581 </span> <span class="Normal">r</span>:num/routine-id<span class="Special"> <- </span>start-running f <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> diff --git a/html/074deep_copy.cc.html b/html/074deep_copy.cc.html index 424bd2a9..858dc72c 100644 --- a/html/074deep_copy.cc.html +++ b/html/074deep_copy.cc.html @@ -71,7 +71,7 @@ if ('onhashchange' in window) { <span id="L11" class="LineNr"> 11 </span><span class="Comment">// to new cycles in the product.</span> <span id="L12" class="LineNr"> 12 </span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario deep_copy_number)</span> -<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [ +<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L15" class="LineNr"> 15 </span> local-scope <span id="L16" class="LineNr"> 16 </span> <span class="Normal">x</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L17" class="LineNr"> 17 </span> <span class="Normal">y</span>:num<span class="Special"> <- </span>deep-copy x @@ -85,7 +85,7 @@ if ('onhashchange' in window) { <span id="L25" class="LineNr"> 25 </span> <span class="Normal">x</span>:num <span id="L26" class="LineNr"> 26 </span> <span class="Normal">y</span>:num <span id="L27" class="LineNr"> 27 </span>] -<span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> main [ +<span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L29" class="LineNr"> 29 </span> local-scope <span id="L30" class="LineNr"> 30 </span> <span class="Normal">a</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L31" class="LineNr"> 31 </span> <span class="Normal">b</span>:foo<span class="Special"> <- </span>deep-copy a @@ -96,7 +96,7 @@ if ('onhashchange' in window) { <span id="L36" class="LineNr"> 36 </span> <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(scenario deep_copy_address)</span> <span id="L38" class="LineNr"> 38 </span><span class="Special">% Memory_allocated_until = 200;</span> -<span id="L39" class="LineNr"> 39 </span><span class="muRecipe">def</span> main [ +<span id="L39" class="LineNr"> 39 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L40" class="LineNr"> 40 </span> <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span> <span id="L41" class="LineNr"> 41 </span> <span class="Comment"># that the result is deterministic</span> <span id="L42" class="LineNr"> 42 </span> <span class="Constant">1</span>:&:num<span class="Special"> <- </span>copy <span class="Constant">100</span>/unsafe <span class="Comment"># pretend allocation</span> @@ -118,7 +118,7 @@ if ('onhashchange' in window) { <span id="L58" class="LineNr"> 58 </span> <span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(scenario deep_copy_address_to_container)</span> <span id="L60" class="LineNr"> 60 </span><span class="Special">% Memory_allocated_until = 200;</span> -<span id="L61" class="LineNr"> 61 </span><span class="muRecipe">def</span> main [ +<span id="L61" class="LineNr"> 61 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L62" class="LineNr"> 62 </span> <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span> <span id="L63" class="LineNr"> 63 </span> <span class="Comment"># that the result is deterministic</span> <span id="L64" class="LineNr"> 64 </span> <span class="Constant">1</span>:&:point<span class="Special"> <- </span>copy <span class="Constant">100</span>/unsafe <span class="Comment"># pretend allocation</span> @@ -134,7 +134,7 @@ if ('onhashchange' in window) { <span id="L74" class="LineNr"> 74 </span> <span id="L75" class="LineNr"> 75 </span><span class="Delimiter">:(scenario deep_copy_address_to_address)</span> <span id="L76" class="LineNr"> 76 </span><span class="Special">% Memory_allocated_until = 200;</span> -<span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> main [ +<span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L78" class="LineNr"> 78 </span> <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span> <span id="L79" class="LineNr"> 79 </span> <span class="Comment"># that the result is deterministic</span> <span id="L80" class="LineNr"> 80 </span> <span class="Constant">1</span>:&:&:num<span class="Special"> <- </span>copy <span class="Constant">100</span>/unsafe <span class="Comment"># pretend allocation</span> @@ -154,7 +154,7 @@ if ('onhashchange' in window) { <span id="L94" class="LineNr"> 94 </span> <span id="L95" class="LineNr"> 95 </span><span class="Delimiter">:(scenario deep_copy_array)</span> <span id="L96" class="LineNr"> 96 </span><span class="Special">% Memory_allocated_until = 200;</span> -<span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> main [ +<span id="L97" class="LineNr"> 97 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L98" class="LineNr"> 98 </span> <span class="Comment"># avoid all memory allocations except the implicit ones inside deep-copy, so</span> <span id="L99" class="LineNr"> 99 </span> <span class="Comment"># that the result is deterministic</span> <span id="L100" class="LineNr">100 </span> <span class="Constant">100</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> <span class="Comment"># pretend refcount</span> @@ -182,7 +182,7 @@ if ('onhashchange' in window) { <span id="L122" class="LineNr">122 </span> <span class="Normal">x</span>:num <span id="L123" class="LineNr">123 </span> <span class="Normal">y</span>:&:num <span id="L124" class="LineNr">124 </span>] -<span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> main [ +<span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L126" class="LineNr">126 </span> local-scope <span id="L127" class="LineNr">127 </span> <span class="Normal">y0</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L128" class="LineNr">128 </span> *y0<span class="Special"> <- </span>copy <span class="Constant">35</span> @@ -204,7 +204,7 @@ if ('onhashchange' in window) { <span id="L144" class="LineNr">144 </span> <span class="Normal">x</span>:num <span id="L145" class="LineNr">145 </span> <span class="Normal">y</span>:&:num <span id="L146" class="LineNr">146 </span>] -<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> main [ +<span id="L147" class="LineNr">147 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L148" class="LineNr">148 </span> local-scope <span id="L149" class="LineNr">149 </span> <span class="Normal">y0</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L150" class="LineNr">150 </span> *y0<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -229,7 +229,7 @@ if ('onhashchange' in window) { <span id="L169" class="LineNr">169 </span><span class="muData">container</span> bar [ <span id="L170" class="LineNr">170 </span> <span class="Normal">x</span>:&:num <span id="L171" class="LineNr">171 </span>] -<span id="L172" class="LineNr">172 </span><span class="muRecipe">def</span> main [ +<span id="L172" class="LineNr">172 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L173" class="LineNr">173 </span> local-scope <span id="L174" class="LineNr">174 </span> <span class="Normal">y0</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L175" class="LineNr">175 </span> *y0<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -251,19 +251,19 @@ if ('onhashchange' in window) { <span id="L191" class="LineNr">191 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L192" class="LineNr">192 </span>DEEP_COPY<span class="Delimiter">,</span> <span id="L193" class="LineNr">193 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L194" class="LineNr">194 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"deep-copy"</span><span class="Delimiter">,</span> DEEP_COPY<span class="Delimiter">);</span> +<span id="L194" class="LineNr">194 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"deep-copy"</span><span class="Delimiter">,</span> DEEP_COPY<span class="Delimiter">);</span> <span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L196" class="LineNr">196 </span><span class="Normal">case</span> DEEP_COPY: <span class="Delimiter">{</span> -<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> -<span id="L198" class="LineNr">198 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'deep-copy' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L197" class="LineNr">197 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L198" class="LineNr">198 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'deep-copy' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L199" class="LineNr">199 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L200" class="LineNr">200 </span> <span class="Delimiter">}</span> -<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> -<span id="L202" class="LineNr">202 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'deep-copy' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L201" class="LineNr">201 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L202" class="LineNr">202 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'deep-copy' takes exactly one ingredient rather than '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L203" class="LineNr">203 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L204" class="LineNr">204 </span> <span class="Delimiter">}</span> <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> -<span id="L206" class="LineNr">206 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'deep-copy' requires its ingredient and product to be the same type, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L206" class="LineNr">206 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'deep-copy' requires its ingredient and product to be the same type, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L207" class="LineNr">207 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> <span id="L209" class="LineNr">209 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -272,13 +272,13 @@ if ('onhashchange' in window) { <span id="L212" class="LineNr">212 </span><span class="Normal">case</span> DEEP_COPY: <span class="Delimiter">{</span> <span id="L213" class="LineNr">213 </span> <span class="Normal">const</span> reagent& 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 id="L214" class="LineNr">214 </span> <span class="Comment">// allocate a tiny bit of temporary space for deep_copy()</span> -<span id="L215" class="LineNr">215 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: allocating space for temporary"</span> << end<span class="Delimiter">();</span> -<span id="L216" class="LineNr">216 </span> reagent tmp<span class="Delimiter">(</span><span class="Constant">"tmp:address:number"</span><span class="Delimiter">);</span> -<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> +<span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: allocating space for temporary"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L216" class="LineNr">216 </span> reagent tmp<span class="Delimiter">(</span><span class="Constant">"tmp:<a href='043space.cc.html#L76'>address</a>:number"</span><span class="Delimiter">);</span> +<span id="L217" class="LineNr">217 </span> tmp<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>allocate<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">));</span> <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> <span id="L219" class="LineNr">219 </span> <span class="Comment">// reclaim Mu memory allocated for tmp</span> -<span id="L220" class="LineNr">220 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: reclaiming temporary"</span> << end<span class="Delimiter">();</span> -<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> +<span id="L220" class="LineNr">220 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: reclaiming temporary"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L221" class="LineNr">221 </span> <a href='037abandon.cc.html#L28'>abandon</a><span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>value<span class="Delimiter">,</span> <a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>type<span class="Delimiter">),</span> <a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">(</span>tmp<span class="Delimiter">));</span> <span id="L222" class="LineNr">222 </span> <span class="Comment">// reclaim host memory allocated for tmp.type when tmp goes out of scope</span> <span id="L223" class="LineNr">223 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L224" class="LineNr">224 </span><span class="Delimiter">}</span> @@ -293,39 +293,39 @@ if ('onhashchange' in window) { <span id="L233" class="LineNr">233 </span> canonize<span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L234" class="LineNr">234 </span> vector<<span class="Normal">double</span>> result<span class="Delimiter">;</span> <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> -<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> +<span id="L236" class="LineNr">236 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='074deep_copy.cc.html#L243'>deep_copy_address</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">));</span> <span id="L237" class="LineNr">237 </span> <span class="Normal">else</span> <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> <span id="L239" class="LineNr">239 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L240" class="LineNr">240 </span><span class="Delimiter">}</span> <span id="L241" class="LineNr">241 </span> <span id="L242" class="LineNr">242 </span><span class="Comment">// deep-copy an address and return a new address</span> -<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& canonized_in<span class="Delimiter">,</span> map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>>& addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L243" class="LineNr">243 </span><span class="Normal">int</span> <a href='074deep_copy.cc.html#L243'>deep_copy_address</a><span class="Delimiter">(</span><span class="Normal">const</span> reagent& canonized_in<span class="Delimiter">,</span> map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>>& addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& tmp<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<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> -<span id="L246" class="LineNr">246 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: copying address "</span> << in_address << end<span class="Delimiter">();</span> +<span id="L245" class="LineNr">245 </span> <span class="Normal">int</span> in_address = <a href='074deep_copy.cc.html#L298'>payload_address</a><span class="Delimiter">(</span>canonized_in<span class="Delimiter">);</span> +<span id="L246" class="LineNr">246 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: copying <a href='043space.cc.html#L76'>address</a> "</span> << in_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <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> -<span id="L249" class="LineNr">249 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: copy already exists: "</span> << out << end<span class="Delimiter">();</span> +<span id="L249" class="LineNr">249 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: copy already exists: "</span> << out << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L250" class="LineNr">250 </span> <span class="Identifier">return</span> out<span class="Delimiter">;</span> <span id="L251" class="LineNr">251 </span> <span class="Delimiter">}</span> -<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> -<span id="L253" class="LineNr">253 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: new address is "</span> << out << end<span class="Delimiter">();</span> -<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> +<span id="L252" class="LineNr">252 </span> <span class="Normal">int</span> out = allocate<span class="Delimiter">(</span><a href='036refcount.cc.html#L82'>payload_size</a><span class="Delimiter">(</span>canonized_in<span class="Delimiter">));</span> +<span id="L253" class="LineNr">253 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: new <a href='043space.cc.html#L76'>address</a> is "</span> << out << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L254" class="LineNr">254 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>addresses_copied<span class="Delimiter">,</span> in_address<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <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> <span id="L256" class="LineNr">256 </span> payload<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"lookup"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> -<span id="L257" class="LineNr">257 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"recursing on payload "</span> << payload<span class="Delimiter">.</span>value << <span class="Constant">' '</span> << to_string<span class="Delimiter">(</span>payload<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L257" class="LineNr">257 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"recursing on payload "</span> << payload<span class="Delimiter">.</span>value << <span class="Constant">' '</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>payload<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L258" class="LineNr">258 </span> vector<<span class="Normal">double</span>> data = deep_copy<span class="Delimiter">(</span>payload<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> -<span id="L259" class="LineNr">259 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: writing result "</span> << out << <span class="Constant">": "</span> << to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L259" class="LineNr">259 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: writing result "</span> << out << <span class="Constant">": "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>data<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L260" class="LineNr">260 </span> <span class="Comment">// HACK: write_memory interface isn't ideal for this situation; we need</span> <span id="L261" class="LineNr">261 </span> <span class="Comment">// a temporary location to help copy the payload.</span> -<span id="L262" class="LineNr">262 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: writing temporary "</span> << tmp<span class="Delimiter">.</span>value << <span class="Constant">": "</span> << out << end<span class="Delimiter">();</span> -<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> -<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> +<span id="L262" class="LineNr">262 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: writing temporary "</span> << tmp<span class="Delimiter">.</span>value << <span class="Constant">": "</span> << out << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L263" class="LineNr">263 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> tmp<span class="Delimiter">.</span>value<span class="Delimiter">,</span> out<span class="Delimiter">);</span> +<span id="L264" class="LineNr">264 </span> payload<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>value<span class="Delimiter">);</span> <span class="Comment">// now modified for output</span> <span id="L265" class="LineNr">265 </span> vector<<span class="Normal">double</span>> old_data = read_memory<span class="Delimiter">(</span>payload<span class="Delimiter">);</span> -<span id="L266" class="LineNr">266 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: really writing to "</span> << payload<span class="Delimiter">.</span>value << <span class="Constant">' '</span> << to_string<span class="Delimiter">(</span>payload<span class="Delimiter">)</span> << <span class="Constant">" (old value "</span> << to_string<span class="Delimiter">(</span>old_data<span class="Delimiter">)</span> << <span class="Constant">" new value "</span> << to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> << <span class="Constant">")"</span> << end<span class="Delimiter">();</span> +<span id="L266" class="LineNr">266 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: really writing to "</span> << payload<span class="Delimiter">.</span>value << <span class="Constant">' '</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>payload<span class="Delimiter">)</span> << <span class="Constant">" (old value "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>old_data<span class="Delimiter">)</span> << <span class="Constant">" new value "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>data<span class="Delimiter">)</span> << <span class="Constant">")"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L267" class="LineNr">267 </span> write_memory<span class="Delimiter">(</span>payload<span class="Delimiter">,</span> data<span class="Delimiter">);</span> -<span id="L268" class="LineNr">268 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: output is "</span> << to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L268" class="LineNr">268 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: output is "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>data<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L269" class="LineNr">269 </span> <span class="Identifier">return</span> out<span class="Delimiter">;</span> <span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span> <span id="L271" class="LineNr">271 </span> @@ -333,29 +333,29 @@ if ('onhashchange' in window) { <span id="L273" class="LineNr">273 </span><span class="Normal">void</span> deep_copy<span class="Delimiter">(</span><span class="Normal">const</span> reagent& canonized_in<span class="Delimiter">,</span> map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>>& addresses_copied<span class="Delimiter">,</span> <span class="Normal">const</span> reagent& tmp<span class="Delimiter">,</span> vector<<span class="Normal">double</span>>& out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L275" class="LineNr">275 </span> vector<<span class="Normal">double</span>> data = read_memory<span class="Delimiter">(</span>canonized_in<span class="Delimiter">);</span> -<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> +<span id="L276" class="LineNr">276 </span> out<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>out<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">(),</span> data<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> data<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> <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> -<span id="L278" class="LineNr">278 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: scanning for addresses in "</span> << to_string<span class="Delimiter">(</span>data<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L278" class="LineNr">278 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: scanning for addresses in "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>data<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L279" class="LineNr">279 </span> <span class="Normal">const</span> container_metadata& metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> canonized_in<span class="Delimiter">.</span>type<span class="Delimiter">);</span> -<span id="L280" class="LineNr">280 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >::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 id="L280" class="LineNr">280 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<set<tag_condition_info><span class="Delimiter">,</span> set<address_element_info> >::const_iterator p = metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != metadata<span class="Delimiter">.</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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">-></span>first<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L282" class="LineNr">282 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::const_iterator info = p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> info != p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L282" class="LineNr">282 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>set<address_element_info>::const_iterator info = p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> info != p<span class="Delimiter">-></span>second<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++info<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L283" class="LineNr">283 </span> <span class="Comment">// construct a fake reagent that reads directly from the appropriate</span> <span id="L284" class="LineNr">284 </span> <span class="Comment">// field of the container</span> <span id="L285" class="LineNr">285 </span> reagent curr<span class="Delimiter">;</span> -<span id="L286" class="LineNr">286 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">-></span>payload_type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> -<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">"address"</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">-></span>payload_type<span class="Delimiter">-></span>name<span class="Delimiter">),</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> +<span id="L286" class="LineNr">286 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>atom<span class="Delimiter">)</span> +<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">"address"</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">-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">-></span>name<span class="Delimiter">),</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> <span id="L288" class="LineNr">288 </span> <span class="Normal">else</span> -<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">"address"</span><span class="Delimiter">),</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*info<span class="Delimiter">-></span>payload_type<span class="Delimiter">));</span> -<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">-></span>offset<span class="Delimiter">);</span> +<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">"address"</span><span class="Delimiter">),</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*info<span class="Delimiter">-></span><a href='030container.cc.html#L238'>payload_type</a><span class="Delimiter">));</span> +<span id="L290" class="LineNr">290 </span> curr<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>canonized_in<span class="Delimiter">.</span>value + info<span class="Delimiter">-></span>offset<span class="Delimiter">);</span> <span id="L291" class="LineNr">291 </span> curr<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"raw"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> -<span id="L292" class="LineNr">292 </span> trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: copying address "</span> << curr<span class="Delimiter">.</span>value << end<span class="Delimiter">();</span> -<span id="L293" class="LineNr">293 </span> out<span class="Delimiter">.</span>at<span class="Delimiter">(</span>info<span class="Delimiter">-></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 id="L292" class="LineNr">292 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"deep-copy: copying <a href='043space.cc.html#L76'>address</a> "</span> << curr<span class="Delimiter">.</span>value << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L293" class="LineNr">293 </span> out<span class="Delimiter">.</span>at<span class="Delimiter">(</span>info<span class="Delimiter">-></span>offset<span class="Delimiter">)</span> = <a href='074deep_copy.cc.html#L243'>deep_copy_address</a><span class="Delimiter">(</span>curr<span class="Delimiter">,</span> addresses_copied<span class="Delimiter">,</span> tmp<span class="Delimiter">);</span> <span id="L294" class="LineNr">294 </span> <span class="Delimiter">}</span> <span id="L295" class="LineNr">295 </span> <span class="Delimiter">}</span> <span id="L296" class="LineNr">296 </span><span class="Delimiter">}</span> <span id="L297" class="LineNr">297 </span> -<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> +<span id="L298" class="LineNr">298 </span><span class="Normal">int</span> <a href='074deep_copy.cc.html#L298'>payload_address</a><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 id="L299" class="LineNr">299 </span> x<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"lookup"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> <span id="L300" class="LineNr">300 </span> canonize<span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L301" class="LineNr">301 </span> <span class="Identifier">return</span> x<span class="Delimiter">.</span>value<span class="Delimiter">;</span> @@ -374,7 +374,7 @@ if ('onhashchange' in window) { <span id="L314" class="LineNr">314 </span> <span class="Normal">p</span>:&:foo1 <span id="L315" class="LineNr">315 </span> <span class="Normal">q</span>:&:foo2 <span id="L316" class="LineNr">316 </span>] -<span id="L317" class="LineNr">317 </span><span class="muRecipe">def</span> main [ +<span id="L317" class="LineNr">317 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L318" class="LineNr">318 </span> local-scope <span id="L319" class="LineNr">319 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L320" class="LineNr">320 </span> *x<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -406,7 +406,7 @@ if ('onhashchange' in window) { <span id="L346" class="LineNr">346 </span> <span class="Normal">p</span>:num <span id="L347" class="LineNr">347 </span> <span class="Normal">q</span>:&:foo3 <span id="L348" class="LineNr">348 </span>] -<span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> main [ +<span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L350" class="LineNr">350 </span> local-scope <span id="L351" class="LineNr">351 </span> <span class="Normal">x</span>:&:num<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L352" class="LineNr">352 </span> *x<span class="Special"> <- </span>copy <span class="Constant">34</span> @@ -431,11 +431,11 @@ if ('onhashchange' in window) { <span id="L371" class="LineNr">371 </span> <span class="Normal">p</span>:num <span id="L372" class="LineNr">372 </span> <span class="Normal">q</span>:&:foo <span id="L373" class="LineNr">373 </span>] -<span id="L374" class="LineNr">374 </span><span class="muRecipe">def</span> main [ +<span id="L374" class="LineNr">374 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L375" class="LineNr">375 </span> local-scope <span id="L376" class="LineNr">376 </span> <span class="Normal">x</span>:&:foo<span class="Special"> <- </span><span class="Normal">new</span> <span class="Constant">foo:type</span> -<span id="L377" class="LineNr">377 </span> *x<span class="Special"> <- </span>put *x<span class="Delimiter">,</span> <span class="Constant">p:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> -<span id="L378" class="LineNr">378 </span> *x<span class="Special"> <- </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 id="L377" class="LineNr">377 </span> *x<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *x<span class="Delimiter">,</span> <span class="Constant">p:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> +<span id="L378" class="LineNr">378 </span> *x<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> *x<span class="Delimiter">,</span> <span class="Constant">q:offset</span><span class="Delimiter">,</span> x <span class="Comment"># create a cycle</span> <span id="L379" class="LineNr">379 </span> <span class="Normal">y</span>:&:foo<span class="Special"> <- </span>deep-copy x <span id="L380" class="LineNr">380 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>get *y<span class="Delimiter">,</span> <span class="Constant">p:offset</span> <span id="L381" class="LineNr">381 </span> <span class="Normal">y2</span>:&:foo<span class="Special"> <- </span>get *y<span class="Delimiter">,</span> <span class="Constant">q:offset</span> diff --git a/html/075channel.mu.html b/html/075channel.mu.html index 4b4652dd..fbc9f63b 100644 --- a/html/075channel.mu.html +++ b/html/075channel.mu.html @@ -77,8 +77,8 @@ if ('onhashchange' in window) { <span id="L17" class="LineNr"> 17 </span><span class="muScenario">scenario</span> channel [ <span id="L18" class="LineNr"> 18 </span> run [ <span id="L19" class="LineNr"> 19 </span> <span class="Constant">local-scope</span> -<span id="L20" class="LineNr"> 20 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> new-channel <span class="Constant">3/capacity</span> -<span id="L21" class="LineNr"> 21 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> +<span id="L20" class="LineNr"> 20 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> +<span id="L21" class="LineNr"> 21 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> <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"><-</span> read source <span id="L23" class="LineNr"> 23 </span> ] <span id="L24" class="LineNr"> 24 </span> memory-should-contain [ @@ -108,14 +108,14 @@ if ('onhashchange' in window) { <span id="L48" class="LineNr"> 48 </span> chan:&:channel:_elem <span id="L49" class="LineNr"> 49 </span>] <span id="L50" class="LineNr"> 50 </span> -<span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> new-channel capacity:num<span class="muRecipe"> -> </span>in:&:source:_elem, out:&:sink:_elem [ +<span id="L51" class="LineNr"> 51 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L51'>new-channel</a> <a href='075channel.mu.html#L379'>capacity</a>:num<span class="muRecipe"> -> </span>in:&:source:_elem, out:&:sink:_elem [ <span id="L52" class="LineNr"> 52 </span> <span class="Constant">local-scope</span> <span id="L53" class="LineNr"> 53 </span> <span class="Constant">load-ingredients</span> <span id="L54" class="LineNr"> 54 </span> result:&:channel:_elem <span class="Special"><-</span> new <span class="Delimiter">{</span>(channel _elem): type<span class="Delimiter">}</span> <span id="L55" class="LineNr"> 55 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">first-full:offset</span>,<span class="Constant"> 0</span> <span id="L56" class="LineNr"> 56 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">first-free:offset</span>,<span class="Constant"> 0</span> -<span id="L57" class="LineNr"> 57 </span> capacity <span class="Special"><-</span> add capacity,<span class="Constant"> 1</span> <span class="Comment"># unused slot for 'full?' below</span> -<span id="L58" class="LineNr"> 58 </span> data:&:@:_elem <span class="Special"><-</span> new <span class="Constant">_elem:type</span>, capacity +<span id="L57" class="LineNr"> 57 </span> <a href='075channel.mu.html#L379'>capacity</a> <span class="Special"><-</span> add <a href='075channel.mu.html#L379'>capacity</a>,<span class="Constant"> 1</span> <span class="Comment"># unused slot for 'full?' below</span> +<span id="L58" class="LineNr"> 58 </span> data:&:@:_elem <span class="Special"><-</span> new <span class="Constant">_elem:type</span>, <a href='075channel.mu.html#L379'>capacity</a> <span id="L59" class="LineNr"> 59 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">data:offset</span>, data <span id="L60" class="LineNr"> 60 </span> in <span class="Special"><-</span> new <span class="Delimiter">{</span>(source _elem): type<span class="Delimiter">}</span> <span id="L61" class="LineNr"> 61 </span> *in <span class="Special"><-</span> put *in, <span class="Constant">chan:offset</span>, result @@ -123,7 +123,7 @@ if ('onhashchange' in window) { <span id="L63" class="LineNr"> 63 </span> *out <span class="Special"><-</span> put *out, <span class="Constant">chan:offset</span>, result <span id="L64" class="LineNr"> 64 </span>] <span id="L65" class="LineNr"> 65 </span> -<span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> write out:&:sink:_elem, val:_elem<span class="muRecipe"> -> </span>out:&:sink:_elem [ +<span id="L66" class="LineNr"> 66 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L66'>write</a> out:&:sink:_elem, val:_elem<span class="muRecipe"> -> </span>out:&:sink:_elem [ <span id="L67" class="LineNr"> 67 </span> <span class="Constant">local-scope</span> <span id="L68" class="LineNr"> 68 </span> <span class="Constant">load-ingredients</span> <span id="L69" class="LineNr"> 69 </span> assert out, <span class="Constant">[write to null channel]</span> @@ -136,7 +136,7 @@ if ('onhashchange' in window) { <span id="L76" class="LineNr"> 76 </span><span class="CommentedCode">#? $print [trying to acquire lock for writing], 10/newline</span> <span id="L77" class="LineNr"> 77 </span> wait-for-reset-then-set lock <span id="L78" class="LineNr"> 78 </span><span class="CommentedCode">#? $print [lock acquired for writing], 10/newline</span> -<span id="L79" class="LineNr"> 79 </span> full?:bool <span class="Special"><-</span> channel-full? chan +<span id="L79" class="LineNr"> 79 </span> full?:bool <span class="Special"><-</span> <a href='075channel.mu.html#L361'>channel-full?</a> chan <span id="L80" class="LineNr"> 80 </span> <span class="muControl">break-unless</span> full? <span id="L81" class="LineNr"> 81 </span><span class="CommentedCode">#? $print [but channel is full; relinquishing lock], 10/newline</span> <span id="L82" class="LineNr"> 82 </span> <span class="Comment"># channel is full; relinquish lock and give a reader the opportunity to</span> @@ -181,7 +181,7 @@ if ('onhashchange' in window) { <span id="L121" class="LineNr">121 </span><span class="CommentedCode">#? $print [trying to acquire lock for reading], 10/newline</span> <span id="L122" class="LineNr">122 </span> wait-for-reset-then-set lock <span id="L123" class="LineNr">123 </span><span class="CommentedCode">#? $print [lock acquired for reading], 10/newline</span> -<span id="L124" class="LineNr">124 </span> empty?:bool <span class="Special"><-</span> channel-empty? chan +<span id="L124" class="LineNr">124 </span> empty?:bool <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> chan <span id="L125" class="LineNr">125 </span> <span class="muControl">break-unless</span> empty? <span id="L126" class="LineNr">126 </span><span class="CommentedCode">#? $print [but channel is empty; relinquishing lock], 10/newline</span> <span id="L127" class="LineNr">127 </span> <span class="Comment"># channel is empty; relinquish lock and give a writer the opportunity to</span> @@ -218,12 +218,12 @@ if ('onhashchange' in window) { <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> <span id="L159" class="LineNr">159 </span><span class="Comment"># aggregates (arrays, lists, ..) of _elems at once.</span> <span id="L160" class="LineNr">160 </span> -<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> clear in:&:source:_elem<span class="muRecipe"> -> </span>in:&:source:_elem [ +<span id="L161" class="LineNr">161 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L161'>clear</a> in:&:source:_elem<span class="muRecipe"> -> </span>in:&:source:_elem [ <span id="L162" class="LineNr">162 </span> <span class="Constant">local-scope</span> <span id="L163" class="LineNr">163 </span> <span class="Constant">load-ingredients</span> <span id="L164" class="LineNr">164 </span> chan:&:channel:_elem <span class="Special"><-</span> get *in, <span class="Constant">chan:offset</span> <span id="L165" class="LineNr">165 </span> <span class="Delimiter">{</span> -<span id="L166" class="LineNr">166 </span> empty?:bool <span class="Special"><-</span> channel-empty? chan +<span id="L166" class="LineNr">166 </span> empty?:bool <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> chan <span id="L167" class="LineNr">167 </span> <span class="muControl">break-if</span> empty? <span id="L168" class="LineNr">168 </span> _, _, in <span class="Special"><-</span> read in <span id="L169" class="LineNr">169 </span> <span class="Delimiter">}</span> @@ -232,7 +232,7 @@ if ('onhashchange' in window) { <span id="L172" class="LineNr">172 </span><span class="muScenario">scenario</span> channel-initialization [ <span id="L173" class="LineNr">173 </span> run [ <span id="L174" class="LineNr">174 </span> <span class="Constant">local-scope</span> -<span id="L175" class="LineNr">175 </span> source:&:source:num <span class="Special"><-</span> new-channel <span class="Constant">3/capacity</span> +<span id="L175" class="LineNr">175 </span> source:&:source:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> <span id="L176" class="LineNr">176 </span> chan:&:channel:num <span class="Special"><-</span> get *source, <span class="Constant">chan:offset</span> <span id="L177" class="LineNr">177 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> get *chan, <span class="Constant">first-full:offset</span> <span id="L178" class="LineNr">178 </span> 11:num/<span class="Special">raw</span> <span class="Special"><-</span> get *chan, <span class="Constant">first-free:offset</span> @@ -245,9 +245,9 @@ if ('onhashchange' in window) { <span id="L185" class="LineNr">185 </span> <span id="L186" class="LineNr">186 </span><span class="muScenario">scenario</span> channel-write-increments-free [ <span id="L187" class="LineNr">187 </span> <span class="Constant">local-scope</span> -<span id="L188" class="LineNr">188 </span> _, sink:&:sink:num <span class="Special"><-</span> new-channel <span class="Constant">3/capacity</span> +<span id="L188" class="LineNr">188 </span> _, sink:&:sink:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> <span id="L189" class="LineNr">189 </span> run [ -<span id="L190" class="LineNr">190 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> +<span id="L190" class="LineNr">190 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> <span id="L191" class="LineNr">191 </span> chan:&:channel:num <span class="Special"><-</span> get *sink, <span class="Constant">chan:offset</span> <span id="L192" class="LineNr">192 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> get *chan, <span class="Constant">first-full:offset</span> <span id="L193" class="LineNr">193 </span> 11:num/<span class="Special">raw</span> <span class="Special"><-</span> get *chan, <span class="Constant">first-free:offset</span> @@ -260,8 +260,8 @@ if ('onhashchange' in window) { <span id="L200" class="LineNr">200 </span> <span id="L201" class="LineNr">201 </span><span class="muScenario">scenario</span> channel-read-increments-full [ <span id="L202" class="LineNr">202 </span> <span class="Constant">local-scope</span> -<span id="L203" class="LineNr">203 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> new-channel <span class="Constant">3/capacity</span> -<span id="L204" class="LineNr">204 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> +<span id="L203" class="LineNr">203 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> +<span id="L204" class="LineNr">204 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> <span id="L205" class="LineNr">205 </span> run [ <span id="L206" class="LineNr">206 </span> _, _, source <span class="Special"><-</span> read source <span id="L207" class="LineNr">207 </span> chan:&:channel:num <span class="Special"><-</span> get *source, <span class="Constant">chan:offset</span> @@ -277,17 +277,17 @@ if ('onhashchange' in window) { <span id="L217" class="LineNr">217 </span><span class="muScenario">scenario</span> channel-wrap [ <span id="L218" class="LineNr">218 </span> <span class="Constant">local-scope</span> <span id="L219" class="LineNr">219 </span> <span class="Comment"># channel with just 1 slot</span> -<span id="L220" class="LineNr">220 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> new-channel <span class="Constant">1/capacity</span> +<span id="L220" class="LineNr">220 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">1/capacity</span> <span id="L221" class="LineNr">221 </span> chan:&:channel:num <span class="Special"><-</span> get *source, <span class="Constant">chan:offset</span> <span id="L222" class="LineNr">222 </span> <span class="Comment"># write and read a value</span> -<span id="L223" class="LineNr">223 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> +<span id="L223" class="LineNr">223 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> <span id="L224" class="LineNr">224 </span> _, _, source <span class="Special"><-</span> read source <span id="L225" class="LineNr">225 </span> run [ <span id="L226" class="LineNr">226 </span> <span class="Comment"># first-free will now be 1</span> <span id="L227" class="LineNr">227 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> get *chan, <span class="Constant">first-free:offset</span> <span id="L228" class="LineNr">228 </span> 11:num/<span class="Special">raw</span> <span class="Special"><-</span> get *chan, <span class="Constant">first-free:offset</span> <span id="L229" class="LineNr">229 </span> <span class="Comment"># write second value, verify that first-free wraps</span> -<span id="L230" class="LineNr">230 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> +<span id="L230" class="LineNr">230 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> <span id="L231" class="LineNr">231 </span> 20:num/<span class="Special">raw</span> <span class="Special"><-</span> get *chan, <span class="Constant">first-free:offset</span> <span id="L232" class="LineNr">232 </span> <span class="Comment"># read second value, verify that first-full wraps</span> <span id="L233" class="LineNr">233 </span> _, _, source <span class="Special"><-</span> read source @@ -304,10 +304,10 @@ if ('onhashchange' in window) { <span id="L244" class="LineNr">244 </span><span class="muScenario">scenario</span> channel-new-empty-not-full [ <span id="L245" class="LineNr">245 </span> run [ <span id="L246" class="LineNr">246 </span> <span class="Constant">local-scope</span> -<span id="L247" class="LineNr">247 </span> source:&:source:num <span class="Special"><-</span> new-channel <span class="Constant">3/capacity</span> +<span id="L247" class="LineNr">247 </span> source:&:source:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> <span id="L248" class="LineNr">248 </span> chan:&:channel:num <span class="Special"><-</span> get *source, <span class="Constant">chan:offset</span> -<span id="L249" class="LineNr">249 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-empty? chan -<span id="L250" class="LineNr">250 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-full? chan +<span id="L249" class="LineNr">249 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> chan +<span id="L250" class="LineNr">250 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L361'>channel-full?</a> chan <span id="L251" class="LineNr">251 </span> ] <span id="L252" class="LineNr">252 </span> memory-should-contain [ <span id="L253" class="LineNr">253 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># empty?</span> @@ -317,12 +317,12 @@ if ('onhashchange' in window) { <span id="L257" class="LineNr">257 </span> <span id="L258" class="LineNr">258 </span><span class="muScenario">scenario</span> channel-write-not-empty [ <span id="L259" class="LineNr">259 </span> <span class="Constant">local-scope</span> -<span id="L260" class="LineNr">260 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> new-channel <span class="Constant">3/capacity</span> +<span id="L260" class="LineNr">260 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> <span id="L261" class="LineNr">261 </span> chan:&:channel:num <span class="Special"><-</span> get *source, <span class="Constant">chan:offset</span> <span id="L262" class="LineNr">262 </span> run [ -<span id="L263" class="LineNr">263 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> -<span id="L264" class="LineNr">264 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-empty? chan -<span id="L265" class="LineNr">265 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-full? chan +<span id="L263" class="LineNr">263 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> +<span id="L264" class="LineNr">264 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> chan +<span id="L265" class="LineNr">265 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L361'>channel-full?</a> chan <span id="L266" class="LineNr">266 </span> ] <span id="L267" class="LineNr">267 </span> memory-should-contain [ <span id="L268" class="LineNr">268 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># empty?</span> @@ -332,12 +332,12 @@ if ('onhashchange' in window) { <span id="L272" class="LineNr">272 </span> <span id="L273" class="LineNr">273 </span><span class="muScenario">scenario</span> channel-write-full [ <span id="L274" class="LineNr">274 </span> <span class="Constant">local-scope</span> -<span id="L275" class="LineNr">275 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> new-channel <span class="Constant">1/capacity</span> +<span id="L275" class="LineNr">275 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">1/capacity</span> <span id="L276" class="LineNr">276 </span> chan:&:channel:num <span class="Special"><-</span> get *source, <span class="Constant">chan:offset</span> <span id="L277" class="LineNr">277 </span> run [ -<span id="L278" class="LineNr">278 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> -<span id="L279" class="LineNr">279 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-empty? chan -<span id="L280" class="LineNr">280 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-full? chan +<span id="L278" class="LineNr">278 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> +<span id="L279" class="LineNr">279 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> chan +<span id="L280" class="LineNr">280 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L361'>channel-full?</a> chan <span id="L281" class="LineNr">281 </span> ] <span id="L282" class="LineNr">282 </span> memory-should-contain [ <span id="L283" class="LineNr">283 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># empty?</span> @@ -347,13 +347,13 @@ if ('onhashchange' in window) { <span id="L287" class="LineNr">287 </span> <span id="L288" class="LineNr">288 </span><span class="muScenario">scenario</span> channel-read-not-full [ <span id="L289" class="LineNr">289 </span> <span class="Constant">local-scope</span> -<span id="L290" class="LineNr">290 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> new-channel <span class="Constant">1/capacity</span> +<span id="L290" class="LineNr">290 </span> source:&:source:num, sink:&:sink:num <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">1/capacity</span> <span id="L291" class="LineNr">291 </span> chan:&:channel:num <span class="Special"><-</span> get *source, <span class="Constant">chan:offset</span> -<span id="L292" class="LineNr">292 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 34</span> +<span id="L292" class="LineNr">292 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 34</span> <span id="L293" class="LineNr">293 </span> run [ <span id="L294" class="LineNr">294 </span> _, _, source <span class="Special"><-</span> read source -<span id="L295" class="LineNr">295 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-empty? chan -<span id="L296" class="LineNr">296 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> channel-full? chan +<span id="L295" class="LineNr">295 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> chan +<span id="L296" class="LineNr">296 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='075channel.mu.html#L361'>channel-full?</a> chan <span id="L297" class="LineNr">297 </span> ] <span id="L298" class="LineNr">298 </span> memory-should-contain [ <span id="L299" class="LineNr">299 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># empty?</span> @@ -407,7 +407,7 @@ if ('onhashchange' in window) { <span id="L347" class="LineNr">347 </span><span class="SalientComment">## helpers</span> <span id="L348" class="LineNr">348 </span> <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> -<span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> channel-empty? chan:&:channel:_elem<span class="muRecipe"> -> </span>result:bool [ +<span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L350'>channel-empty?</a> chan:&:channel:_elem<span class="muRecipe"> -> </span>result:bool [ <span id="L351" class="LineNr">351 </span> <span class="Constant">local-scope</span> <span id="L352" class="LineNr">352 </span> <span class="Constant">load-ingredients</span> <span id="L353" class="LineNr">353 </span> <span class="Comment"># return chan.first-full == chan.first-free</span> @@ -418,7 +418,7 @@ if ('onhashchange' in window) { <span id="L358" class="LineNr">358 </span> <span id="L359" class="LineNr">359 </span><span class="Comment"># A full channel has first-empty just before first-full, wasting one slot.</span> <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> -<span id="L361" class="LineNr">361 </span><span class="muRecipe">def</span> channel-full? chan:&:channel:_elem<span class="muRecipe"> -> </span>result:bool [ +<span id="L361" class="LineNr">361 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L361'>channel-full?</a> chan:&:channel:_elem<span class="muRecipe"> -> </span>result:bool [ <span id="L362" class="LineNr">362 </span> <span class="Constant">local-scope</span> <span id="L363" class="LineNr">363 </span> <span class="Constant">load-ingredients</span> <span id="L364" class="LineNr">364 </span> <span class="Comment"># tmp = chan.first-free + 1</span> @@ -426,7 +426,7 @@ if ('onhashchange' in window) { <span id="L366" class="LineNr">366 </span> tmp <span class="Special"><-</span> add tmp,<span class="Constant"> 1</span> <span id="L367" class="LineNr">367 </span> <span class="Delimiter">{</span> <span id="L368" class="LineNr">368 </span> <span class="Comment"># if tmp == chan.capacity, tmp = 0</span> -<span id="L369" class="LineNr">369 </span> len:num <span class="Special"><-</span> capacity chan +<span id="L369" class="LineNr">369 </span> len:num <span class="Special"><-</span> <a href='075channel.mu.html#L379'>capacity</a> chan <span id="L370" class="LineNr">370 </span> at-end?:bool <span class="Special"><-</span> greater-or-equal tmp, len <span id="L371" class="LineNr">371 </span> <span class="muControl">break-unless</span> at-end? <span id="L372" class="LineNr">372 </span> tmp <span class="Special"><-</span> copy<span class="Constant"> 0</span> @@ -436,7 +436,7 @@ if ('onhashchange' in window) { <span id="L376" class="LineNr">376 </span> result <span class="Special"><-</span> equal full, tmp <span id="L377" class="LineNr">377 </span>] <span id="L378" class="LineNr">378 </span> -<span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> capacity chan:&:channel:_elem<span class="muRecipe"> -> </span>result:num [ +<span id="L379" class="LineNr">379 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L379'>capacity</a> chan:&:channel:_elem<span class="muRecipe"> -> </span>result:num [ <span id="L380" class="LineNr">380 </span> <span class="Constant">local-scope</span> <span id="L381" class="LineNr">381 </span> <span class="Constant">load-ingredients</span> <span id="L382" class="LineNr">382 </span> q:&:@:_elem <span class="Special"><-</span> get *chan, <span class="Constant">data:offset</span> @@ -445,13 +445,13 @@ if ('onhashchange' in window) { <span id="L385" class="LineNr">385 </span> <span id="L386" class="LineNr">386 </span><span class="SalientComment">## helpers for channels of characters in particular</span> <span id="L387" class="LineNr">387 </span> -<span id="L388" class="LineNr">388 </span><span class="muRecipe">def</span> buffer-lines in:&:source:char, buffered-out:&:sink:char<span class="muRecipe"> -> </span>buffered-out:&:sink:char, in:&:source:char [ +<span id="L388" class="LineNr">388 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L388'>buffer-lines</a> in:&:source:char, buffered-out:&:sink:char<span class="muRecipe"> -> </span>buffered-out:&:sink:char, in:&:source:char [ <span id="L389" class="LineNr">389 </span> <span class="Constant">local-scope</span> <span id="L390" class="LineNr">390 </span> <span class="Constant">load-ingredients</span> <span id="L391" class="LineNr">391 </span> <span class="Comment"># repeat forever</span> <span id="L392" class="LineNr">392 </span> eof?:bool <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span id="L393" class="LineNr">393 </span> <span class="Delimiter">{</span> -<span id="L394" class="LineNr">394 </span> line:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> +<span id="L394" class="LineNr">394 </span> line:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> <span id="L395" class="LineNr">395 </span> <span class="Comment"># read characters from 'in' until newline, copy into line</span> <span id="L396" class="LineNr">396 </span> <span class="Delimiter">{</span> <span id="L397" class="LineNr">397 </span><span class="Constant"> +next-character</span> @@ -487,7 +487,7 @@ if ('onhashchange' in window) { <span id="L427" class="LineNr">427 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, max <span id="L428" class="LineNr">428 </span> <span class="muControl">break-if</span> done? <span id="L429" class="LineNr">429 </span> c:char <span class="Special"><-</span> index *line-contents, i -<span id="L430" class="LineNr">430 </span> buffered-out <span class="Special"><-</span> write buffered-out, c +<span id="L430" class="LineNr">430 </span> buffered-out <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> buffered-out, c <span id="L431" class="LineNr">431 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L432" class="LineNr">432 </span> <span class="muControl">loop</span> <span id="L433" class="LineNr">433 </span> <span class="Delimiter">}</span> @@ -503,37 +503,37 @@ if ('onhashchange' in window) { <span id="L443" class="LineNr">443 </span><span class="muScenario">scenario</span> buffer-lines-blocks-until-newline [ <span id="L444" class="LineNr">444 </span> run [ <span id="L445" class="LineNr">445 </span> <span class="Constant">local-scope</span> -<span id="L446" class="LineNr">446 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">10/capacity</span> -<span id="L447" class="LineNr">447 </span> _, buffered-stdin:&:sink:char/buffered-stdin <span class="Special"><-</span> new-channel <span class="Constant">10/capacity</span> +<span id="L446" class="LineNr">446 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">10/capacity</span> +<span id="L447" class="LineNr">447 </span> _, buffered-stdin:&:sink:char/buffered-stdin <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">10/capacity</span> <span id="L448" class="LineNr">448 </span> buffered-chan:&:channel:char <span class="Special"><-</span> get *buffered-stdin, <span class="Constant">chan:offset</span> -<span id="L449" class="LineNr">449 </span> empty?:bool <span class="Special"><-</span> channel-empty? buffered-chan +<span id="L449" class="LineNr">449 </span> empty?:bool <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> buffered-chan <span id="L450" class="LineNr">450 </span> assert empty?, <span class="Constant">[ </span> <span id="L451" class="LineNr">451 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after init]</span> <span id="L452" class="LineNr">452 </span> <span class="Comment"># buffer stdin into buffered-stdin, try to read from buffered-stdin</span> -<span id="L453" class="LineNr">453 </span> buffer-routine:num <span class="Special"><-</span> start-running buffer-lines, source, buffered-stdin +<span id="L453" class="LineNr">453 </span> buffer-routine:num <span class="Special"><-</span> start-running <a href='075channel.mu.html#L388'>buffer-lines</a>, source, buffered-stdin <span id="L454" class="LineNr">454 </span> wait-for-routine-to-block buffer-routine -<span id="L455" class="LineNr">455 </span> empty? <span class="Special"><-</span> channel-empty? buffered-chan +<span id="L455" class="LineNr">455 </span> empty? <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> buffered-chan <span id="L456" class="LineNr">456 </span> assert empty?:bool, <span class="Constant">[ </span> -<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> +<span id="L457" class="LineNr">457 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after <a href='075channel.mu.html#L388'>buffer-lines</a> bring-up]</span> <span id="L458" class="LineNr">458 </span> <span class="Comment"># write 'a'</span> -<span id="L459" class="LineNr">459 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">97/a</span> +<span id="L459" class="LineNr">459 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">97/a</span> <span id="L460" class="LineNr">460 </span> restart buffer-routine <span id="L461" class="LineNr">461 </span> wait-for-routine-to-block buffer-routine -<span id="L462" class="LineNr">462 </span> empty? <span class="Special"><-</span> channel-empty? buffered-chan +<span id="L462" class="LineNr">462 </span> empty? <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> buffered-chan <span id="L463" class="LineNr">463 </span> assert empty?:bool, <span class="Constant">[ </span> <span id="L464" class="LineNr">464 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after writing 'a']</span> <span id="L465" class="LineNr">465 </span> <span class="Comment"># write 'b'</span> -<span id="L466" class="LineNr">466 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">98/b</span> +<span id="L466" class="LineNr">466 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">98/b</span> <span id="L467" class="LineNr">467 </span> restart buffer-routine <span id="L468" class="LineNr">468 </span> wait-for-routine-to-block buffer-routine -<span id="L469" class="LineNr">469 </span> empty? <span class="Special"><-</span> channel-empty? buffered-chan +<span id="L469" class="LineNr">469 </span> empty? <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> buffered-chan <span id="L470" class="LineNr">470 </span> assert empty?:bool, <span class="Constant">[ </span> <span id="L471" class="LineNr">471 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should be empty after writing 'b']</span> <span id="L472" class="LineNr">472 </span> <span class="Comment"># write newline</span> -<span id="L473" class="LineNr">473 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">10/newline</span> +<span id="L473" class="LineNr">473 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">10/newline</span> <span id="L474" class="LineNr">474 </span> restart buffer-routine <span id="L475" class="LineNr">475 </span> wait-for-routine-to-block buffer-routine -<span id="L476" class="LineNr">476 </span> empty? <span class="Special"><-</span> channel-empty? buffered-chan +<span id="L476" class="LineNr">476 </span> empty? <span class="Special"><-</span> <a href='075channel.mu.html#L350'>channel-empty?</a> buffered-chan <span id="L477" class="LineNr">477 </span> data-emitted?:bool <span class="Special"><-</span> not empty? <span id="L478" class="LineNr">478 </span> assert data-emitted?, <span class="Constant">[ </span> <span id="L479" class="LineNr">479 </span><span class="Constant">F buffer-lines-blocks-until-newline: channel should contain data after writing newline]</span> @@ -544,17 +544,17 @@ if ('onhashchange' in window) { <span id="L484" class="LineNr">484 </span> ] <span id="L485" class="LineNr">485 </span>] <span id="L486" class="LineNr">486 </span> -<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> drain source:&:source:char<span class="muRecipe"> -> </span>result:text, source:&:source:char [ +<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> <a href='075channel.mu.html#L487'>drain</a> source:&:source:char<span class="muRecipe"> -> </span>result:text, source:&:source:char [ <span id="L488" class="LineNr">488 </span> <span class="Constant">local-scope</span> <span id="L489" class="LineNr">489 </span> <span class="Constant">load-ingredients</span> -<span id="L490" class="LineNr">490 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> +<span id="L490" class="LineNr">490 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> <span id="L491" class="LineNr">491 </span> <span class="Delimiter">{</span> <span id="L492" class="LineNr">492 </span> c:char, done?:bool <span class="Special"><-</span> read source <span id="L493" class="LineNr">493 </span> <span class="muControl">break-if</span> done? <span id="L494" class="LineNr">494 </span> buf <span class="Special"><-</span> append buf, c <span id="L495" class="LineNr">495 </span> <span class="muControl">loop</span> <span id="L496" class="LineNr">496 </span> <span class="Delimiter">}</span> -<span id="L497" class="LineNr">497 </span> result <span class="Special"><-</span> buffer-to-array buf +<span id="L497" class="LineNr">497 </span> result <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L498" class="LineNr">498 </span>] </pre> </body> diff --git a/html/080display.cc.html b/html/080display.cc.html index e6b18d6f..2d4c2767 100644 --- a/html/080display.cc.html +++ b/html/080display.cc.html @@ -71,24 +71,24 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr"> 13 </span><span class="PreProc">#define CHECK_SCREEN \</span> <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> <span id="L15" class="LineNr"> 15 </span><span class="PreProc"> </span><span class="Normal">if</span><span class="PreProc"> (Run_tests) \</span> -<span id="L16" class="LineNr"> 16 </span><span class="PreProc"> raise << maybe(current_recipe_name()) << </span><span class="Constant">"tried to print to real screen in a test!</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> +<span id="L16" class="LineNr"> 16 </span><span class="PreProc"> <a href='003trace.cc.html#L178'>raise</a> << maybe(current_recipe_name()) << </span><span class="Constant">"tried to print to real screen in a test!</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> <span id="L17" class="LineNr"> 17 </span><span class="PreProc"> </span><span class="Normal">else</span><span class="PreProc"> \</span> -<span id="L18" class="LineNr"> 18 </span><span class="PreProc"> raise << maybe(current_recipe_name()) << </span><span class="Constant">"tried to print to real screen before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> +<span id="L18" class="LineNr"> 18 </span><span class="PreProc"> <a href='003trace.cc.html#L178'>raise</a> << maybe(current_recipe_name()) << </span><span class="Constant">"tried to print to real screen before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> <span id="L19" class="LineNr"> 19 </span><span class="PreProc"> </span><span class="Identifier">break</span><span class="Delimiter">;</span><span class="PreProc"> \</span> <span id="L20" class="LineNr"> 20 </span><span class="PreProc"> </span><span class="Delimiter">}</span> <span id="L21" class="LineNr"> 21 </span><span class="PreProc">#define CHECK_CONSOLE \</span> <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> <span id="L23" class="LineNr"> 23 </span><span class="PreProc"> </span><span class="Normal">if</span><span class="PreProc"> (Run_tests) \</span> -<span id="L24" class="LineNr"> 24 </span><span class="PreProc"> raise << maybe(current_recipe_name()) << </span><span class="Constant">"tried to read event from real keyboard/mouse in a test!</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> +<span id="L24" class="LineNr"> 24 </span><span class="PreProc"> <a href='003trace.cc.html#L178'>raise</a> << maybe(current_recipe_name()) << </span><span class="Constant">"tried to read event from real keyboard/mouse in a test!</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> <span id="L25" class="LineNr"> 25 </span><span class="PreProc"> </span><span class="Normal">else</span><span class="PreProc"> \</span> -<span id="L26" class="LineNr"> 26 </span><span class="PreProc"> raise << maybe(current_recipe_name()) << </span><span class="Constant">"tried to read event from real keyboard/mouse before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> +<span id="L26" class="LineNr"> 26 </span><span class="PreProc"> <a href='003trace.cc.html#L178'>raise</a> << maybe(current_recipe_name()) << </span><span class="Constant">"tried to read event from real keyboard/mouse before 'open-console' or after 'close-console'</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="PreProc"> << end()</span><span class="Delimiter">;</span><span class="PreProc"> \</span> <span id="L27" class="LineNr"> 27 </span><span class="PreProc"> </span><span class="Identifier">break</span><span class="Delimiter">;</span><span class="PreProc"> \</span> <span id="L28" class="LineNr"> 28 </span><span class="PreProc"> </span><span class="Delimiter">}</span> <span id="L29" class="LineNr"> 29 </span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L31" class="LineNr"> 31 </span>OPEN_CONSOLE<span class="Delimiter">,</span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L33" class="LineNr"> 33 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"open-console"</span><span class="Delimiter">,</span> OPEN_CONSOLE<span class="Delimiter">);</span> +<span id="L33" class="LineNr"> 33 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"open-console"</span><span class="Delimiter">,</span> OPEN_CONSOLE<span class="Delimiter">);</span> <span id="L34" class="LineNr"> 34 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L35" class="LineNr"> 35 </span><span class="Normal">case</span> OPEN_CONSOLE: <span class="Delimiter">{</span> <span id="L36" class="LineNr"> 36 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -101,16 +101,16 @@ if ('onhashchange' in window) { <span id="L43" class="LineNr"> 43 </span> <span class="Normal">int</span> height = tb_height<span class="Delimiter">();</span> <span id="L44" class="LineNr"> 44 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>width > <span class="Constant">222</span> || height > <span class="Constant">222</span><span class="Delimiter">)</span> tb_shutdown<span class="Delimiter">();</span> <span id="L45" class="LineNr"> 45 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>width > <span class="Constant">222</span><span class="Delimiter">)</span> -<span id="L46" class="LineNr"> 46 </span> raise << <span class="Constant">"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">"</span> << end<span class="Delimiter">();</span> +<span id="L46" class="LineNr"> 46 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"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">"</span> << end<span class="Delimiter">();</span> <span id="L47" class="LineNr"> 47 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>height > <span class="Constant">222</span><span class="Delimiter">)</span> -<span id="L48" class="LineNr"> 48 </span> raise << <span class="Constant">"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">"</span> << end<span class="Delimiter">();</span> +<span id="L48" class="LineNr"> 48 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"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">"</span> << end<span class="Delimiter">();</span> <span id="L49" class="LineNr"> 49 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L50" class="LineNr"> 50 </span><span class="Delimiter">}</span> <span id="L51" class="LineNr"> 51 </span> <span id="L52" class="LineNr"> 52 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L53" class="LineNr"> 53 </span>CLOSE_CONSOLE<span class="Delimiter">,</span> <span id="L54" class="LineNr"> 54 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L55" class="LineNr"> 55 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"close-console"</span><span class="Delimiter">,</span> CLOSE_CONSOLE<span class="Delimiter">);</span> +<span id="L55" class="LineNr"> 55 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"close-console"</span><span class="Delimiter">,</span> CLOSE_CONSOLE<span class="Delimiter">);</span> <span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L57" class="LineNr"> 57 </span><span class="Normal">case</span> CLOSE_CONSOLE: <span class="Delimiter">{</span> <span id="L58" class="LineNr"> 58 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -127,14 +127,14 @@ if ('onhashchange' in window) { <span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L70" class="LineNr"> 70 </span>CLEAR_DISPLAY<span class="Delimiter">,</span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L72" class="LineNr"> 72 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"clear-display"</span><span class="Delimiter">,</span> CLEAR_DISPLAY<span class="Delimiter">);</span> +<span id="L72" class="LineNr"> 72 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"clear-display"</span><span class="Delimiter">,</span> CLEAR_DISPLAY<span class="Delimiter">);</span> <span id="L73" class="LineNr"> 73 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L74" class="LineNr"> 74 </span><span class="Normal">case</span> CLEAR_DISPLAY: <span class="Delimiter">{</span> <span id="L75" class="LineNr"> 75 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L76" class="LineNr"> 76 </span><span class="Delimiter">}</span> <span id="L77" class="LineNr"> 77 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L78" class="LineNr"> 78 </span><span class="Normal">case</span> CLEAR_DISPLAY: <span class="Delimiter">{</span> -<span id="L79" class="LineNr"> 79 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L79" class="LineNr"> 79 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L80" class="LineNr"> 80 </span> tb_clear<span class="Delimiter">();</span> <span id="L81" class="LineNr"> 81 </span> Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L82" class="LineNr"> 82 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -143,14 +143,14 @@ if ('onhashchange' in window) { <span id="L85" class="LineNr"> 85 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L86" class="LineNr"> 86 </span>SYNC_DISPLAY<span class="Delimiter">,</span> <span id="L87" class="LineNr"> 87 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L88" class="LineNr"> 88 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"sync-display"</span><span class="Delimiter">,</span> SYNC_DISPLAY<span class="Delimiter">);</span> +<span id="L88" class="LineNr"> 88 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"sync-display"</span><span class="Delimiter">,</span> SYNC_DISPLAY<span class="Delimiter">);</span> <span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L90" class="LineNr"> 90 </span><span class="Normal">case</span> SYNC_DISPLAY: <span class="Delimiter">{</span> <span id="L91" class="LineNr"> 91 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span> <span id="L93" class="LineNr"> 93 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L94" class="LineNr"> 94 </span><span class="Normal">case</span> SYNC_DISPLAY: <span class="Delimiter">{</span> -<span id="L95" class="LineNr"> 95 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L95" class="LineNr"> 95 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L96" class="LineNr"> 96 </span> tb_sync<span class="Delimiter">();</span> <span id="L97" class="LineNr"> 97 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L98" class="LineNr"> 98 </span><span class="Delimiter">}</span> @@ -158,14 +158,14 @@ if ('onhashchange' in window) { <span id="L100" class="LineNr">100 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L101" class="LineNr">101 </span>CLEAR_LINE_ON_DISPLAY<span class="Delimiter">,</span> <span id="L102" class="LineNr">102 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L103" class="LineNr">103 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"clear-line-on-display"</span><span class="Delimiter">,</span> CLEAR_LINE_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L103" class="LineNr">103 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"clear-line-on-display"</span><span class="Delimiter">,</span> CLEAR_LINE_ON_DISPLAY<span class="Delimiter">);</span> <span id="L104" class="LineNr">104 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L105" class="LineNr">105 </span><span class="Normal">case</span> CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L106" class="LineNr">106 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L107" class="LineNr">107 </span><span class="Delimiter">}</span> <span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L109" class="LineNr">109 </span><span class="Normal">case</span> CLEAR_LINE_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L110" class="LineNr">110 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L110" class="LineNr">110 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L111" class="LineNr">111 </span> <span class="Normal">int</span> width = tb_width<span class="Delimiter">();</span> <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 < width<span class="Delimiter">;</span> ++x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> @@ -178,26 +178,26 @@ if ('onhashchange' in window) { <span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L121" class="LineNr">121 </span>PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">,</span> <span id="L122" class="LineNr">122 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L123" class="LineNr">123 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"print-character-to-display"</span><span class="Delimiter">,</span> PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">);</span> +<span id="L123" class="LineNr">123 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"print-character-to-display"</span><span class="Delimiter">,</span> PRINT_CHARACTER_TO_DISPLAY<span class="Delimiter">);</span> <span id="L124" class="LineNr">124 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L125" class="LineNr">125 </span><span class="Normal">case</span> PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span> <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> -<span id="L127" class="LineNr">127 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'print-character-to-display' requires at least one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L127" class="LineNr">127 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'print-character-to-display' requires at least one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L128" class="LineNr">128 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L129" class="LineNr">129 </span> <span class="Delimiter">}</span> <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> -<span id="L131" class="LineNr">131 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'print-character-to-display' should be a character, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L131" class="LineNr">131 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'print-character-to-display' should be a character, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L132" class="LineNr">132 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L133" class="LineNr">133 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L134" class="LineNr">134 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> -<span id="L136" class="LineNr">136 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'print-character-to-display' should be a foreground color number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L136" class="LineNr">136 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'print-character-to-display' should be a foreground color number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L137" class="LineNr">137 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L138" class="LineNr">138 </span> <span class="Delimiter">}</span> <span id="L139" class="LineNr">139 </span> <span class="Delimiter">}</span> -<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> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L140" class="LineNr">140 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="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> -<span id="L142" class="LineNr">142 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"third ingredient of 'print-character-to-display' should be a background color number, but got '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L142" class="LineNr">142 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"third ingredient of 'print-character-to-display' should be a background color number, but got '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L143" class="LineNr">143 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L144" class="LineNr">144 </span> <span class="Delimiter">}</span> <span id="L145" class="LineNr">145 </span> <span class="Delimiter">}</span> @@ -205,17 +205,17 @@ if ('onhashchange' in window) { <span id="L147" class="LineNr">147 </span><span class="Delimiter">}</span> <span id="L148" class="LineNr">148 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L149" class="LineNr">149 </span><span class="Normal">case</span> PRINT_CHARACTER_TO_DISPLAY: <span class="Delimiter">{</span> -<span id="L150" class="LineNr">150 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L150" class="LineNr">150 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <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> <span id="L152" class="LineNr">152 </span> <span class="Normal">int</span> height = <span class="Delimiter">(</span>h >= <span class="Constant">0</span><span class="Delimiter">)</span> ? h : <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L153" class="LineNr">153 </span> <span class="Normal">int</span> width = <span class="Delimiter">(</span>w >= <span class="Constant">0</span><span class="Delimiter">)</span> ? w : <span class="Constant">0</span><span class="Delimiter">;</span> <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> <span id="L155" class="LineNr">155 </span> <span class="Normal">int</span> color = TB_BLACK<span class="Delimiter">;</span> -<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> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L156" class="LineNr">156 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L158" class="LineNr">158 </span> <span class="Delimiter">}</span> <span id="L159" class="LineNr">159 </span> <span class="Normal">int</span> bg_color = TB_BLACK<span class="Delimiter">;</span> -<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> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L160" class="LineNr">160 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">)</span> > <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <span id="L163" class="LineNr">163 </span> <span class="Delimiter">}</span> @@ -249,14 +249,14 @@ if ('onhashchange' in window) { <span id="L191" class="LineNr">191 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L192" class="LineNr">192 </span>CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">,</span> <span id="L193" class="LineNr">193 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L194" class="LineNr">194 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"cursor-position-on-display"</span><span class="Delimiter">,</span> CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L194" class="LineNr">194 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"cursor-position-on-display"</span><span class="Delimiter">,</span> CURSOR_POSITION_ON_DISPLAY<span class="Delimiter">);</span> <span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L196" class="LineNr">196 </span><span class="Normal">case</span> CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L197" class="LineNr">197 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L198" class="LineNr">198 </span><span class="Delimiter">}</span> <span id="L199" class="LineNr">199 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L200" class="LineNr">200 </span><span class="Normal">case</span> CURSOR_POSITION_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L201" class="LineNr">201 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L201" class="LineNr">201 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <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> <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> <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> @@ -266,26 +266,26 @@ if ('onhashchange' in window) { <span id="L208" class="LineNr">208 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L209" class="LineNr">209 </span>MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L211" class="LineNr">211 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L211" class="LineNr">211 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span> <span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L213" class="LineNr">213 </span><span class="Normal">case</span> MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> -<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> -<span id="L215" class="LineNr">215 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'move-cursor-on-display' requires two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L214" class="LineNr">214 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'move-cursor-on-display' requires two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L216" class="LineNr">216 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L217" class="LineNr">217 </span> <span class="Delimiter">}</span> <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> -<span id="L219" class="LineNr">219 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'move-cursor-on-display' should be a row number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L219" class="LineNr">219 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'move-cursor-on-display' should be a row number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L220" class="LineNr">220 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L221" class="LineNr">221 </span> <span class="Delimiter">}</span> <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> -<span id="L223" class="LineNr">223 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'move-cursor-on-display' should be a column number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L223" class="LineNr">223 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'move-cursor-on-display' should be a column number, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L224" class="LineNr">224 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L225" class="LineNr">225 </span> <span class="Delimiter">}</span> <span id="L226" class="LineNr">226 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L227" class="LineNr">227 </span><span class="Delimiter">}</span> <span id="L228" class="LineNr">228 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L229" class="LineNr">229 </span><span class="Normal">case</span> MOVE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L230" class="LineNr">230 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L230" class="LineNr">230 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <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> <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> <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> @@ -296,14 +296,14 @@ if ('onhashchange' in window) { <span id="L238" class="LineNr">238 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L239" class="LineNr">239 </span>MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">,</span> <span id="L240" class="LineNr">240 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L241" class="LineNr">241 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-down-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L241" class="LineNr">241 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-down-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_DOWN_ON_DISPLAY<span class="Delimiter">);</span> <span id="L242" class="LineNr">242 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L243" class="LineNr">243 </span><span class="Normal">case</span> MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L244" class="LineNr">244 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L245" class="LineNr">245 </span><span class="Delimiter">}</span> <span id="L246" class="LineNr">246 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L247" class="LineNr">247 </span><span class="Normal">case</span> MOVE_CURSOR_DOWN_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L248" class="LineNr">248 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L248" class="LineNr">248 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L249" class="LineNr">249 </span> <span class="Normal">int</span> h=tb_height<span class="Delimiter">();</span> <span id="L250" class="LineNr">250 </span> <span class="Normal">int</span> height = <span class="Delimiter">(</span>h >= <span class="Constant">0</span><span class="Delimiter">)</span> ? h : <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L251" class="LineNr">251 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row < height-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -317,14 +317,14 @@ if ('onhashchange' in window) { <span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L260" class="LineNr">260 </span>MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">,</span> <span id="L261" class="LineNr">261 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L262" class="LineNr">262 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-up-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L262" class="LineNr">262 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-up-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_UP_ON_DISPLAY<span class="Delimiter">);</span> <span id="L263" class="LineNr">263 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L264" class="LineNr">264 </span><span class="Normal">case</span> MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L265" class="LineNr">265 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L266" class="LineNr">266 </span><span class="Delimiter">}</span> <span id="L267" class="LineNr">267 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L268" class="LineNr">268 </span><span class="Normal">case</span> MOVE_CURSOR_UP_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L269" class="LineNr">269 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L269" class="LineNr">269 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L270" class="LineNr">270 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L271" class="LineNr">271 </span> --Display_row<span class="Delimiter">;</span> <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> @@ -336,14 +336,14 @@ if ('onhashchange' in window) { <span id="L278" class="LineNr">278 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L279" class="LineNr">279 </span>MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">,</span> <span id="L280" class="LineNr">280 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L281" class="LineNr">281 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-right-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L281" class="LineNr">281 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-right-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_RIGHT_ON_DISPLAY<span class="Delimiter">);</span> <span id="L282" class="LineNr">282 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L283" class="LineNr">283 </span><span class="Normal">case</span> MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L284" class="LineNr">284 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L285" class="LineNr">285 </span><span class="Delimiter">}</span> <span id="L286" class="LineNr">286 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L287" class="LineNr">287 </span><span class="Normal">case</span> MOVE_CURSOR_RIGHT_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L288" class="LineNr">288 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L288" class="LineNr">288 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L289" class="LineNr">289 </span> <span class="Normal">int</span> w=tb_width<span class="Delimiter">();</span> <span id="L290" class="LineNr">290 </span> <span class="Normal">int</span> width = <span class="Delimiter">(</span>w >= <span class="Constant">0</span><span class="Delimiter">)</span> ? w : <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L291" class="LineNr">291 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column < width-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -357,14 +357,14 @@ if ('onhashchange' in window) { <span id="L299" class="LineNr">299 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L300" class="LineNr">300 </span>MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">,</span> <span id="L301" class="LineNr">301 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L302" class="LineNr">302 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-left-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L302" class="LineNr">302 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"move-cursor-left-on-display"</span><span class="Delimiter">,</span> MOVE_CURSOR_LEFT_ON_DISPLAY<span class="Delimiter">);</span> <span id="L303" class="LineNr">303 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L304" class="LineNr">304 </span><span class="Normal">case</span> MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L305" class="LineNr">305 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L306" class="LineNr">306 </span><span class="Delimiter">}</span> <span id="L307" class="LineNr">307 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L308" class="LineNr">308 </span><span class="Normal">case</span> MOVE_CURSOR_LEFT_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L309" class="LineNr">309 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L309" class="LineNr">309 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L310" class="LineNr">310 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Display_column > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L311" class="LineNr">311 </span> --Display_column<span class="Delimiter">;</span> <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> @@ -376,10 +376,10 @@ if ('onhashchange' in window) { <span id="L318" class="LineNr">318 </span><span class="Comment">//: as a convenience, make $print mostly work in console mode</span> <span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before "End $print 10/newline Special-cases")</span> <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> -<span id="L321" class="LineNr">321 </span> move_cursor_to_start_of_next_line_on_display<span class="Delimiter">();</span> +<span id="L321" class="LineNr">321 </span> <a href='080display.cc.html#L324'>move_cursor_to_start_of_next_line_on_display</a><span class="Delimiter">();</span> <span id="L322" class="LineNr">322 </span><span class="Delimiter">}</span> <span id="L323" class="LineNr">323 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L324" class="LineNr">324 </span><span class="Normal">void</span> <a href='080display.cc.html#L324'>move_cursor_to_start_of_next_line_on_display</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L325" class="LineNr">325 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Display_row < tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> ++Display_row<span class="Delimiter">;</span> <span id="L326" class="LineNr">326 </span> <span class="Normal">else</span> Display_row = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L327" class="LineNr">327 </span> Display_column = <span class="Constant">0</span><span class="Delimiter">;</span> @@ -390,14 +390,14 @@ if ('onhashchange' in window) { <span id="L332" class="LineNr">332 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L333" class="LineNr">333 </span>DISPLAY_WIDTH<span class="Delimiter">,</span> <span id="L334" class="LineNr">334 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L335" class="LineNr">335 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"display-width"</span><span class="Delimiter">,</span> DISPLAY_WIDTH<span class="Delimiter">);</span> +<span id="L335" class="LineNr">335 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"display-width"</span><span class="Delimiter">,</span> DISPLAY_WIDTH<span class="Delimiter">);</span> <span id="L336" class="LineNr">336 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L337" class="LineNr">337 </span><span class="Normal">case</span> DISPLAY_WIDTH: <span class="Delimiter">{</span> <span id="L338" class="LineNr">338 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L339" class="LineNr">339 </span><span class="Delimiter">}</span> <span id="L340" class="LineNr">340 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L341" class="LineNr">341 </span><span class="Normal">case</span> DISPLAY_WIDTH: <span class="Delimiter">{</span> -<span id="L342" class="LineNr">342 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L342" class="LineNr">342 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <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> <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> <span id="L345" class="LineNr">345 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -406,14 +406,14 @@ if ('onhashchange' in window) { <span id="L348" class="LineNr">348 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L349" class="LineNr">349 </span>DISPLAY_HEIGHT<span class="Delimiter">,</span> <span id="L350" class="LineNr">350 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L351" class="LineNr">351 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"display-height"</span><span class="Delimiter">,</span> DISPLAY_HEIGHT<span class="Delimiter">);</span> +<span id="L351" class="LineNr">351 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"display-height"</span><span class="Delimiter">,</span> DISPLAY_HEIGHT<span class="Delimiter">);</span> <span id="L352" class="LineNr">352 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L353" class="LineNr">353 </span><span class="Normal">case</span> DISPLAY_HEIGHT: <span class="Delimiter">{</span> <span id="L354" class="LineNr">354 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L355" class="LineNr">355 </span><span class="Delimiter">}</span> <span id="L356" class="LineNr">356 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L357" class="LineNr">357 </span><span class="Normal">case</span> DISPLAY_HEIGHT: <span class="Delimiter">{</span> -<span id="L358" class="LineNr">358 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L358" class="LineNr">358 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <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> <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> <span id="L361" class="LineNr">361 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -422,14 +422,14 @@ if ('onhashchange' in window) { <span id="L364" class="LineNr">364 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L365" class="LineNr">365 </span>HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">,</span> <span id="L366" class="LineNr">366 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L367" class="LineNr">367 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hide-cursor-on-display"</span><span class="Delimiter">,</span> HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L367" class="LineNr">367 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hide-cursor-on-display"</span><span class="Delimiter">,</span> HIDE_CURSOR_ON_DISPLAY<span class="Delimiter">);</span> <span id="L368" class="LineNr">368 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L369" class="LineNr">369 </span><span class="Normal">case</span> HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L370" class="LineNr">370 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L371" class="LineNr">371 </span><span class="Delimiter">}</span> <span id="L372" class="LineNr">372 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L373" class="LineNr">373 </span><span class="Normal">case</span> HIDE_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L374" class="LineNr">374 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L374" class="LineNr">374 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <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> <span id="L376" class="LineNr">376 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L377" class="LineNr">377 </span><span class="Delimiter">}</span> @@ -437,14 +437,14 @@ if ('onhashchange' in window) { <span id="L379" class="LineNr">379 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L380" class="LineNr">380 </span>SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">,</span> <span id="L381" class="LineNr">381 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L382" class="LineNr">382 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"show-cursor-on-display"</span><span class="Delimiter">,</span> SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">);</span> +<span id="L382" class="LineNr">382 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"show-cursor-on-display"</span><span class="Delimiter">,</span> SHOW_CURSOR_ON_DISPLAY<span class="Delimiter">);</span> <span id="L383" class="LineNr">383 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L384" class="LineNr">384 </span><span class="Normal">case</span> SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> <span id="L385" class="LineNr">385 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L386" class="LineNr">386 </span><span class="Delimiter">}</span> <span id="L387" class="LineNr">387 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L388" class="LineNr">388 </span><span class="Normal">case</span> SHOW_CURSOR_ON_DISPLAY: <span class="Delimiter">{</span> -<span id="L389" class="LineNr">389 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L389" class="LineNr">389 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <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> <span id="L391" class="LineNr">391 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L392" class="LineNr">392 </span><span class="Delimiter">}</span> @@ -452,14 +452,14 @@ if ('onhashchange' in window) { <span id="L394" class="LineNr">394 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L395" class="LineNr">395 </span>HIDE_DISPLAY<span class="Delimiter">,</span> <span id="L396" class="LineNr">396 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L397" class="LineNr">397 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hide-display"</span><span class="Delimiter">,</span> HIDE_DISPLAY<span class="Delimiter">);</span> +<span id="L397" class="LineNr">397 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"hide-display"</span><span class="Delimiter">,</span> HIDE_DISPLAY<span class="Delimiter">);</span> <span id="L398" class="LineNr">398 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L399" class="LineNr">399 </span><span class="Normal">case</span> HIDE_DISPLAY: <span class="Delimiter">{</span> <span id="L400" class="LineNr">400 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L401" class="LineNr">401 </span><span class="Delimiter">}</span> <span id="L402" class="LineNr">402 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L403" class="LineNr">403 </span><span class="Normal">case</span> HIDE_DISPLAY: <span class="Delimiter">{</span> -<span id="L404" class="LineNr">404 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L404" class="LineNr">404 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L405" class="LineNr">405 </span> Autodisplay = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L406" class="LineNr">406 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L407" class="LineNr">407 </span><span class="Delimiter">}</span> @@ -467,14 +467,14 @@ if ('onhashchange' in window) { <span id="L409" class="LineNr">409 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L410" class="LineNr">410 </span>SHOW_DISPLAY<span class="Delimiter">,</span> <span id="L411" class="LineNr">411 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L412" class="LineNr">412 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"show-display"</span><span class="Delimiter">,</span> SHOW_DISPLAY<span class="Delimiter">);</span> +<span id="L412" class="LineNr">412 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"show-display"</span><span class="Delimiter">,</span> SHOW_DISPLAY<span class="Delimiter">);</span> <span id="L413" class="LineNr">413 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L414" class="LineNr">414 </span><span class="Normal">case</span> SHOW_DISPLAY: <span class="Delimiter">{</span> <span id="L415" class="LineNr">415 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L416" class="LineNr">416 </span><span class="Delimiter">}</span> <span id="L417" class="LineNr">417 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L418" class="LineNr">418 </span><span class="Normal">case</span> SHOW_DISPLAY: <span class="Delimiter">{</span> -<span id="L419" class="LineNr">419 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L419" class="LineNr">419 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L420" class="LineNr">420 </span> Autodisplay = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L421" class="LineNr">421 </span> tb_present<span class="Delimiter">();</span> <span id="L422" class="LineNr">422 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -485,14 +485,14 @@ if ('onhashchange' in window) { <span id="L427" class="LineNr">427 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L428" class="LineNr">428 </span>WAIT_FOR_SOME_INTERACTION<span class="Delimiter">,</span> <span id="L429" class="LineNr">429 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L430" class="LineNr">430 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-some-interaction"</span><span class="Delimiter">,</span> WAIT_FOR_SOME_INTERACTION<span class="Delimiter">);</span> +<span id="L430" class="LineNr">430 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"wait-for-some-interaction"</span><span class="Delimiter">,</span> WAIT_FOR_SOME_INTERACTION<span class="Delimiter">);</span> <span id="L431" class="LineNr">431 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L432" class="LineNr">432 </span><span class="Normal">case</span> WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span> <span id="L433" class="LineNr">433 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L434" class="LineNr">434 </span><span class="Delimiter">}</span> <span id="L435" class="LineNr">435 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L436" class="LineNr">436 </span><span class="Normal">case</span> WAIT_FOR_SOME_INTERACTION: <span class="Delimiter">{</span> -<span id="L437" class="LineNr">437 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L437" class="LineNr">437 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L438" class="LineNr">438 </span> tb_event event<span class="Delimiter">;</span> <span id="L439" class="LineNr">439 </span> tb_poll_event<span class="Delimiter">(</span>&event<span class="Delimiter">);</span> <span id="L440" class="LineNr">440 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -501,14 +501,14 @@ if ('onhashchange' in window) { <span id="L443" class="LineNr">443 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L444" class="LineNr">444 </span>CHECK_FOR_INTERACTION<span class="Delimiter">,</span> <span id="L445" class="LineNr">445 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L446" class="LineNr">446 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"check-for-interaction"</span><span class="Delimiter">,</span> CHECK_FOR_INTERACTION<span class="Delimiter">);</span> +<span id="L446" class="LineNr">446 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"check-for-interaction"</span><span class="Delimiter">,</span> CHECK_FOR_INTERACTION<span class="Delimiter">);</span> <span id="L447" class="LineNr">447 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L448" class="LineNr">448 </span><span class="Normal">case</span> CHECK_FOR_INTERACTION: <span class="Delimiter">{</span> <span id="L449" class="LineNr">449 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L450" class="LineNr">450 </span><span class="Delimiter">}</span> <span id="L451" class="LineNr">451 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L452" class="LineNr">452 </span><span class="Normal">case</span> CHECK_FOR_INTERACTION: <span class="Delimiter">{</span> -<span id="L453" class="LineNr">453 </span> CHECK_CONSOLE<span class="Delimiter">;</span> +<span id="L453" class="LineNr">453 </span> <a href='080display.cc.html#L21'>CHECK_CONSOLE</a><span class="Delimiter">;</span> <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> <span id="L455" class="LineNr">455 </span> tb_event event<span class="Delimiter">;</span> <span id="L456" class="LineNr">456 </span> <span class="Normal">int</span> event_type = tb_peek_event<span class="Delimiter">(</span>&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> @@ -572,14 +572,14 @@ if ('onhashchange' in window) { <span id="L514" class="LineNr">514 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L515" class="LineNr">515 </span>INTERACTIONS_LEFT<span class="Delimiter">,</span> <span id="L516" class="LineNr">516 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L517" class="LineNr">517 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"interactions-left?"</span><span class="Delimiter">,</span> INTERACTIONS_LEFT<span class="Delimiter">);</span> +<span id="L517" class="LineNr">517 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"interactions-left?"</span><span class="Delimiter">,</span> INTERACTIONS_LEFT<span class="Delimiter">);</span> <span id="L518" class="LineNr">518 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L519" class="LineNr">519 </span><span class="Normal">case</span> INTERACTIONS_LEFT: <span class="Delimiter">{</span> <span id="L520" class="LineNr">520 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L521" class="LineNr">521 </span><span class="Delimiter">}</span> <span id="L522" class="LineNr">522 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L523" class="LineNr">523 </span><span class="Normal">case</span> INTERACTIONS_LEFT: <span class="Delimiter">{</span> -<span id="L524" class="LineNr">524 </span> CHECK_CONSOLE<span class="Delimiter">;</span> +<span id="L524" class="LineNr">524 </span> <a href='080display.cc.html#L21'>CHECK_CONSOLE</a><span class="Delimiter">;</span> <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> <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> <span id="L527" class="LineNr">527 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -590,14 +590,14 @@ if ('onhashchange' in window) { <span id="L532" class="LineNr">532 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L533" class="LineNr">533 </span>CLEAR_DISPLAY_FROM<span class="Delimiter">,</span> <span id="L534" class="LineNr">534 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L535" class="LineNr">535 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"clear-display-from"</span><span class="Delimiter">,</span> CLEAR_DISPLAY_FROM<span class="Delimiter">);</span> +<span id="L535" class="LineNr">535 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"clear-display-from"</span><span class="Delimiter">,</span> CLEAR_DISPLAY_FROM<span class="Delimiter">);</span> <span id="L536" class="LineNr">536 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L537" class="LineNr">537 </span><span class="Normal">case</span> CLEAR_DISPLAY_FROM: <span class="Delimiter">{</span> <span id="L538" class="LineNr">538 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L539" class="LineNr">539 </span><span class="Delimiter">}</span> <span id="L540" class="LineNr">540 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L541" class="LineNr">541 </span><span class="Normal">case</span> CLEAR_DISPLAY_FROM: <span class="Delimiter">{</span> -<span id="L542" class="LineNr">542 </span> CHECK_SCREEN<span class="Delimiter">;</span> +<span id="L542" class="LineNr">542 </span> <a href='080display.cc.html#L13'>CHECK_SCREEN</a><span class="Delimiter">;</span> <span id="L543" class="LineNr">543 </span> <span class="Comment">// todo: error checking</span> <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> <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> diff --git a/html/081print.mu.html b/html/081print.mu.html index 9117b479..834666ac 100644 --- a/html/081print.mu.html +++ b/html/081print.mu.html @@ -60,46 +60,46 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Comment"># Wrappers around print primitives that take a 'screen' object and are thus</span> <span id="L2" class="LineNr"> 2 </span><span class="Comment"># easier to test.</span> <span id="L3" class="LineNr"> 3 </span> -<span id="L4" class="LineNr"> 4 </span><span class="muData">container</span> screen [ +<span id="L4" class="LineNr"> 4 </span><span class="muData">container</span> <a href='081print.mu.html#L4'>screen</a> [ <span id="L5" class="LineNr"> 5 </span> num-rows:num <span id="L6" class="LineNr"> 6 </span> num-columns:num <span id="L7" class="LineNr"> 7 </span> cursor-row:num <span id="L8" class="LineNr"> 8 </span> cursor-column:num -<span id="L9" class="LineNr"> 9 </span> data:&:@:screen-cell +<span id="L9" class="LineNr"> 9 </span> data:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span id="L10" class="LineNr"> 10 </span>] <span id="L11" class="LineNr"> 11 </span> -<span id="L12" class="LineNr"> 12 </span><span class="muData">container</span> screen-cell [ +<span id="L12" class="LineNr"> 12 </span><span class="muData">container</span> <a href='081print.mu.html#L12'>screen-cell</a> [ <span id="L13" class="LineNr"> 13 </span> contents:char <span id="L14" class="LineNr"> 14 </span> color:num <span id="L15" class="LineNr"> 15 </span>] <span id="L16" class="LineNr"> 16 </span> -<span id="L17" class="LineNr"> 17 </span><span class="muRecipe">def</span> new-fake-screen w:num, h:num<span class="muRecipe"> -> </span>result:&:screen [ +<span id="L17" class="LineNr"> 17 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L17'>new-fake-screen</a> w:num, h:num<span class="muRecipe"> -> </span>result:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L18" class="LineNr"> 18 </span> <span class="Constant">local-scope</span> <span id="L19" class="LineNr"> 19 </span> <span class="Constant">load-ingredients</span> -<span id="L20" class="LineNr"> 20 </span> result <span class="Special"><-</span> new <span class="Constant">screen:type</span> +<span id="L20" class="LineNr"> 20 </span> result <span class="Special"><-</span> new <span class="Constant"><a href='081print.mu.html#L4'>screen</a>:type</span> <span id="L21" class="LineNr"> 21 </span> bufsize:num <span class="Special"><-</span> multiply w, h -<span id="L22" class="LineNr"> 22 </span> data:&:@:screen-cell <span class="Special"><-</span> new <span class="Constant">screen-cell:type</span>, bufsize +<span id="L22" class="LineNr"> 22 </span> data:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> new <span class="Constant"><a href='081print.mu.html#L12'>screen-cell</a>:type</span>, bufsize <span id="L23" class="LineNr"> 23 </span> *result <span class="Special"><-</span> merge h/num-rows, w/num-columns, <span class="Constant">0/cursor-row</span>, <span class="Constant">0/cursor-column</span>, data -<span id="L24" class="LineNr"> 24 </span> result <span class="Special"><-</span> clear-screen result +<span id="L24" class="LineNr"> 24 </span> result <span class="Special"><-</span> <a href='081print.mu.html#L27'>clear-screen</a> result <span id="L25" class="LineNr"> 25 </span>] <span id="L26" class="LineNr"> 26 </span> -<span id="L27" class="LineNr"> 27 </span><span class="muRecipe">def</span> clear-screen screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L27" class="LineNr"> 27 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L27'>clear-screen</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L28" class="LineNr"> 28 </span> <span class="Constant">local-scope</span> <span id="L29" class="LineNr"> 29 </span> <span class="Constant">load-ingredients</span> <span id="L30" class="LineNr"> 30 </span> <span class="Delimiter">{</span> -<span id="L31" class="LineNr"> 31 </span> <span class="muControl">break-if</span> screen +<span id="L31" class="LineNr"> 31 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L32" class="LineNr"> 32 </span> <span class="Comment"># real screen</span> <span id="L33" class="LineNr"> 33 </span> clear-display <span id="L34" class="LineNr"> 34 </span> <span class="muControl">return</span> <span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">}</span> <span id="L36" class="LineNr"> 36 </span> <span class="Comment"># fake screen</span> -<span id="L37" class="LineNr"> 37 </span> buf:&:@:screen-cell <span class="Special"><-</span> get *screen, <span class="Constant">data:offset</span> +<span id="L37" class="LineNr"> 37 </span> buf:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *screen, <span class="Constant">data:offset</span> <span id="L38" class="LineNr"> 38 </span> max:num <span class="Special"><-</span> length *buf <span id="L39" class="LineNr"> 39 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L40" class="LineNr"> 40 </span> <span class="Delimiter">{</span> <span id="L41" class="LineNr"> 41 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, max <span id="L42" class="LineNr"> 42 </span> <span class="muControl">break-if</span> done? -<span id="L43" class="LineNr"> 43 </span> curr:screen-cell <span class="Special"><-</span> merge <span class="Constant">0/empty</span>, <span class="Constant">7/white</span> +<span id="L43" class="LineNr"> 43 </span> curr:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> merge <span class="Constant">0/empty</span>, <span class="Constant">7/white</span> <span id="L44" class="LineNr"> 44 </span> *buf <span class="Special"><-</span> put-index *buf, i, curr <span id="L45" class="LineNr"> 45 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L46" class="LineNr"> 46 </span> <span class="muControl">loop</span> @@ -109,24 +109,24 @@ if ('onhashchange' in window) { <span id="L50" class="LineNr"> 50 </span> *screen <span class="Special"><-</span> put *screen, <span class="Constant">cursor-column:offset</span>,<span class="Constant"> 0</span> <span id="L51" class="LineNr"> 51 </span>] <span id="L52" class="LineNr"> 52 </span> -<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> sync-screen screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L53'>sync-screen</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L54" class="LineNr"> 54 </span> <span class="Constant">local-scope</span> <span id="L55" class="LineNr"> 55 </span> <span class="Constant">load-ingredients</span> -<span id="L56" class="LineNr"> 56 </span> <span class="muControl">return-if</span> screen <span class="Comment"># do nothing for fake screens</span> +<span id="L56" class="LineNr"> 56 </span> <span class="muControl">return-if</span> <a href='081print.mu.html#L4'>screen</a> <span class="Comment"># do nothing for fake screens</span> <span id="L57" class="LineNr"> 57 </span> sync-display <span id="L58" class="LineNr"> 58 </span>] <span id="L59" class="LineNr"> 59 </span> -<span id="L60" class="LineNr"> 60 </span><span class="muRecipe">def</span> fake-screen-is-empty? screen:&:screen<span class="muRecipe"> -> </span>result:bool [ +<span id="L60" class="LineNr"> 60 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L60'>fake-screen-is-empty?</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:bool [ <span id="L61" class="LineNr"> 61 </span> <span class="Constant">local-scope</span> <span id="L62" class="LineNr"> 62 </span> <span class="Constant">load-ingredients</span> -<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> -<span id="L64" class="LineNr"> 64 </span> buf:&:@:screen-cell <span class="Special"><-</span> get *screen, <span class="Constant">data:offset</span> +<span id="L63" class="LineNr"> 63 </span> <span class="muControl">return-unless</span> <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">1/true</span> <span class="Comment"># do nothing for real screens</span> +<span id="L64" class="LineNr"> 64 </span> buf:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *screen, <span class="Constant">data:offset</span> <span id="L65" class="LineNr"> 65 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L66" class="LineNr"> 66 </span> len:num <span class="Special"><-</span> length *buf <span id="L67" class="LineNr"> 67 </span> <span class="Delimiter">{</span> <span id="L68" class="LineNr"> 68 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L69" class="LineNr"> 69 </span> <span class="muControl">break-if</span> done? -<span id="L70" class="LineNr"> 70 </span> curr:screen-cell <span class="Special"><-</span> index *buf, i +<span id="L70" class="LineNr"> 70 </span> curr:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> index *buf, i <span id="L71" class="LineNr"> 71 </span> curr-contents:char <span class="Special"><-</span> get curr, <span class="Constant">contents:offset</span> <span id="L72" class="LineNr"> 72 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L73" class="LineNr"> 73 </span> <span class="muControl">loop-unless</span> curr-contents @@ -136,7 +136,7 @@ if ('onhashchange' in window) { <span id="L77" class="LineNr"> 77 </span> <span class="muControl">return</span> <span class="Constant">1/true</span> <span id="L78" class="LineNr"> 78 </span>] <span id="L79" class="LineNr"> 79 </span> -<span id="L80" class="LineNr"> 80 </span><span class="muRecipe">def</span> print screen:&:screen, c:char<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L80" class="LineNr"> 80 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, c:char<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L81" class="LineNr"> 81 </span> <span class="Constant">local-scope</span> <span id="L82" class="LineNr"> 82 </span> <span class="Constant">load-ingredients</span> <span id="L83" class="LineNr"> 83 </span> color:num, color-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> @@ -155,7 +155,7 @@ if ('onhashchange' in window) { <span id="L96" class="LineNr"> 96 </span> trace<span class="Constant"> 90</span>, <span class="Constant">[print-character]</span>, c2 <span id="L97" class="LineNr"> 97 </span> <span class="Delimiter">{</span> <span id="L98" class="LineNr"> 98 </span> <span class="Comment"># real screen</span> -<span id="L99" class="LineNr"> 99 </span> <span class="muControl">break-if</span> screen +<span id="L99" class="LineNr"> 99 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L100" class="LineNr">100 </span> print-character-to-display c, color, bg-color <span id="L101" class="LineNr">101 </span> <span class="muControl">return</span> <span id="L102" class="LineNr">102 </span> <span class="Delimiter">}</span> @@ -197,7 +197,7 @@ if ('onhashchange' in window) { <span id="L138" class="LineNr">138 </span> <span class="Comment"># save character in fake screen</span> <span id="L139" class="LineNr">139 </span> index:num <span class="Special"><-</span> multiply row, width <span id="L140" class="LineNr">140 </span> index <span class="Special"><-</span> add index, column -<span id="L141" class="LineNr">141 </span> buf:&:@:screen-cell <span class="Special"><-</span> get *screen, <span class="Constant">data:offset</span> +<span id="L141" class="LineNr">141 </span> buf:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *screen, <span class="Constant">data:offset</span> <span id="L142" class="LineNr">142 </span> len:num <span class="Special"><-</span> length *buf <span id="L143" class="LineNr">143 </span> <span class="Comment"># special-case: backspace</span> <span id="L144" class="LineNr">144 </span> <span class="Delimiter">{</span> @@ -211,12 +211,12 @@ if ('onhashchange' in window) { <span id="L152" class="LineNr">152 </span> column <span class="Special"><-</span> subtract column,<span class="Constant"> 1</span> <span id="L153" class="LineNr">153 </span> *screen <span class="Special"><-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column <span id="L154" class="LineNr">154 </span> index <span class="Special"><-</span> subtract index,<span class="Constant"> 1</span> -<span id="L155" class="LineNr">155 </span> cursor:screen-cell <span class="Special"><-</span> merge <span class="Constant">32/space</span>, <span class="Constant">7/white</span> +<span id="L155" class="LineNr">155 </span> cursor:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> merge <span class="Constant">32/space</span>, <span class="Constant">7/white</span> <span id="L156" class="LineNr">156 </span> *buf <span class="Special"><-</span> put-index *buf, index, cursor <span id="L157" class="LineNr">157 </span> <span class="Delimiter">}</span> <span id="L158" class="LineNr">158 </span> <span class="muControl">return</span> <span id="L159" class="LineNr">159 </span> <span class="Delimiter">}</span> -<span id="L160" class="LineNr">160 </span> cursor:screen-cell <span class="Special"><-</span> merge c, color +<span id="L160" class="LineNr">160 </span> cursor:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> merge c, color <span id="L161" class="LineNr">161 </span> *buf <span class="Special"><-</span> put-index *buf, index, cursor <span id="L162" class="LineNr">162 </span> <span class="Comment"># increment column unless it's already all the way to the right</span> <span id="L163" class="LineNr">163 </span> <span class="Delimiter">{</span> @@ -230,12 +230,12 @@ if ('onhashchange' in window) { <span id="L171" class="LineNr">171 </span> <span id="L172" class="LineNr">172 </span><span class="muScenario">scenario</span> print-character-at-top-left [ <span id="L173" class="LineNr">173 </span> <span class="Constant">local-scope</span> -<span id="L174" class="LineNr">174 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L174" class="LineNr">174 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L175" class="LineNr">175 </span> run [ <span id="L176" class="LineNr">176 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L177" class="LineNr">177 </span> fake-screen <span class="Special"><-</span> print fake-screen, a:char -<span id="L178" class="LineNr">178 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L179" class="LineNr">179 </span> 1:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L178" class="LineNr">178 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L179" class="LineNr">179 </span> 1:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L180" class="LineNr">180 </span> ] <span id="L181" class="LineNr">181 </span> memory-should-contain [ <span id="L182" class="LineNr">182 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span> @@ -248,13 +248,13 @@ if ('onhashchange' in window) { <span id="L189" class="LineNr">189 </span> <span id="L190" class="LineNr">190 </span><span class="muScenario">scenario</span> print-character-at-fractional-coordinate [ <span id="L191" class="LineNr">191 </span> <span class="Constant">local-scope</span> -<span id="L192" class="LineNr">192 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L192" class="LineNr">192 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L193" class="LineNr">193 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L194" class="LineNr">194 </span> run [ -<span id="L195" class="LineNr">195 </span> move-cursor fake-screen, 0.5,<span class="Constant"> 0</span> +<span id="L195" class="LineNr">195 </span> <a href='081print.mu.html#L442'>move-cursor</a> fake-screen, 0.5,<span class="Constant"> 0</span> <span id="L196" class="LineNr">196 </span> fake-screen <span class="Special"><-</span> print fake-screen, a:char -<span id="L197" class="LineNr">197 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L198" class="LineNr">198 </span> 1:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L197" class="LineNr">197 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L198" class="LineNr">198 </span> 1:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L199" class="LineNr">199 </span> ] <span id="L200" class="LineNr">200 </span> memory-should-contain [ <span id="L201" class="LineNr">201 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span> @@ -267,12 +267,12 @@ if ('onhashchange' in window) { <span id="L208" class="LineNr">208 </span> <span id="L209" class="LineNr">209 </span><span class="muScenario">scenario</span> print-character-in-color [ <span id="L210" class="LineNr">210 </span> <span class="Constant">local-scope</span> -<span id="L211" class="LineNr">211 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L211" class="LineNr">211 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L212" class="LineNr">212 </span> run [ <span id="L213" class="LineNr">213 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L214" class="LineNr">214 </span> fake-screen <span class="Special"><-</span> print fake-screen, a:char, <span class="Constant">1/red</span> -<span id="L215" class="LineNr">215 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L216" class="LineNr">216 </span> 1:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L215" class="LineNr">215 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L216" class="LineNr">216 </span> 1:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L217" class="LineNr">217 </span> ] <span id="L218" class="LineNr">218 </span> memory-should-contain [ <span id="L219" class="LineNr">219 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span> @@ -285,15 +285,15 @@ if ('onhashchange' in window) { <span id="L226" class="LineNr">226 </span> <span id="L227" class="LineNr">227 </span><span class="muScenario">scenario</span> print-backspace-character [ <span id="L228" class="LineNr">228 </span> <span class="Constant">local-scope</span> -<span id="L229" class="LineNr">229 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L229" class="LineNr">229 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L230" class="LineNr">230 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L231" class="LineNr">231 </span> fake-screen <span class="Special"><-</span> print fake-screen, a <span id="L232" class="LineNr">232 </span> run [ <span id="L233" class="LineNr">233 </span> backspace:char <span class="Special"><-</span> copy <span class="Constant">8/backspace</span> <span id="L234" class="LineNr">234 </span> fake-screen <span class="Special"><-</span> print fake-screen, backspace <span id="L235" class="LineNr">235 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span> -<span id="L236" class="LineNr">236 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L237" class="LineNr">237 </span> 11:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L236" class="LineNr">236 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L237" class="LineNr">237 </span> 11:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L238" class="LineNr">238 </span> ] <span id="L239" class="LineNr">239 </span> memory-should-contain [ <span id="L240" class="LineNr">240 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column</span> @@ -307,7 +307,7 @@ if ('onhashchange' in window) { <span id="L248" class="LineNr">248 </span> <span id="L249" class="LineNr">249 </span><span class="muScenario">scenario</span> print-extra-backspace-character [ <span id="L250" class="LineNr">250 </span> <span class="Constant">local-scope</span> -<span id="L251" class="LineNr">251 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L251" class="LineNr">251 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L252" class="LineNr">252 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L253" class="LineNr">253 </span> fake-screen <span class="Special"><-</span> print fake-screen, a <span id="L254" class="LineNr">254 </span> run [ @@ -315,8 +315,8 @@ if ('onhashchange' in window) { <span id="L256" class="LineNr">256 </span> fake-screen <span class="Special"><-</span> print fake-screen, backspace <span id="L257" class="LineNr">257 </span> fake-screen <span class="Special"><-</span> print fake-screen, backspace <span class="Comment"># cursor already at left margin</span> <span id="L258" class="LineNr">258 </span> 1:num/<span class="Special">raw</span> <span class="Special"><-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span> -<span id="L259" class="LineNr">259 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L260" class="LineNr">260 </span> 3:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L259" class="LineNr">259 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L260" class="LineNr">260 </span> 3:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L261" class="LineNr">261 </span> ] <span id="L262" class="LineNr">262 </span> memory-should-contain [ <span id="L263" class="LineNr">263 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># cursor column</span> @@ -331,7 +331,7 @@ if ('onhashchange' in window) { <span id="L272" class="LineNr">272 </span><span class="muScenario">scenario</span> print-character-at-right-margin [ <span id="L273" class="LineNr">273 </span> <span class="Comment"># fill top row of screen with text</span> <span id="L274" class="LineNr">274 </span> <span class="Constant">local-scope</span> -<span id="L275" class="LineNr">275 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span> +<span id="L275" class="LineNr">275 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">2/width</span>, <span class="Constant">2/height</span> <span id="L276" class="LineNr">276 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L277" class="LineNr">277 </span> fake-screen <span class="Special"><-</span> print fake-screen, a <span id="L278" class="LineNr">278 </span> b:char <span class="Special"><-</span> copy <span class="Constant">98/b</span> @@ -341,8 +341,8 @@ if ('onhashchange' in window) { <span id="L282" class="LineNr">282 </span> c:char <span class="Special"><-</span> copy <span class="Constant">99/c</span> <span id="L283" class="LineNr">283 </span> fake-screen <span class="Special"><-</span> print fake-screen, c <span id="L284" class="LineNr">284 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span> -<span id="L285" class="LineNr">285 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L286" class="LineNr">286 </span> 11:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L285" class="LineNr">285 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L286" class="LineNr">286 </span> 11:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L287" class="LineNr">287 </span> ] <span id="L288" class="LineNr">288 </span> memory-should-contain [ <span id="L289" class="LineNr">289 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># cursor column</span> @@ -358,7 +358,7 @@ if ('onhashchange' in window) { <span id="L299" class="LineNr">299 </span> <span id="L300" class="LineNr">300 </span><span class="muScenario">scenario</span> print-newline-character [ <span id="L301" class="LineNr">301 </span> <span class="Constant">local-scope</span> -<span id="L302" class="LineNr">302 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L302" class="LineNr">302 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L303" class="LineNr">303 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L304" class="LineNr">304 </span> fake-screen <span class="Special"><-</span> print fake-screen, a <span id="L305" class="LineNr">305 </span> run [ @@ -366,8 +366,8 @@ if ('onhashchange' in window) { <span id="L307" class="LineNr">307 </span> fake-screen <span class="Special"><-</span> print fake-screen, newline <span id="L308" class="LineNr">308 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span> <span id="L309" class="LineNr">309 </span> 11:num/<span class="Special">raw</span> <span class="Special"><-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span> -<span id="L310" class="LineNr">310 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L311" class="LineNr">311 </span> 12:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L310" class="LineNr">310 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L311" class="LineNr">311 </span> 12:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L312" class="LineNr">312 </span> ] <span id="L313" class="LineNr">313 </span> memory-should-contain [ <span id="L314" class="LineNr">314 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span> @@ -382,7 +382,7 @@ if ('onhashchange' in window) { <span id="L323" class="LineNr">323 </span> <span id="L324" class="LineNr">324 </span><span class="muScenario">scenario</span> print-newline-at-bottom-line [ <span id="L325" class="LineNr">325 </span> <span class="Constant">local-scope</span> -<span id="L326" class="LineNr">326 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L326" class="LineNr">326 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L327" class="LineNr">327 </span> newline:char <span class="Special"><-</span> copy <span class="Constant">10/newline</span> <span id="L328" class="LineNr">328 </span> fake-screen <span class="Special"><-</span> print fake-screen, newline <span id="L329" class="LineNr">329 </span> fake-screen <span class="Special"><-</span> print fake-screen, newline @@ -401,7 +401,7 @@ if ('onhashchange' in window) { <span id="L342" class="LineNr">342 </span> <span id="L343" class="LineNr">343 </span><span class="muScenario">scenario</span> print-character-at-bottom-right [ <span id="L344" class="LineNr">344 </span> <span class="Constant">local-scope</span> -<span id="L345" class="LineNr">345 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">2/width</span>, <span class="Constant">2/height</span> +<span id="L345" class="LineNr">345 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">2/width</span>, <span class="Constant">2/height</span> <span id="L346" class="LineNr">346 </span> newline:char <span class="Special"><-</span> copy <span class="Constant">10/newline</span> <span id="L347" class="LineNr">347 </span> fake-screen <span class="Special"><-</span> print fake-screen, newline <span id="L348" class="LineNr">348 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> @@ -417,8 +417,8 @@ if ('onhashchange' in window) { <span id="L358" class="LineNr">358 </span> fake-screen <span class="Special"><-</span> print fake-screen, d <span id="L359" class="LineNr">359 </span> 10:num/<span class="Special">raw</span> <span class="Special"><-</span> get *fake-screen, <span class="Constant">cursor-row:offset</span> <span id="L360" class="LineNr">360 </span> 11:num/<span class="Special">raw</span> <span class="Special"><-</span> get *fake-screen, <span class="Constant">cursor-column:offset</span> -<span id="L361" class="LineNr">361 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L362" class="LineNr">362 </span> 20:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L361" class="LineNr">361 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L362" class="LineNr">362 </span> 20:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L363" class="LineNr">363 </span> ] <span id="L364" class="LineNr">364 </span> memory-should-contain [ <span id="L365" class="LineNr">365 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># cursor row</span> @@ -437,12 +437,12 @@ if ('onhashchange' in window) { <span id="L378" class="LineNr">378 </span> ] <span id="L379" class="LineNr">379 </span>] <span id="L380" class="LineNr">380 </span> -<span id="L381" class="LineNr">381 </span><span class="muRecipe">def</span> clear-line screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L381" class="LineNr">381 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L381'>clear-line</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L382" class="LineNr">382 </span> <span class="Constant">local-scope</span> <span id="L383" class="LineNr">383 </span> <span class="Constant">load-ingredients</span> <span id="L384" class="LineNr">384 </span> space:char <span class="Special"><-</span> copy <span class="Constant">0/nul</span> <span id="L385" class="LineNr">385 </span> <span class="Delimiter">{</span> -<span id="L386" class="LineNr">386 </span> <span class="muControl">break-if</span> screen +<span id="L386" class="LineNr">386 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L387" class="LineNr">387 </span> <span class="Comment"># real screen</span> <span id="L388" class="LineNr">388 </span> clear-line-on-display <span id="L389" class="LineNr">389 </span> <span class="muControl">return</span> @@ -456,7 +456,7 @@ if ('onhashchange' in window) { <span id="L397" class="LineNr">397 </span> right:num <span class="Special"><-</span> subtract width,<span class="Constant"> 1</span> <span id="L398" class="LineNr">398 </span> done?:bool <span class="Special"><-</span> greater-or-equal column, right <span id="L399" class="LineNr">399 </span> <span class="muControl">break-if</span> done? -<span id="L400" class="LineNr">400 </span> print screen, space +<span id="L400" class="LineNr">400 </span> print <a href='081print.mu.html#L4'>screen</a>, space <span id="L401" class="LineNr">401 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L402" class="LineNr">402 </span> <span class="muControl">loop</span> <span id="L403" class="LineNr">403 </span> <span class="Delimiter">}</span> @@ -464,10 +464,10 @@ if ('onhashchange' in window) { <span id="L405" class="LineNr">405 </span> *screen <span class="Special"><-</span> put *screen, <span class="Constant">cursor-column:offset</span>, original-column <span id="L406" class="LineNr">406 </span>] <span id="L407" class="LineNr">407 </span> -<span id="L408" class="LineNr">408 </span><span class="muRecipe">def</span> clear-line-until screen:&:screen, right:num/inclusive<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L408" class="LineNr">408 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, right:num/inclusive<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L409" class="LineNr">409 </span> <span class="Constant">local-scope</span> <span id="L410" class="LineNr">410 </span> <span class="Constant">load-ingredients</span> -<span id="L411" class="LineNr">411 </span> _, column:num <span class="Special"><-</span> cursor-position screen +<span id="L411" class="LineNr">411 </span> _, column:num <span class="Special"><-</span> <a href='081print.mu.html#L428'>cursor-position</a> <a href='081print.mu.html#L4'>screen</a> <span id="L412" class="LineNr">412 </span> space:char <span class="Special"><-</span> copy <span class="Constant">32/space</span> <span id="L413" class="LineNr">413 </span> bg-color:num, bg-color-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> <span id="L414" class="LineNr">414 </span> <span class="Delimiter">{</span> @@ -478,17 +478,17 @@ if ('onhashchange' in window) { <span id="L419" class="LineNr">419 </span> <span class="Delimiter">{</span> <span id="L420" class="LineNr">420 </span> done?:bool <span class="Special"><-</span> greater-than column, right <span id="L421" class="LineNr">421 </span> <span class="muControl">break-if</span> done? -<span id="L422" class="LineNr">422 </span> screen <span class="Special"><-</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> +<span id="L422" class="LineNr">422 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, 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> <span id="L423" class="LineNr">423 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L424" class="LineNr">424 </span> <span class="muControl">loop</span> <span id="L425" class="LineNr">425 </span> <span class="Delimiter">}</span> <span id="L426" class="LineNr">426 </span>] <span id="L427" class="LineNr">427 </span> -<span id="L428" class="LineNr">428 </span><span class="muRecipe">def</span> cursor-position screen:&:screen<span class="muRecipe"> -> </span>row:num, column:num [ +<span id="L428" class="LineNr">428 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L428'>cursor-position</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>row:num, column:num [ <span id="L429" class="LineNr">429 </span> <span class="Constant">local-scope</span> <span id="L430" class="LineNr">430 </span> <span class="Constant">load-ingredients</span> <span id="L431" class="LineNr">431 </span> <span class="Delimiter">{</span> -<span id="L432" class="LineNr">432 </span> <span class="muControl">break-if</span> screen +<span id="L432" class="LineNr">432 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L433" class="LineNr">433 </span> <span class="Comment"># real screen</span> <span id="L434" class="LineNr">434 </span> row, column <span class="Special"><-</span> cursor-position-on-display <span id="L435" class="LineNr">435 </span> <span class="muControl">return</span> @@ -498,11 +498,11 @@ if ('onhashchange' in window) { <span id="L439" class="LineNr">439 </span> column:num <span class="Special"><-</span> get *screen, <span class="Constant">cursor-column:offset</span> <span id="L440" class="LineNr">440 </span>] <span id="L441" class="LineNr">441 </span> -<span id="L442" class="LineNr">442 </span><span class="muRecipe">def</span> move-cursor screen:&:screen, new-row:num, new-column:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L442" class="LineNr">442 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, new-row:num, new-column:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L443" class="LineNr">443 </span> <span class="Constant">local-scope</span> <span id="L444" class="LineNr">444 </span> <span class="Constant">load-ingredients</span> <span id="L445" class="LineNr">445 </span> <span class="Delimiter">{</span> -<span id="L446" class="LineNr">446 </span> <span class="muControl">break-if</span> screen +<span id="L446" class="LineNr">446 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L447" class="LineNr">447 </span> <span class="Comment"># real screen</span> <span id="L448" class="LineNr">448 </span> move-cursor-on-display new-row, new-column <span id="L449" class="LineNr">449 </span> <span class="muControl">return</span> @@ -514,16 +514,16 @@ if ('onhashchange' in window) { <span id="L455" class="LineNr">455 </span> <span id="L456" class="LineNr">456 </span><span class="muScenario">scenario</span> clear-line-erases-printed-characters [ <span id="L457" class="LineNr">457 </span> <span class="Constant">local-scope</span> -<span id="L458" class="LineNr">458 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L458" class="LineNr">458 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L459" class="LineNr">459 </span> <span class="Comment"># print a character</span> <span id="L460" class="LineNr">460 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L461" class="LineNr">461 </span> fake-screen <span class="Special"><-</span> print fake-screen, a <span id="L462" class="LineNr">462 </span> <span class="Comment"># move cursor to start of line</span> -<span id="L463" class="LineNr">463 </span> fake-screen <span class="Special"><-</span> move-cursor fake-screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span> +<span id="L463" class="LineNr">463 </span> fake-screen <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> fake-screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span> <span id="L464" class="LineNr">464 </span> run [ -<span id="L465" class="LineNr">465 </span> fake-screen <span class="Special"><-</span> clear-line fake-screen -<span id="L466" class="LineNr">466 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L467" class="LineNr">467 </span> 10:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L465" class="LineNr">465 </span> fake-screen <span class="Special"><-</span> <a href='081print.mu.html#L381'>clear-line</a> fake-screen +<span id="L466" class="LineNr">466 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L467" class="LineNr">467 </span> 10:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L468" class="LineNr">468 </span> ] <span id="L469" class="LineNr">469 </span> <span class="Comment"># screen should be blank</span> <span id="L470" class="LineNr">470 </span> memory-should-contain [ @@ -543,11 +543,11 @@ if ('onhashchange' in window) { <span id="L484" class="LineNr">484 </span> ] <span id="L485" class="LineNr">485 </span>] <span id="L486" class="LineNr">486 </span> -<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> cursor-down screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L487'>cursor-down</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L488" class="LineNr">488 </span> <span class="Constant">local-scope</span> <span id="L489" class="LineNr">489 </span> <span class="Constant">load-ingredients</span> <span id="L490" class="LineNr">490 </span> <span class="Delimiter">{</span> -<span id="L491" class="LineNr">491 </span> <span class="muControl">break-if</span> screen +<span id="L491" class="LineNr">491 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L492" class="LineNr">492 </span> <span class="Comment"># real screen</span> <span id="L493" class="LineNr">493 </span> move-cursor-down-on-display <span id="L494" class="LineNr">494 </span> <span class="muControl">return</span> @@ -562,11 +562,11 @@ if ('onhashchange' in window) { <span id="L503" class="LineNr">503 </span> *screen <span class="Special"><-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row <span id="L504" class="LineNr">504 </span>] <span id="L505" class="LineNr">505 </span> -<span id="L506" class="LineNr">506 </span><span class="muRecipe">def</span> cursor-up screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L506" class="LineNr">506 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L506'>cursor-up</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L507" class="LineNr">507 </span> <span class="Constant">local-scope</span> <span id="L508" class="LineNr">508 </span> <span class="Constant">load-ingredients</span> <span id="L509" class="LineNr">509 </span> <span class="Delimiter">{</span> -<span id="L510" class="LineNr">510 </span> <span class="muControl">break-if</span> screen +<span id="L510" class="LineNr">510 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L511" class="LineNr">511 </span> <span class="Comment"># real screen</span> <span id="L512" class="LineNr">512 </span> move-cursor-up-on-display <span id="L513" class="LineNr">513 </span> <span class="muControl">return</span> @@ -579,11 +579,11 @@ if ('onhashchange' in window) { <span id="L520" class="LineNr">520 </span> *screen <span class="Special"><-</span> put *screen, <span class="Constant">cursor-row:offset</span>, row <span id="L521" class="LineNr">521 </span>] <span id="L522" class="LineNr">522 </span> -<span id="L523" class="LineNr">523 </span><span class="muRecipe">def</span> cursor-right screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L523" class="LineNr">523 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L523'>cursor-right</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L524" class="LineNr">524 </span> <span class="Constant">local-scope</span> <span id="L525" class="LineNr">525 </span> <span class="Constant">load-ingredients</span> <span id="L526" class="LineNr">526 </span> <span class="Delimiter">{</span> -<span id="L527" class="LineNr">527 </span> <span class="muControl">break-if</span> screen +<span id="L527" class="LineNr">527 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L528" class="LineNr">528 </span> <span class="Comment"># real screen</span> <span id="L529" class="LineNr">529 </span> move-cursor-right-on-display <span id="L530" class="LineNr">530 </span> <span class="muControl">return</span> @@ -598,11 +598,11 @@ if ('onhashchange' in window) { <span id="L539" class="LineNr">539 </span> *screen <span class="Special"><-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column <span id="L540" class="LineNr">540 </span>] <span id="L541" class="LineNr">541 </span> -<span id="L542" class="LineNr">542 </span><span class="muRecipe">def</span> cursor-left screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L542" class="LineNr">542 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L542'>cursor-left</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L543" class="LineNr">543 </span> <span class="Constant">local-scope</span> <span id="L544" class="LineNr">544 </span> <span class="Constant">load-ingredients</span> <span id="L545" class="LineNr">545 </span> <span class="Delimiter">{</span> -<span id="L546" class="LineNr">546 </span> <span class="muControl">break-if</span> screen +<span id="L546" class="LineNr">546 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L547" class="LineNr">547 </span> <span class="Comment"># real screen</span> <span id="L548" class="LineNr">548 </span> move-cursor-left-on-display <span id="L549" class="LineNr">549 </span> <span class="muControl">return</span> @@ -615,33 +615,33 @@ if ('onhashchange' in window) { <span id="L556" class="LineNr">556 </span> *screen <span class="Special"><-</span> put *screen, <span class="Constant">cursor-column:offset</span>, column <span id="L557" class="LineNr">557 </span>] <span id="L558" class="LineNr">558 </span> -<span id="L559" class="LineNr">559 </span><span class="muRecipe">def</span> cursor-to-start-of-line screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L559" class="LineNr">559 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L559'>cursor-to-start-of-line</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L560" class="LineNr">560 </span> <span class="Constant">local-scope</span> <span id="L561" class="LineNr">561 </span> <span class="Constant">load-ingredients</span> -<span id="L562" class="LineNr">562 </span> row:num <span class="Special"><-</span> cursor-position screen +<span id="L562" class="LineNr">562 </span> row:num <span class="Special"><-</span> <a href='081print.mu.html#L428'>cursor-position</a> <a href='081print.mu.html#L4'>screen</a> <span id="L563" class="LineNr">563 </span> column:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> -<span id="L564" class="LineNr">564 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L564" class="LineNr">564 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L565" class="LineNr">565 </span>] <span id="L566" class="LineNr">566 </span> -<span id="L567" class="LineNr">567 </span><span class="muRecipe">def</span> cursor-to-next-line screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L567" class="LineNr">567 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L568" class="LineNr">568 </span> <span class="Constant">local-scope</span> <span id="L569" class="LineNr">569 </span> <span class="Constant">load-ingredients</span> -<span id="L570" class="LineNr">570 </span> screen <span class="Special"><-</span> cursor-down screen -<span id="L571" class="LineNr">571 </span> screen <span class="Special"><-</span> cursor-to-start-of-line screen +<span id="L570" class="LineNr">570 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L487'>cursor-down</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L571" class="LineNr">571 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L559'>cursor-to-start-of-line</a> <a href='081print.mu.html#L4'>screen</a> <span id="L572" class="LineNr">572 </span>] <span id="L573" class="LineNr">573 </span> -<span id="L574" class="LineNr">574 </span><span class="muRecipe">def</span> move-cursor-to-column screen:&:screen, column:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L574" class="LineNr">574 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L574'>move-cursor-to-column</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, column:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L575" class="LineNr">575 </span> <span class="Constant">local-scope</span> <span id="L576" class="LineNr">576 </span> <span class="Constant">load-ingredients</span> -<span id="L577" class="LineNr">577 </span> row:num, _ <span class="Special"><-</span> cursor-position screen -<span id="L578" class="LineNr">578 </span> move-cursor screen, row, column +<span id="L577" class="LineNr">577 </span> row:num, _ <span class="Special"><-</span> <a href='081print.mu.html#L428'>cursor-position</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L578" class="LineNr">578 </span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L579" class="LineNr">579 </span>] <span id="L580" class="LineNr">580 </span> -<span id="L581" class="LineNr">581 </span><span class="muRecipe">def</span> screen-width screen:&:screen<span class="muRecipe"> -> </span>width:num [ +<span id="L581" class="LineNr">581 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>width:num [ <span id="L582" class="LineNr">582 </span> <span class="Constant">local-scope</span> <span id="L583" class="LineNr">583 </span> <span class="Constant">load-ingredients</span> <span id="L584" class="LineNr">584 </span> <span class="Delimiter">{</span> -<span id="L585" class="LineNr">585 </span> <span class="muControl">break-unless</span> screen +<span id="L585" class="LineNr">585 </span> <span class="muControl">break-unless</span> <a href='081print.mu.html#L4'>screen</a> <span id="L586" class="LineNr">586 </span> <span class="Comment"># fake screen</span> <span id="L587" class="LineNr">587 </span> width <span class="Special"><-</span> get *screen, <span class="Constant">num-columns:offset</span> <span id="L588" class="LineNr">588 </span> <span class="muControl">return</span> @@ -650,11 +650,11 @@ if ('onhashchange' in window) { <span id="L591" class="LineNr">591 </span> width <span class="Special"><-</span> display-width <span id="L592" class="LineNr">592 </span>] <span id="L593" class="LineNr">593 </span> -<span id="L594" class="LineNr">594 </span><span class="muRecipe">def</span> screen-height screen:&:screen<span class="muRecipe"> -> </span>height:num [ +<span id="L594" class="LineNr">594 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>height:num [ <span id="L595" class="LineNr">595 </span> <span class="Constant">local-scope</span> <span id="L596" class="LineNr">596 </span> <span class="Constant">load-ingredients</span> <span id="L597" class="LineNr">597 </span> <span class="Delimiter">{</span> -<span id="L598" class="LineNr">598 </span> <span class="muControl">break-unless</span> screen +<span id="L598" class="LineNr">598 </span> <span class="muControl">break-unless</span> <a href='081print.mu.html#L4'>screen</a> <span id="L599" class="LineNr">599 </span> <span class="Comment"># fake screen</span> <span id="L600" class="LineNr">600 </span> height <span class="Special"><-</span> get *screen, <span class="Constant">num-rows:offset</span> <span id="L601" class="LineNr">601 </span> <span class="muControl">return</span> @@ -663,39 +663,39 @@ if ('onhashchange' in window) { <span id="L604" class="LineNr">604 </span> height <span class="Special"><-</span> display-height <span id="L605" class="LineNr">605 </span>] <span id="L606" class="LineNr">606 </span> -<span id="L607" class="LineNr">607 </span><span class="muRecipe">def</span> hide-cursor screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L607" class="LineNr">607 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L607'>hide-cursor</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L608" class="LineNr">608 </span> <span class="Constant">local-scope</span> <span id="L609" class="LineNr">609 </span> <span class="Constant">load-ingredients</span> -<span id="L610" class="LineNr">610 </span> <span class="muControl">return-if</span> screen <span class="Comment"># fake screen; do nothing</span> +<span id="L610" class="LineNr">610 </span> <span class="muControl">return-if</span> <a href='081print.mu.html#L4'>screen</a> <span class="Comment"># fake screen; do nothing</span> <span id="L611" class="LineNr">611 </span> <span class="Comment"># real screen</span> <span id="L612" class="LineNr">612 </span> hide-cursor-on-display <span id="L613" class="LineNr">613 </span>] <span id="L614" class="LineNr">614 </span> -<span id="L615" class="LineNr">615 </span><span class="muRecipe">def</span> show-cursor screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L615" class="LineNr">615 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L615'>show-cursor</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L616" class="LineNr">616 </span> <span class="Constant">local-scope</span> <span id="L617" class="LineNr">617 </span> <span class="Constant">load-ingredients</span> -<span id="L618" class="LineNr">618 </span> <span class="muControl">return-if</span> screen <span class="Comment"># fake screen; do nothing</span> +<span id="L618" class="LineNr">618 </span> <span class="muControl">return-if</span> <a href='081print.mu.html#L4'>screen</a> <span class="Comment"># fake screen; do nothing</span> <span id="L619" class="LineNr">619 </span> <span class="Comment"># real screen</span> <span id="L620" class="LineNr">620 </span> show-cursor-on-display <span id="L621" class="LineNr">621 </span>] <span id="L622" class="LineNr">622 </span> -<span id="L623" class="LineNr">623 </span><span class="muRecipe">def</span> hide-screen screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L623" class="LineNr">623 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L624" class="LineNr">624 </span> <span class="Constant">local-scope</span> <span id="L625" class="LineNr">625 </span> <span class="Constant">load-ingredients</span> -<span id="L626" class="LineNr">626 </span> <span class="muControl">return-if</span> screen <span class="Comment"># fake screen; do nothing</span> +<span id="L626" class="LineNr">626 </span> <span class="muControl">return-if</span> <a href='081print.mu.html#L4'>screen</a> <span class="Comment"># fake screen; do nothing</span> <span id="L627" class="LineNr">627 </span> <span class="Comment"># real screen</span> <span id="L628" class="LineNr">628 </span> hide-display <span id="L629" class="LineNr">629 </span>] <span id="L630" class="LineNr">630 </span> -<span id="L631" class="LineNr">631 </span><span class="muRecipe">def</span> show-screen screen:&:screen<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L631" class="LineNr">631 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L632" class="LineNr">632 </span> <span class="Constant">local-scope</span> <span id="L633" class="LineNr">633 </span> <span class="Constant">load-ingredients</span> -<span id="L634" class="LineNr">634 </span> <span class="muControl">return-if</span> screen <span class="Comment"># fake screen; do nothing</span> +<span id="L634" class="LineNr">634 </span> <span class="muControl">return-if</span> <a href='081print.mu.html#L4'>screen</a> <span class="Comment"># fake screen; do nothing</span> <span id="L635" class="LineNr">635 </span> <span class="Comment"># real screen</span> <span id="L636" class="LineNr">636 </span> show-display <span id="L637" class="LineNr">637 </span>] <span id="L638" class="LineNr">638 </span> -<span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> print screen:&:screen, s:text<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, s:text<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L640" class="LineNr">640 </span> <span class="Constant">local-scope</span> <span id="L641" class="LineNr">641 </span> <span class="Constant">load-ingredients</span> <span id="L642" class="LineNr">642 </span> color:num, color-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> @@ -716,7 +716,7 @@ if ('onhashchange' in window) { <span id="L657" class="LineNr">657 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L658" class="LineNr">658 </span> <span class="muControl">break-if</span> done? <span id="L659" class="LineNr">659 </span> c:char <span class="Special"><-</span> index *s, i -<span id="L660" class="LineNr">660 </span> print screen, c, color, bg-color +<span id="L660" class="LineNr">660 </span> print <a href='081print.mu.html#L4'>screen</a>, c, color, bg-color <span id="L661" class="LineNr">661 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L662" class="LineNr">662 </span> <span class="muControl">loop</span> <span id="L663" class="LineNr">663 </span> <span class="Delimiter">}</span> @@ -724,11 +724,11 @@ if ('onhashchange' in window) { <span id="L665" class="LineNr">665 </span> <span id="L666" class="LineNr">666 </span><span class="muScenario">scenario</span> print-text-stops-at-right-margin [ <span id="L667" class="LineNr">667 </span> <span class="Constant">local-scope</span> -<span id="L668" class="LineNr">668 </span> fake-screen:&:screen <span class="Special"><-</span> new-fake-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> +<span id="L668" class="LineNr">668 </span> fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L17'>new-fake-screen</a> <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L669" class="LineNr">669 </span> run [ <span id="L670" class="LineNr">670 </span> fake-screen <span class="Special"><-</span> print fake-screen, <span class="Constant">[abcd]</span> -<span id="L671" class="LineNr">671 </span> cell:&:@:screen-cell <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> -<span id="L672" class="LineNr">672 </span> 10:@:screen-cell/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell +<span id="L671" class="LineNr">671 </span> cell:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *fake-screen, <span class="Constant">data:offset</span> +<span id="L672" class="LineNr">672 </span> 10:@:<a href='081print.mu.html#L12'>screen-cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> copy *cell <span id="L673" class="LineNr">673 </span> ] <span id="L674" class="LineNr">674 </span> memory-should-contain [ <span id="L675" class="LineNr">675 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 6</span> <span class="Comment"># width*height</span> @@ -743,7 +743,7 @@ if ('onhashchange' in window) { <span id="L684" class="LineNr">684 </span> ] <span id="L685" class="LineNr">685 </span>] <span id="L686" class="LineNr">686 </span> -<span id="L687" class="LineNr">687 </span><span class="muRecipe">def</span> print-integer screen:&:screen, n:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L687" class="LineNr">687 </span><span class="muRecipe">def</span> <a href='081print.mu.html#L687'>print-integer</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, n:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L688" class="LineNr">688 </span> <span class="Constant">local-scope</span> <span id="L689" class="LineNr">689 </span> <span class="Constant">load-ingredients</span> <span id="L690" class="LineNr">690 </span> color:num, color-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> @@ -760,11 +760,11 @@ if ('onhashchange' in window) { <span id="L701" class="LineNr">701 </span> <span class="Delimiter">}</span> <span id="L702" class="LineNr">702 </span> <span class="Comment"># todo: other bases besides decimal</span> <span id="L703" class="LineNr">703 </span> s:text <span class="Special"><-</span> to-text n -<span id="L704" class="LineNr">704 </span> screen <span class="Special"><-</span> print screen, s, color, bg-color +<span id="L704" class="LineNr">704 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, s, color, bg-color <span id="L705" class="LineNr">705 </span>] <span id="L706" class="LineNr">706 </span> <span id="L707" class="LineNr">707 </span><span class="Comment"># for now, we can only print integers</span> -<span id="L708" class="LineNr">708 </span><span class="muRecipe">def</span> print screen:&:screen, n:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L708" class="LineNr">708 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, n:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L709" class="LineNr">709 </span> <span class="Constant">local-scope</span> <span id="L710" class="LineNr">710 </span> <span class="Constant">load-ingredients</span> <span id="L711" class="LineNr">711 </span> color:num, color-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> @@ -779,11 +779,11 @@ if ('onhashchange' in window) { <span id="L720" class="LineNr">720 </span> <span class="muControl">break-if</span> bg-color-found? <span id="L721" class="LineNr">721 </span> bg-color <span class="Special"><-</span> copy <span class="Constant">0/black</span> <span id="L722" class="LineNr">722 </span> <span class="Delimiter">}</span> -<span id="L723" class="LineNr">723 </span> screen <span class="Special"><-</span> print-integer screen, n, color, bg-color +<span id="L723" class="LineNr">723 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L687'>print-integer</a> <a href='081print.mu.html#L4'>screen</a>, n, color, bg-color <span id="L724" class="LineNr">724 </span>] <span id="L725" class="LineNr">725 </span> <span id="L726" class="LineNr">726 </span><span class="Comment"># addresses</span> -<span id="L727" class="LineNr">727 </span><span class="muRecipe">def</span> print screen:&:screen, n:&:_elem<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L727" class="LineNr">727 </span><span class="muRecipe">def</span> print <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, n:&:_elem<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L728" class="LineNr">728 </span> <span class="Constant">local-scope</span> <span id="L729" class="LineNr">729 </span> <span class="Constant">load-ingredients</span> <span id="L730" class="LineNr">730 </span> color:num, color-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> @@ -799,7 +799,7 @@ if ('onhashchange' in window) { <span id="L740" class="LineNr">740 </span> bg-color <span class="Special"><-</span> copy <span class="Constant">0/black</span> <span id="L741" class="LineNr">741 </span> <span class="Delimiter">}</span> <span id="L742" class="LineNr">742 </span> n2:num <span class="Special"><-</span> copy n -<span id="L743" class="LineNr">743 </span> screen <span class="Special"><-</span> print-integer screen, n2, color, bg-color +<span id="L743" class="LineNr">743 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L687'>print-integer</a> <a href='081print.mu.html#L4'>screen</a>, n2, color, bg-color <span id="L744" class="LineNr">744 </span>] </pre> </body> diff --git a/html/082scenario_screen.cc.html b/html/082scenario_screen.cc.html index d4242807..8175bfdd 100644 --- a/html/082scenario_screen.cc.html +++ b/html/082scenario_screen.cc.html @@ -72,7 +72,7 @@ if ('onhashchange' in window) { <span id="L11" class="LineNr"> 11 </span> <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario screen_in_scenario)</span> -<span id="L14" class="LineNr"> 14 </span><span class="muScenario">scenario</span> screen-in-scenario [ +<span id="L14" class="LineNr"> 14 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> screen-in-scenario [ <span id="L15" class="LineNr"> 15 </span> local-scope <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 <span id="L17" class="LineNr"> 17 </span> run [ @@ -90,7 +90,7 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr"> 29 </span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">:(scenario screen_in_scenario_unicode)</span> <span id="L31" class="LineNr"> 31 </span><span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span> -<span id="L32" class="LineNr"> 32 </span><span class="muScenario">scenario</span> screen-in-scenario-unicode [ +<span id="L32" class="LineNr"> 32 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> screen-in-scenario-unicode [ <span id="L33" class="LineNr"> 33 </span> local-scope <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 <span id="L35" class="LineNr"> 35 </span> run [ @@ -109,7 +109,7 @@ if ('onhashchange' in window) { <span id="L48" class="LineNr"> 48 </span><span class="Comment"># checks are inside scenario</span> <span id="L49" class="LineNr"> 49 </span> <span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(scenario screen_in_scenario_color)</span> -<span id="L51" class="LineNr"> 51 </span><span class="muScenario">scenario</span> screen-in-scenario-color [ +<span id="L51" class="LineNr"> 51 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> screen-in-scenario-color [ <span id="L52" class="LineNr"> 52 </span> local-scope <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 <span id="L54" class="LineNr"> 54 </span> run [ @@ -146,7 +146,7 @@ if ('onhashchange' in window) { <span id="L85" class="LineNr"> 85 </span><span class="Delimiter">:(scenario screen_in_scenario_error)</span> <span id="L86" class="LineNr"> 86 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L87" class="LineNr"> 87 </span><span class="Special">% Hide_errors = true;</span> -<span id="L88" class="LineNr"> 88 </span><span class="muScenario">scenario</span> screen-in-scenario-error [ +<span id="L88" class="LineNr"> 88 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> screen-in-scenario-error [ <span id="L89" class="LineNr"> 89 </span> local-scope <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 <span id="L91" class="LineNr"> 91 </span> run [ @@ -166,7 +166,7 @@ if ('onhashchange' in window) { <span id="L105" class="LineNr">105 </span><span class="Special">% Scenario_testing_scenario = true;</span> <span id="L106" class="LineNr">106 </span><span class="Special">% Hide_errors = true;</span> <span id="L107" class="LineNr">107 </span><span class="Comment"># screen-should-contain can check unicode characters in the fake screen</span> -<span id="L108" class="LineNr">108 </span><span class="muScenario">scenario</span> screen-in-scenario-color-error [ +<span id="L108" class="LineNr">108 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> screen-in-scenario-color-error [ <span id="L109" class="LineNr">109 </span> local-scope <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 <span id="L111" class="LineNr">111 </span> run [ @@ -185,10 +185,10 @@ if ('onhashchange' in window) { <span id="L124" class="LineNr">124 </span><span class="Delimiter">:(scenarios run)</span> <span id="L125" class="LineNr">125 </span><span class="Delimiter">:(scenario convert_names_does_not_fail_when_mixing_special_names_and_numeric_locations)</span> <span id="L126" class="LineNr">126 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> main [ +<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L128" class="LineNr">128 </span> <span class="Normal">screen</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span>:num <span id="L129" class="LineNr">129 </span>] -<span id="L130" class="LineNr">130 </span><span class="traceAbsent">-error: mixing variable names and numeric addresses in main</span> +<span id="L130" class="LineNr">130 </span><span class="traceAbsent">-error: mixing variable names and numeric addresses in <a href='000organization.cc.html#L113'>main</a></span> <span id="L131" class="LineNr">131 </span>$error: <span class="Constant">0</span> <span id="L132" class="LineNr">132 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span> <span id="L133" class="LineNr">133 </span> @@ -213,30 +213,30 @@ if ('onhashchange' in window) { <span id="L152" class="LineNr">152 </span><span class="Delimiter">:(before "End Special Scenario Variable Names(r)")</span> <span id="L153" class="LineNr">153 </span>Name[r][<span class="Constant">"screen"</span>] = SCREEN<span class="Delimiter">;</span> <span id="L154" class="LineNr">154 </span><span class="Comment">//: make 'screen' always a raw location in scenarios</span> -<span id="L155" class="LineNr">155 </span><span class="Delimiter">:(before "End is_special_name Special-cases")</span> +<span id="L155" class="LineNr">155 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> <span id="L156" class="LineNr">156 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"screen"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L157" class="LineNr">157 </span> -<span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, recipe result)")</span> +<span id="L158" class="LineNr">158 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> <span id="L159" class="LineNr">159 </span><span class="Comment">// rewrite `assume-screen width, height` to</span> <span id="L160" class="LineNr">160 </span><span class="Comment">// `screen:&:screen <- new-fake-screen width, height`</span> <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">"assume-screen"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L162" class="LineNr">162 </span> curr<span class="Delimiter">.</span>name = <span class="Constant">"new-fake-screen"</span><span class="Delimiter">;</span> <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> -<span id="L164" class="LineNr">164 </span> raise << result<span class="Delimiter">.</span>name << <span class="Constant">": 'assume-screen' has no products</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L178'>raise</a> << result<span class="Delimiter">.</span>name << <span class="Constant">": 'assume-screen' has no products</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L165" class="LineNr">165 </span> <span class="Delimiter">}</span> <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">"scenario_"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L167" class="LineNr">167 </span> raise << result<span class="Delimiter">.</span>name << <span class="Constant">": 'assume-screen' can't be called here, only in scenarios</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L167" class="LineNr">167 </span> <a href='003trace.cc.html#L178'>raise</a> << result<span class="Delimiter">.</span>name << <span class="Constant">": 'assume-screen' can't be called here, only in scenarios</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L168" class="LineNr">168 </span> <span class="Delimiter">}</span> <span id="L169" class="LineNr">169 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <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> <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">"screen:&:screen/raw"</span><span class="Delimiter">));</span> -<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> +<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><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>SCREEN<span class="Delimiter">);</span> <span id="L173" class="LineNr">173 </span> <span class="Delimiter">}</span> <span id="L174" class="LineNr">174 </span><span class="Delimiter">}</span> <span id="L175" class="LineNr">175 </span> <span id="L176" class="LineNr">176 </span><span class="Delimiter">:(scenario assume_screen_shows_up_in_errors)</span> <span id="L177" class="LineNr">177 </span><span class="Special">% Hide_errors = true;</span> -<span id="L178" class="LineNr">178 </span><span class="muScenario">scenario</span> assume-screen-shows-up-in-errors [ +<span id="L178" class="LineNr">178 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> assume-screen-shows-up-in-errors [ <span id="L179" class="LineNr">179 </span> assume-screen width<span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L180" class="LineNr">180 </span>] <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> @@ -245,15 +245,15 @@ if ('onhashchange' in window) { <span id="L184" class="LineNr">184 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L185" class="LineNr">185 </span>SCREEN_SHOULD_CONTAIN<span class="Delimiter">,</span> <span id="L186" class="LineNr">186 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L187" class="LineNr">187 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen-should-contain"</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN<span class="Delimiter">);</span> +<span id="L187" class="LineNr">187 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen-should-contain"</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN<span class="Delimiter">);</span> <span id="L188" class="LineNr">188 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L189" class="LineNr">189 </span><span class="Normal">case</span> SCREEN_SHOULD_CONTAIN: <span class="Delimiter">{</span> -<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> -<span id="L191" class="LineNr">191 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'screen-should-contain' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L190" class="LineNr">190 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L191" class="LineNr">191 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'screen-should-contain' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L192" class="LineNr">192 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L193" class="LineNr">193 </span> <span class="Delimiter">}</span> <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> -<span id="L195" class="LineNr">195 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'screen-should-contain' should be a literal string, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L195" class="LineNr">195 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'screen-should-contain' should be a literal string, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L196" class="LineNr">196 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L197" class="LineNr">197 </span> <span class="Delimiter">}</span> <span id="L198" class="LineNr">198 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -269,19 +269,19 @@ if ('onhashchange' in window) { <span id="L208" class="LineNr">208 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L209" class="LineNr">209 </span>SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">,</span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L211" class="LineNr">211 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen-should-contain-in-color"</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">);</span> +<span id="L211" class="LineNr">211 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen-should-contain-in-color"</span><span class="Delimiter">,</span> SCREEN_SHOULD_CONTAIN_IN_COLOR<span class="Delimiter">);</span> <span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L213" class="LineNr">213 </span><span class="Normal">case</span> SCREEN_SHOULD_CONTAIN_IN_COLOR: <span class="Delimiter">{</span> -<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> -<span id="L215" class="LineNr">215 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'screen-should-contain-in-color' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L214" class="LineNr">214 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'screen-should-contain-in-color' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L216" class="LineNr">216 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L217" class="LineNr">217 </span> <span class="Delimiter">}</span> <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> -<span id="L219" class="LineNr">219 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'screen-should-contain-in-color' should be a number (color code), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L219" class="LineNr">219 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'screen-should-contain-in-color' should be a number (color code), but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L220" class="LineNr">220 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L221" class="LineNr">221 </span> <span class="Delimiter">}</span> <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> -<span id="L223" class="LineNr">223 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'screen-should-contain-in-color' should be a literal string, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L223" class="LineNr">223 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'screen-should-contain-in-color' should be a literal string, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L224" class="LineNr">224 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L225" class="LineNr">225 </span> <span class="Delimiter">}</span> <span id="L226" class="LineNr">226 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -306,50 +306,50 @@ if ('onhashchange' in window) { <span id="L245" class="LineNr">245 </span> <span class="Normal">uint32_t</span> get<span class="Delimiter">();</span> <span class="Comment">// unicode codepoint</span> <span id="L246" class="LineNr">246 </span> <span class="Normal">uint32_t</span> peek<span class="Delimiter">();</span> <span class="Comment">// unicode codepoint</span> <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> -<span id="L248" class="LineNr">248 </span> <span class="Normal">void</span> skip_whitespace_and_comments<span class="Delimiter">();</span> +<span id="L248" class="LineNr">248 </span> <span class="Normal">void</span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">();</span> <span id="L249" class="LineNr">249 </span><span class="Delimiter">};</span> <span id="L250" class="LineNr">250 </span> <span id="L251" class="LineNr">251 </span><span class="Delimiter">:(code)</span> <span id="L252" class="LineNr">252 </span><span class="Normal">void</span> check_screen<span class="Delimiter">(</span><span class="Normal">const</span> string& 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 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> -<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">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"data"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L253" class="LineNr">253 </span> <span class="Normal">int</span> screen_location = <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L254" class="LineNr">254 </span> <span class="Normal">int</span> data_offset = <a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"data"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L255" class="LineNr">255 </span> assert<span class="Delimiter">(</span>data_offset >= <span class="Constant">0</span><span class="Delimiter">);</span> <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> -<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> -<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">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-columns"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-rows"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> +<span id="L257" class="LineNr">257 </span> <span class="Normal">int</span> screen_data_start = <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L258" class="LineNr">258 </span> <span class="Normal">int</span> width_offset = <a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-columns"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L259" class="LineNr">259 </span> <span class="Normal">int</span> screen_width = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+width_offset<span class="Delimiter">);</span> +<span id="L260" class="LineNr">260 </span> <span class="Normal">int</span> height_offset = <a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-rows"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L261" class="LineNr">261 </span> <span class="Normal">int</span> screen_height = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+height_offset<span class="Delimiter">);</span> <span id="L262" class="LineNr">262 </span> raw_string_stream cursor<span class="Delimiter">(</span>expected_contents<span class="Delimiter">);</span> <span id="L263" class="LineNr">263 </span> <span class="Comment">// todo: too-long expected_contents should fail</span> <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> <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 < screen_height<span class="Delimiter">;</span> ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L266" class="LineNr">266 </span> cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span> +<span id="L266" class="LineNr">266 </span> cursor<span class="Delimiter">.</span><a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">();</span> <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> <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> -<span id="L269" class="LineNr">269 </span> raise << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": each row of the expected screen should start with a '.'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L269" class="LineNr">269 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": each row of the expected screen should start with a '.'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="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> <span id="L271" class="LineNr">271 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L272" class="LineNr">272 </span> <span class="Delimiter">}</span> <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 < 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 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> <span id="L275" class="LineNr">275 </span> <span class="Normal">uint32_t</span> curr = cursor<span class="Delimiter">.</span>get<span class="Delimiter">();</span> -<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> && isspace<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L277" class="LineNr">277 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr == <span class="Constant">' '</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="Delimiter">{</span> +<span id="L276" class="LineNr">276 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> == <span class="Constant">0</span> && isspace<span class="Delimiter">(</span>curr<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L277" class="LineNr">277 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr == <span class="Constant">' '</span> && color != -<span class="Constant">1</span> && color != <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L278" class="LineNr">278 </span> <span class="Comment">// filter out other colors</span> <span id="L279" class="LineNr">279 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L280" class="LineNr">280 </span> <span class="Delimiter">}</span> -<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> && 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 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> +<span id="L281" class="LineNr">281 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> != <span class="Constant">0</span> && <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> == curr<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L282" class="LineNr">282 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>color == -<span class="Constant">1</span> || color == <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L283" class="LineNr">283 </span> <span class="Comment">// contents match but color is off</span> <span id="L284" class="LineNr">284 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L285" class="LineNr">285 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L286" class="LineNr">286 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">", address "</span> << addr << <span class="Constant">", value "</span> << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> << <span class="Constant">") to be in color "</span> << color << <span class="Constant">" instead of "</span> << 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> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L286" class="LineNr">286 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">", <a href='043space.cc.html#L76'>address</a> "</span> << addr << <span class="Constant">", value "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> << <span class="Constant">") to be in color "</span> << color << <span class="Constant">" instead of "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L287" class="LineNr">287 </span> dump_screen<span class="Delimiter">();</span> <span id="L288" class="LineNr">288 </span> <span class="Delimiter">}</span> <span id="L289" class="LineNr">289 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L290" class="LineNr">290 </span> <span class="Comment">// just testing check_screen</span> -<span id="L291" class="LineNr">291 </span> raise << <span class="Constant">"expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to be in color "</span> << color << <span class="Constant">" instead of "</span> << 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> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L291" class="LineNr">291 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to be in color "</span> << color << <span class="Constant">" instead of "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr+cell_color_offset<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L292" class="LineNr">292 </span> <span class="Delimiter">}</span> <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> <span id="L294" class="LineNr">294 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> @@ -363,44 +363,44 @@ if ('onhashchange' in window) { <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><<span class="Normal">unsigned</span> <span class="Normal">char</span>><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 id="L303" class="LineNr">303 </span> <span class="Delimiter">}</span> <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> -<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> < <span class="Constant">256</span> && !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 id="L305" class="LineNr">305 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)</span> < <span class="Constant">256</span> && !iscntrl<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">)))</span> <span class="Delimiter">{</span> <span id="L306" class="LineNr">306 </span> <span class="Comment">// " ('<curr>')"</span> -<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><<span class="Normal">unsigned</span> <span class="Normal">char</span>><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 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><<span class="Normal">unsigned</span> <span class="Normal">char</span>><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><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 id="L308" class="LineNr">308 </span> <span class="Delimiter">}</span> <span id="L309" class="LineNr">309 </span> <span id="L310" class="LineNr">310 </span> ostringstream color_phrase<span class="Delimiter">;</span> <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 << <span class="Constant">" in color "</span> << color<span class="Delimiter">;</span> <span id="L312" class="LineNr">312 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L313" class="LineNr">313 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L314" class="LineNr">314 </span> raise << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to contain "</span> << curr << expected_pretty << color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << <span class="Constant">" instead of "</span> << no_scientific<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="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L314" class="LineNr">314 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to contain "</span> << curr << expected_pretty << color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << <span class="Constant">" instead of "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> << actual_pretty << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L315" class="LineNr">315 </span> dump_screen<span class="Delimiter">();</span> <span id="L316" class="LineNr">316 </span> <span class="Delimiter">}</span> <span id="L317" class="LineNr">317 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L318" class="LineNr">318 </span> <span class="Comment">// just testing check_screen</span> -<span id="L319" class="LineNr">319 </span> raise << <span class="Constant">"expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to contain "</span> << curr << expected_pretty << color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << <span class="Constant">" instead of "</span> << no_scientific<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="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L319" class="LineNr">319 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected screen location ("</span> << row << <span class="Constant">", "</span> << column << <span class="Constant">") to contain "</span> << curr << expected_pretty << color_phrase<span class="Delimiter">.</span>str<span class="Delimiter">()</span> << <span class="Constant">" instead of "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> addr<span class="Delimiter">))</span> << actual_pretty << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L320" class="LineNr">320 </span> <span class="Delimiter">}</span> <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> <span id="L322" class="LineNr">322 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L323" class="LineNr">323 </span> <span class="Delimiter">}</span> <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> -<span id="L325" class="LineNr">325 </span> raise << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": row "</span> << row << <span class="Constant">" of the expected screen is too long</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L325" class="LineNr">325 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": row "</span> << row << <span class="Constant">" of the expected screen is too long</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <span id="L327" class="LineNr">327 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L328" class="LineNr">328 </span> <span class="Delimiter">}</span> <span id="L329" class="LineNr">329 </span> <span class="Delimiter">}</span> -<span id="L330" class="LineNr">330 </span> cursor<span class="Delimiter">.</span>skip_whitespace_and_comments<span class="Delimiter">();</span> +<span id="L330" class="LineNr">330 </span> cursor<span class="Delimiter">.</span><a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">();</span> <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> -<span id="L332" class="LineNr">332 </span> raise << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen has too many rows</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L332" class="LineNr">332 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected screen has too many rows</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L333" class="LineNr">333 </span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L334" class="LineNr">334 </span> <span class="Delimiter">}</span> <span id="L335" class="LineNr">335 </span><span class="Delimiter">}</span> <span id="L336" class="LineNr">336 </span> -<span id="L337" class="LineNr">337 </span>raw_string_stream::raw_string_stream<span class="Delimiter">(</span><span class="Normal">const</span> string& 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 id="L337" class="LineNr">337 </span>raw_string_stream::raw_string_stream<span class="Delimiter">(</span><span class="Normal">const</span> string& backing<span class="Delimiter">)</span> :index<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> max<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 id="L338" class="LineNr">338 </span> <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> <span id="L340" class="LineNr">340 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>index >= max<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <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> > max-index<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L342" class="LineNr">342 </span> raise << <span class="Constant">"unicode string seems corrupted at index "</span><< index << <span class="Constant">" character "</span> << <span class="Normal">static_cast</span><<span class="Normal">int</span>><span class="Delimiter">(</span>buf[index]<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L342" class="LineNr">342 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unicode string seems corrupted at index "</span><< index << <span class="Constant">" character "</span> << <span class="Normal">static_cast</span><<span class="Normal">int</span>><span class="Delimiter">(</span>buf[index]<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L343" class="LineNr">343 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L344" class="LineNr">344 </span> <span class="Delimiter">}</span> <span id="L345" class="LineNr">345 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> @@ -423,7 +423,7 @@ if ('onhashchange' in window) { <span id="L362" class="LineNr">362 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L363" class="LineNr">363 </span><span class="Delimiter">}</span> <span id="L364" class="LineNr">364 </span> -<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> +<span id="L365" class="LineNr">365 </span><span class="Normal">void</span> raw_string_stream::<a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> <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> <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> @@ -438,7 +438,7 @@ if ('onhashchange' in window) { <span id="L377" class="LineNr">377 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L378" class="LineNr">378 </span>_DUMP_SCREEN<span class="Delimiter">,</span> <span id="L379" class="LineNr">379 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L380" class="LineNr">380 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-screen"</span><span class="Delimiter">,</span> _DUMP_SCREEN<span class="Delimiter">);</span> +<span id="L380" class="LineNr">380 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$dump-screen"</span><span class="Delimiter">,</span> _DUMP_SCREEN<span class="Delimiter">);</span> <span id="L381" class="LineNr">381 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L382" class="LineNr">382 </span><span class="Normal">case</span> _DUMP_SCREEN: <span class="Delimiter">{</span> <span id="L383" class="LineNr">383 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -451,22 +451,22 @@ if ('onhashchange' in window) { <span id="L390" class="LineNr">390 </span> <span id="L391" class="LineNr">391 </span><span class="Delimiter">:(code)</span> <span id="L392" class="LineNr">392 </span><span class="Normal">void</span> dump_screen<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<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> -<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">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-columns"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-rows"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> -<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> -<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">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"data"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L393" class="LineNr">393 </span> <span class="Normal">int</span> screen_location = <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L394" class="LineNr">394 </span> <span class="Normal">int</span> width_offset = <a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-columns"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L395" class="LineNr">395 </span> <span class="Normal">int</span> screen_width = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+width_offset<span class="Delimiter">);</span> +<span id="L396" class="LineNr">396 </span> <span class="Normal">int</span> height_offset = <a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"num-rows"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L397" class="LineNr">397 </span> <span class="Normal">int</span> screen_height = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> screen_location+height_offset<span class="Delimiter">);</span> +<span id="L398" class="LineNr">398 </span> <span class="Normal">int</span> data_offset = <a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">"screen"</span><span class="Delimiter">),</span> <span class="Constant">"data"</span><span class="Delimiter">,</span> <span class="Constant">""</span><span class="Delimiter">);</span> <span id="L399" class="LineNr">399 </span> assert<span class="Delimiter">(</span>data_offset >= <span class="Constant">0</span><span class="Delimiter">);</span> <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> -<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> -<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> +<span id="L401" class="LineNr">401 </span> <span class="Normal">int</span> screen_data_start = <a href='001help.cc.html#L225'>get_or_insert</a><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 id="L402" class="LineNr">402 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><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 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> <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 < screen_height<span class="Delimiter">;</span> ++row<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L405" class="LineNr">405 </span> cerr << <span class="Constant">'.'</span><span class="Delimiter">;</span> <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 < screen_width<span class="Delimiter">;</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> -<span id="L408" class="LineNr">408 </span> cerr << to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span><<span class="Normal">uint32_t</span>><span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span> +<span id="L407" class="LineNr">407 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">))</span> +<span id="L408" class="LineNr">408 </span> cerr << to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span><<span class="Normal">uint32_t</span>><span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span> <span id="L409" class="LineNr">409 </span> <span class="Normal">else</span> <span id="L410" class="LineNr">410 </span> cerr << <span class="Constant">' '</span><span class="Delimiter">;</span> <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> diff --git a/html/083scenario_screen_test.mu.html b/html/083scenario_screen_test.mu.html index 3ed30df1..bcb91f8d 100644 --- a/html/083scenario_screen_test.mu.html +++ b/html/083scenario_screen_test.mu.html @@ -59,7 +59,7 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span> assume-screen <span class="Constant">3/width</span>, <span class="Constant">2/height</span> <span id="L6" class="LineNr"> 6 </span> run [ <span id="L7" class="LineNr"> 7 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> -<span id="L8" class="LineNr"> 8 </span> screen:&:screen <span class="Special"><-</span> print screen:&:screen, a +<span id="L8" class="LineNr"> 8 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, a <span id="L9" class="LineNr"> 9 </span> ] <span id="L10" class="LineNr">10 </span> screen-should-contain [ <span id="L11" class="LineNr">11 </span> <span class="Constant"> .a .</span> @@ -72,11 +72,11 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr">18 </span> assume-screen <span class="Constant">5/width</span>, <span class="Constant">3/height</span> <span id="L19" class="LineNr">19 </span> <span class="Comment"># print a character</span> <span id="L20" class="LineNr">20 </span> a:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> -<span id="L21" class="LineNr">21 </span> screen:&:screen <span class="Special"><-</span> print screen:&:screen, a +<span id="L21" class="LineNr">21 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, a <span id="L22" class="LineNr">22 </span> <span class="Comment"># move cursor to start of line</span> -<span id="L23" class="LineNr">23 </span> screen:&:screen <span class="Special"><-</span> move-cursor screen:&:screen, <span class="Constant">0/row</span>, <span class="Constant">0/column</span> +<span id="L23" class="LineNr">23 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <span class="Constant">0/row</span>, <span class="Constant">0/column</span> <span id="L24" class="LineNr">24 </span> run [ -<span id="L25" class="LineNr">25 </span> screen:&:screen <span class="Special"><-</span> clear-line screen:&:screen +<span id="L25" class="LineNr">25 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L381'>clear-line</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L26" class="LineNr">26 </span> ] <span id="L27" class="LineNr">27 </span> screen-should-contain [ <span id="L28" class="LineNr">28 </span> <span class="Constant"> . .</span> diff --git a/html/084console.mu.html b/html/084console.mu.html index a73051c2..a9378fdf 100644 --- a/html/084console.mu.html +++ b/html/084console.mu.html @@ -58,49 +58,49 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Comment"># Wrappers around interaction primitives that take a potentially fake object</span> <span id="L2" class="LineNr"> 2 </span><span class="Comment"># and are thus easier to test.</span> <span id="L3" class="LineNr"> 3 </span> -<span id="L4" class="LineNr"> 4 </span><span class="muData">exclusive-container</span> event [ +<span id="L4" class="LineNr"> 4 </span><span class="muData">exclusive-container</span> <a href='084console.mu.html#L4'>event</a> [ <span id="L5" class="LineNr"> 5 </span> text:char <span id="L6" class="LineNr"> 6 </span> keycode:num <span class="Comment"># keys on keyboard without a unicode representation</span> -<span id="L7" class="LineNr"> 7 </span> touch:touch-event <span class="Comment"># mouse, track ball, etc.</span> -<span id="L8" class="LineNr"> 8 </span> resize:resize-event +<span id="L7" class="LineNr"> 7 </span> touch:<a href='084console.mu.html#L12'>touch-event</a> <span class="Comment"># mouse, track ball, etc.</span> +<span id="L8" class="LineNr"> 8 </span> resize:<a href='084console.mu.html#L18'>resize-event</a> <span id="L9" class="LineNr"> 9 </span> <span class="Comment"># update the assume-console handler if you add more variants</span> <span id="L10" class="LineNr"> 10 </span>] <span id="L11" class="LineNr"> 11 </span> -<span id="L12" class="LineNr"> 12 </span><span class="muData">container</span> touch-event [ +<span id="L12" class="LineNr"> 12 </span><span class="muData">container</span> <a href='084console.mu.html#L12'>touch-event</a> [ <span id="L13" class="LineNr"> 13 </span> type:num <span id="L14" class="LineNr"> 14 </span> row:num <span id="L15" class="LineNr"> 15 </span> column:num <span id="L16" class="LineNr"> 16 </span>] <span id="L17" class="LineNr"> 17 </span> -<span id="L18" class="LineNr"> 18 </span><span class="muData">container</span> resize-event [ +<span id="L18" class="LineNr"> 18 </span><span class="muData">container</span> <a href='084console.mu.html#L18'>resize-event</a> [ <span id="L19" class="LineNr"> 19 </span> width:num <span id="L20" class="LineNr"> 20 </span> height:num <span id="L21" class="LineNr"> 21 </span>] <span id="L22" class="LineNr"> 22 </span> -<span id="L23" class="LineNr"> 23 </span><span class="muData">container</span> console [ +<span id="L23" class="LineNr"> 23 </span><span class="muData">container</span> <a href='084console.mu.html#L23'>console</a> [ <span id="L24" class="LineNr"> 24 </span> current-event-index:num -<span id="L25" class="LineNr"> 25 </span> events:&:@:event +<span id="L25" class="LineNr"> 25 </span> events:&:@:<a href='084console.mu.html#L4'>event</a> <span id="L26" class="LineNr"> 26 </span>] <span id="L27" class="LineNr"> 27 </span> -<span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> new-fake-console events:&:@:event<span class="muRecipe"> -> </span>result:&:console [ +<span id="L28" class="LineNr"> 28 </span><span class="muRecipe">def</span> <a href='084console.mu.html#L28'>new-fake-console</a> events:&:@:<a href='084console.mu.html#L4'>event</a><span class="muRecipe"> -> </span>result:&:<a href='084console.mu.html#L23'>console</a> [ <span id="L29" class="LineNr"> 29 </span> <span class="Constant">local-scope</span> <span id="L30" class="LineNr"> 30 </span> <span class="Constant">load-ingredients</span> -<span id="L31" class="LineNr"> 31 </span> result:&:console <span class="Special"><-</span> new <span class="Constant">console:type</span> +<span id="L31" class="LineNr"> 31 </span> result:&:<a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> new <span class="Constant"><a href='084console.mu.html#L23'>console</a>:type</span> <span id="L32" class="LineNr"> 32 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">events:offset</span>, events <span id="L33" class="LineNr"> 33 </span>] <span id="L34" class="LineNr"> 34 </span> -<span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> read-event console:&:console<span class="muRecipe"> -> </span>result:event, found?:bool, quit?:bool, console:&:console [ +<span id="L35" class="LineNr"> 35 </span><span class="muRecipe">def</span> <a href='084console.mu.html#L35'>read-event</a> <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a><span class="muRecipe"> -> </span>result:<a href='084console.mu.html#L4'>event</a>, found?:bool, quit?:bool, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> [ <span id="L36" class="LineNr"> 36 </span> <span class="Constant">local-scope</span> <span id="L37" class="LineNr"> 37 </span> <span class="Constant">load-ingredients</span> <span id="L38" class="LineNr"> 38 </span> <span class="Delimiter">{</span> -<span id="L39" class="LineNr"> 39 </span> <span class="muControl">break-unless</span> console +<span id="L39" class="LineNr"> 39 </span> <span class="muControl">break-unless</span> <a href='084console.mu.html#L23'>console</a> <span id="L40" class="LineNr"> 40 </span> current-event-index:num <span class="Special"><-</span> get *console, <span class="Constant">current-event-index:offset</span> -<span id="L41" class="LineNr"> 41 </span> buf:&:@:event <span class="Special"><-</span> get *console, <span class="Constant">events:offset</span> +<span id="L41" class="LineNr"> 41 </span> buf:&:@:<a href='084console.mu.html#L4'>event</a> <span class="Special"><-</span> get *console, <span class="Constant">events:offset</span> <span id="L42" class="LineNr"> 42 </span> <span class="Delimiter">{</span> <span id="L43" class="LineNr"> 43 </span> max:num <span class="Special"><-</span> length *buf <span id="L44" class="LineNr"> 44 </span> done?:bool <span class="Special"><-</span> greater-or-equal current-event-index, max <span id="L45" class="LineNr"> 45 </span> <span class="muControl">break-unless</span> done? -<span id="L46" class="LineNr"> 46 </span> dummy:&:event <span class="Special"><-</span> new <span class="Constant">event:type</span> +<span id="L46" class="LineNr"> 46 </span> dummy:&:<a href='084console.mu.html#L4'>event</a> <span class="Special"><-</span> new <span class="Constant"><a href='084console.mu.html#L4'>event</a>:type</span> <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> <span id="L48" class="LineNr"> 48 </span> <span class="Delimiter">}</span> <span id="L49" class="LineNr"> 49 </span> result <span class="Special"><-</span> index *buf, current-event-index @@ -109,17 +109,17 @@ if ('onhashchange' in window) { <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> <span id="L53" class="LineNr"> 53 </span> <span class="Delimiter">}</span> <span id="L54" class="LineNr"> 54 </span> switch <span class="Comment"># real event source is infrequent; avoid polling it too much</span> -<span id="L55" class="LineNr"> 55 </span> result:event, found?:bool <span class="Special"><-</span> check-for-interaction +<span id="L55" class="LineNr"> 55 </span> result:<a href='084console.mu.html#L4'>event</a>, found?:bool <span class="Special"><-</span> check-for-interaction <span id="L56" class="LineNr"> 56 </span> <span class="muControl">return</span> result, found?, <span class="Constant">0/quit</span> <span id="L57" class="LineNr"> 57 </span>] <span id="L58" class="LineNr"> 58 </span> <span id="L59" class="LineNr"> 59 </span><span class="Comment"># variant of read-event for just keyboard events. Discards everything that</span> <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> <span id="L61" class="LineNr"> 61 </span><span class="Comment"># newlines, tabs, ctrl-d..</span> -<span id="L62" class="LineNr"> 62 </span><span class="muRecipe">def</span> read-key console:&:console<span class="muRecipe"> -> </span>result:char, found?:bool, quit?:bool, console:&:console [ +<span id="L62" class="LineNr"> 62 </span><span class="muRecipe">def</span> <a href='084console.mu.html#L62'>read-key</a> <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a><span class="muRecipe"> -> </span>result:char, found?:bool, quit?:bool, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> [ <span id="L63" class="LineNr"> 63 </span> <span class="Constant">local-scope</span> <span id="L64" class="LineNr"> 64 </span> <span class="Constant">load-ingredients</span> -<span id="L65" class="LineNr"> 65 </span> x:event, found?:bool, quit?:bool, console <span class="Special"><-</span> read-event console +<span id="L65" class="LineNr"> 65 </span> x:<a href='084console.mu.html#L4'>event</a>, found?:bool, quit?:bool, <a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> <a href='084console.mu.html#L35'>read-event</a> <a href='084console.mu.html#L23'>console</a> <span id="L66" class="LineNr"> 66 </span> <span class="muControl">return-if</span> quit?,<span class="Constant"> 0</span>, found?, quit? <span id="L67" class="LineNr"> 67 </span> <span class="muControl">return-unless</span> found?,<span class="Constant"> 0</span>, found?, quit? <span id="L68" class="LineNr"> 68 </span> c:char, converted?:bool <span class="Special"><-</span> maybe-convert x, <span class="Constant">text:variant</span> @@ -127,26 +127,26 @@ if ('onhashchange' in window) { <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> <span id="L71" class="LineNr"> 71 </span>] <span id="L72" class="LineNr"> 72 </span> -<span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> send-keys-to-channel console:&:console, chan:&:sink:char, screen:&:screen<span class="muRecipe"> -> </span>console:&:console, chan:&:sink:char, screen:&:screen [ +<span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> <a href='084console.mu.html#L73'>send-keys-to-channel</a> <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a>, chan:&:sink:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span><a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a>, chan:&:sink:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L74" class="LineNr"> 74 </span> <span class="Constant">local-scope</span> <span id="L75" class="LineNr"> 75 </span> <span class="Constant">load-ingredients</span> <span id="L76" class="LineNr"> 76 </span> <span class="Delimiter">{</span> -<span id="L77" class="LineNr"> 77 </span> c:char, found?:bool, quit?:bool, console <span class="Special"><-</span> read-key console +<span id="L77" class="LineNr"> 77 </span> c:char, found?:bool, quit?:bool, <a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> <a href='084console.mu.html#L62'>read-key</a> <a href='084console.mu.html#L23'>console</a> <span id="L78" class="LineNr"> 78 </span> <span class="muControl">loop-unless</span> found? <span id="L79" class="LineNr"> 79 </span> <span class="muControl">break-if</span> quit? -<span id="L80" class="LineNr"> 80 </span> assert c, <span class="Constant">[invalid event, expected text]</span> -<span id="L81" class="LineNr"> 81 </span> screen <span class="Special"><-</span> print screen, c -<span id="L82" class="LineNr"> 82 </span> chan <span class="Special"><-</span> write chan, c +<span id="L80" class="LineNr"> 80 </span> assert c, <span class="Constant">[invalid <a href='084console.mu.html#L4'>event</a>, expected text]</span> +<span id="L81" class="LineNr"> 81 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, c +<span id="L82" class="LineNr"> 82 </span> chan <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> chan, c <span id="L83" class="LineNr"> 83 </span> <span class="muControl">loop</span> <span id="L84" class="LineNr"> 84 </span> <span class="Delimiter">}</span> <span id="L85" class="LineNr"> 85 </span> chan <span class="Special"><-</span> close chan <span id="L86" class="LineNr"> 86 </span>] <span id="L87" class="LineNr"> 87 </span> -<span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> wait-for-event console:&:console<span class="muRecipe"> -> </span>console:&:console [ +<span id="L88" class="LineNr"> 88 </span><span class="muRecipe">def</span> <a href='084console.mu.html#L88'>wait-for-event</a> <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a><span class="muRecipe"> -> </span><a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> [ <span id="L89" class="LineNr"> 89 </span> <span class="Constant">local-scope</span> <span id="L90" class="LineNr"> 90 </span> <span class="Constant">load-ingredients</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">{</span> -<span id="L92" class="LineNr"> 92 </span> _, found?:bool <span class="Special"><-</span> read-event console +<span id="L92" class="LineNr"> 92 </span> _, found?:bool <span class="Special"><-</span> <a href='084console.mu.html#L35'>read-event</a> <a href='084console.mu.html#L23'>console</a> <span id="L93" class="LineNr"> 93 </span> <span class="muControl">break-if</span> found? <span id="L94" class="LineNr"> 94 </span> switch <span id="L95" class="LineNr"> 95 </span> <span class="muControl">loop</span> @@ -154,10 +154,10 @@ if ('onhashchange' in window) { <span id="L97" class="LineNr"> 97 </span>] <span id="L98" class="LineNr"> 98 </span> <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> -<span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> has-more-events? console:&:console<span class="muRecipe"> -> </span>result:bool [ +<span id="L100" class="LineNr">100 </span><span class="muRecipe">def</span> <a href='084console.mu.html#L100'>has-more-events?</a> <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a><span class="muRecipe"> -> </span>result:bool [ <span id="L101" class="LineNr">101 </span> <span class="Constant">local-scope</span> <span id="L102" class="LineNr">102 </span> <span class="Constant">load-ingredients</span> -<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> +<span id="L103" class="LineNr">103 </span> <span class="muControl">return-if</span> <a href='084console.mu.html#L23'>console</a>, <span class="Constant">0/false</span> <span class="Comment"># fake consoles should be plenty fast; never skip</span> <span id="L104" class="LineNr">104 </span> result <span class="Special"><-</span> interactions-left? <span id="L105" class="LineNr">105 </span>] </pre> diff --git a/html/085scenario_console.cc.html b/html/085scenario_console.cc.html index 0402ddda..ec4983a4 100644 --- a/html/085scenario_console.cc.html +++ b/html/085scenario_console.cc.html @@ -68,7 +68,7 @@ if ('onhashchange' in window) { <span id="L10" class="LineNr"> 10 </span> <span id="L11" class="LineNr"> 11 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span> <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(scenario keyboard_in_scenario)</span> -<span id="L13" class="LineNr"> 13 </span><span class="muScenario">scenario</span> keyboard-in-scenario [ +<span id="L13" class="LineNr"> 13 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> keyboard-in-scenario [ <span id="L14" class="LineNr"> 14 </span> assume-console [ <span id="L15" class="LineNr"> 15 </span> type [abc] <span id="L16" class="LineNr"> 16 </span> ] @@ -97,13 +97,13 @@ if ('onhashchange' in window) { <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before "End Special Scenario Variable Names(r)")</span> <span id="L40" class="LineNr"> 40 </span>Name[r][<span class="Constant">"console"</span>] = CONSOLE<span class="Delimiter">;</span> <span id="L41" class="LineNr"> 41 </span><span class="Comment">//: make 'console' always a raw location in scenarios</span> -<span id="L42" class="LineNr"> 42 </span><span class="Delimiter">:(before "End is_special_name Special-cases")</span> +<span id="L42" class="LineNr"> 42 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> <span id="L43" class="LineNr"> 43 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"console"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L44" class="LineNr"> 44 </span> <span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L46" class="LineNr"> 46 </span>ASSUME_CONSOLE<span class="Delimiter">,</span> <span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L48" class="LineNr"> 48 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"assume-console"</span><span class="Delimiter">,</span> ASSUME_CONSOLE<span class="Delimiter">);</span> +<span id="L48" class="LineNr"> 48 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"assume-console"</span><span class="Delimiter">,</span> ASSUME_CONSOLE<span class="Delimiter">);</span> <span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L50" class="LineNr"> 50 </span><span class="Normal">case</span> ASSUME_CONSOLE: <span class="Delimiter">{</span> <span id="L51" class="LineNr"> 51 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -112,85 +112,85 @@ if ('onhashchange' in window) { <span id="L54" class="LineNr"> 54 </span><span class="Normal">case</span> ASSUME_CONSOLE: <span class="Delimiter">{</span> <span id="L55" class="LineNr"> 55 </span> <span class="Comment">// create a temporary recipe just for parsing; it won't contain valid instructions</span> <span id="L56" class="LineNr"> 56 </span> istringstream in<span class="Delimiter">(</span><span class="Constant">"["</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">"]"</span><span class="Delimiter">);</span> -<span id="L57" class="LineNr"> 57 </span> recipe r<span class="Delimiter">;</span> -<span id="L58" class="LineNr"> 58 </span> slurp_body<span class="Delimiter">(</span>in<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<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> +<span id="L57" class="LineNr"> 57 </span> <a href='010vm.cc.html#L19'>recipe</a> r<span class="Delimiter">;</span> +<span id="L58" class="LineNr"> 58 </span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> r<span class="Delimiter">);</span> +<span id="L59" class="LineNr"> 59 </span> <span class="Normal">int</span> num_events = <a href='085scenario_console.cc.html#L283'>count_events</a><span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span id="L60" class="LineNr"> 60 </span> <span class="Comment">// initialize the events like in new-fake-console</span> <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> <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> <span id="L63" class="LineNr"> 63 </span> <span class="Comment">// store length</span> -<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> +<span id="L64" class="LineNr"> 64 </span> <a href='001help.cc.html#L218'>put</a><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 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> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L67" class="LineNr"> 67 </span> <span class="Normal">const</span> instruction& inst = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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">"left-click"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L69" class="LineNr"> 69 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'left-click' event starting at "</span> << Current_routine<span class="Delimiter">-></span>alloc << end<span class="Delimiter">();</span> -<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> -<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> -<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> -<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> -<span id="L74" class="LineNr"> 74 </span> curr_address += size_of_event<span class="Delimiter">();</span> +<span id="L69" class="LineNr"> 69 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'left-click' event starting at "</span> << Current_routine<span class="Delimiter">-></span>alloc << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L70" class="LineNr"> 70 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L71" class="LineNr"> 71 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L72" class="LineNr"> 72 </span> <a href='001help.cc.html#L218'>put</a><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> <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span> +<span id="L73" class="LineNr"> 73 </span> <a href='001help.cc.html#L218'>put</a><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> <a href='002test.cc.html#L92'>to_integer</a><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> +<span id="L74" class="LineNr"> 74 </span> curr_address += <a href='085scenario_console.cc.html#L295'>size_of_event</a><span class="Delimiter">();</span> <span id="L75" class="LineNr"> 75 </span> <span class="Delimiter">}</span> <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">"press"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L77" class="LineNr"> 77 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'press' event starting at "</span> << curr_address << end<span class="Delimiter">();</span> +<span id="L77" class="LineNr"> 77 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'press' event starting at "</span> << curr_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> -<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> -<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> +<span id="L79" class="LineNr"> 79 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>key<span class="Delimiter">))</span> +<span id="L80" class="LineNr"> 80 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">,</span> <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>key<span class="Delimiter">));</span> <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> -<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> +<span id="L82" class="LineNr"> 82 </span> <a href='001help.cc.html#L218'>put</a><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 id="L83" class="LineNr"> 83 </span> <span class="Normal">else</span> -<span id="L84" class="LineNr"> 84 </span> raise << <span class="Constant">"assume-console: can't press '"</span> << key << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<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> < <span class="Constant">256</span><span class="Delimiter">)</span> +<span id="L84" class="LineNr"> 84 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"assume-console: can't press '"</span> << key << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L85" class="LineNr"> 85 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address+<span class="Constant">1</span><span class="Delimiter">)</span> < <span class="Constant">256</span><span class="Delimiter">)</span> <span id="L86" class="LineNr"> 86 </span> <span class="Comment">// these keys are in ascii</span> -<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> +<span id="L87" class="LineNr"> 87 </span> <a href='001help.cc.html#L218'>put</a><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 id="L88" class="LineNr"> 88 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L89" class="LineNr"> 89 </span> <span class="Comment">// distinguish from unicode</span> -<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> +<span id="L90" class="LineNr"> 90 </span> <a href='001help.cc.html#L218'>put</a><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 id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> -<span id="L92" class="LineNr"> 92 </span> curr_address += size_of_event<span class="Delimiter">();</span> +<span id="L92" class="LineNr"> 92 </span> curr_address += <a href='085scenario_console.cc.html#L295'>size_of_event</a><span class="Delimiter">();</span> <span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">}</span> <span id="L94" class="LineNr"> 94 </span> <span class="Comment">// End Event Handlers</span> <span id="L95" class="LineNr"> 95 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L96" class="LineNr"> 96 </span> <span class="Comment">// keyboard input</span> <span id="L97" class="LineNr"> 97 </span> assert<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"type"</span><span class="Delimiter">);</span> -<span id="L98" class="LineNr"> 98 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'type' event starting at "</span> << curr_address << end<span class="Delimiter">();</span> +<span id="L98" class="LineNr"> 98 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'type' event starting at "</span> << curr_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L99" class="LineNr"> 99 </span> <span class="Normal">const</span> string& 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 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> -<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> +<span id="L101" class="LineNr">101 </span> <span class="Normal">int</span> num_keyboard_events = <a href='038new_text.cc.html#L131'>unicode_length</a><span class="Delimiter">(</span>contents<span class="Delimiter">);</span> <span id="L102" class="LineNr">102 </span> <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span> <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 < num_keyboard_events<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L104" class="LineNr">104 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'text' tag at "</span> << curr_address << end<span class="Delimiter">();</span> -<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> +<span id="L104" class="LineNr">104 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing 'text' tag at "</span> << curr_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L105" class="LineNr">105 </span> <a href='001help.cc.html#L218'>put</a><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 id="L106" class="LineNr">106 </span> <span class="Normal">uint32_t</span> curr_character<span class="Delimiter">;</span> -<span id="L107" class="LineNr">107 </span> assert<span class="Delimiter">(</span>curr < SIZE<span class="Delimiter">(</span>contents<span class="Delimiter">));</span> +<span id="L107" class="LineNr">107 </span> assert<span class="Delimiter">(</span>curr < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>contents<span class="Delimiter">));</span> <span id="L108" class="LineNr">108 </span> tb_utf8_char_to_unicode<span class="Delimiter">(</span>&curr_character<span class="Delimiter">,</span> &raw_contents[curr]<span class="Delimiter">);</span> -<span id="L109" class="LineNr">109 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing character "</span> << curr_character << <span class="Constant">" at "</span> << curr_address+<span class="Comment">/*</span><span class="Comment">skip exclusive container tag</span><span class="Comment">*/</span><span class="Constant">1</span> << end<span class="Delimiter">();</span> -<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> +<span id="L109" class="LineNr">109 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing character "</span> << curr_character << <span class="Constant">" at "</span> << curr_address+<span class="Comment">/*</span><span class="Comment">skip exclusive container tag</span><span class="Comment">*/</span><span class="Constant">1</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L110" class="LineNr">110 </span> <a href='001help.cc.html#L218'>put</a><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> <span id="L111" class="LineNr">111 </span> curr += tb_utf8_char_length<span class="Delimiter">(</span>raw_contents[curr]<span class="Delimiter">);</span> -<span id="L112" class="LineNr">112 </span> curr_address += size_of_event<span class="Delimiter">();</span> +<span id="L112" class="LineNr">112 </span> curr_address += <a href='085scenario_console.cc.html#L295'>size_of_event</a><span class="Delimiter">();</span> <span id="L113" class="LineNr">113 </span> <span class="Delimiter">}</span> <span id="L114" class="LineNr">114 </span> <span class="Delimiter">}</span> <span id="L115" class="LineNr">115 </span> <span class="Delimiter">}</span> <span id="L116" class="LineNr">116 </span> assert<span class="Delimiter">(</span>curr_address == event_data_address+size<span class="Delimiter">);</span> <span id="L117" class="LineNr">117 </span> <span class="Comment">// wrap the array of events in a console object</span> -<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> -<span id="L119" class="LineNr">119 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing console in "</span> << console_address << end<span class="Delimiter">();</span> -<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> -<span id="L121" class="LineNr">121 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing console data in "</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> << end<span class="Delimiter">();</span> -<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> +<span id="L118" class="LineNr">118 </span> <span class="Normal">int</span> console_address = allocate<span class="Delimiter">(</span><a href='085scenario_console.cc.html#L305'>size_of_console</a><span class="Delimiter">());</span> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing console in "</span> << console_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L120" class="LineNr">120 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">,</span> console_address<span class="Delimiter">);</span> +<span id="L121" class="LineNr">121 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing console data in "</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> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L122" class="LineNr">122 </span> <a href='001help.cc.html#L218'>put</a><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 id="L123" class="LineNr">123 </span> <span class="Comment">// increment refcount for event data</span> -<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> +<span id="L124" class="LineNr">124 </span> <a href='001help.cc.html#L218'>put</a><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 id="L125" class="LineNr">125 </span> <span class="Comment">// increment refcount for console</span> -<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> +<span id="L126" class="LineNr">126 </span> <a href='001help.cc.html#L218'>put</a><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 id="L127" class="LineNr">127 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L128" class="LineNr">128 </span><span class="Delimiter">}</span> <span id="L129" class="LineNr">129 </span> <span id="L130" class="LineNr">130 </span><span class="Delimiter">:(before "End Globals")</span> <span id="L131" class="LineNr">131 </span>map<string<span class="Delimiter">,</span> <span class="Normal">int</span>> Key<span class="Delimiter">;</span> <span id="L132" class="LineNr">132 </span><span class="Delimiter">:(before "End One-time Setup")</span> -<span id="L133" class="LineNr">133 </span>initialize_key_names<span class="Delimiter">();</span> +<span id="L133" class="LineNr">133 </span><a href='085scenario_console.cc.html#L135'>initialize_key_names</a><span class="Delimiter">();</span> <span id="L134" class="LineNr">134 </span><span class="Delimiter">:(code)</span> -<span id="L135" class="LineNr">135 </span><span class="Normal">void</span> initialize_key_names<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L135" class="LineNr">135 </span><span class="Normal">void</span> <a href='085scenario_console.cc.html#L135'>initialize_key_names</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L136" class="LineNr">136 </span> Key[<span class="Constant">"F1"</span>] = TB_KEY_F1<span class="Delimiter">;</span> <span id="L137" class="LineNr">137 </span> Key[<span class="Constant">"F2"</span>] = TB_KEY_F2<span class="Delimiter">;</span> <span id="L138" class="LineNr">138 </span> Key[<span class="Constant">"F3"</span>] = TB_KEY_F3<span class="Delimiter">;</span> @@ -246,21 +246,21 @@ if ('onhashchange' in window) { <span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span> <span id="L189" class="LineNr">189 </span> <span id="L190" class="LineNr">190 </span><span class="Delimiter">:(after "Begin check_or_set_invalid_types(r)")</span> -<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> -<span id="L192" class="LineNr">192 </span> initialize_special_name<span class="Delimiter">(</span>r<span class="Delimiter">);</span> +<span id="L191" class="LineNr">191 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='085scenario_console.cc.html#L194'>is_scenario</a><span class="Delimiter">(</span>caller<span class="Delimiter">))</span> +<span id="L192" class="LineNr">192 </span> <a href='085scenario_console.cc.html#L197'>initialize_special_name</a><span class="Delimiter">(</span>r<span class="Delimiter">);</span> <span id="L193" class="LineNr">193 </span><span class="Delimiter">:(code)</span> -<span id="L194" class="LineNr">194 </span><span class="Normal">bool</span> is_scenario<span class="Delimiter">(</span><span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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">"scenario_"</span><span class="Delimiter">);</span> +<span id="L194" class="LineNr">194 </span><span class="Normal">bool</span> <a href='085scenario_console.cc.html#L194'>is_scenario</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L195" class="LineNr">195 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">"scenario_"</span><span class="Delimiter">);</span> <span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span> -<span id="L197" class="LineNr">197 </span><span class="Normal">void</span> initialize_special_name<span class="Delimiter">(</span>reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L197" class="LineNr">197 </span><span class="Normal">void</span> <a href='085scenario_console.cc.html#L197'>initialize_special_name</a><span class="Delimiter">(</span>reagent& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L199" class="LineNr">199 </span> <span class="Comment">// no need for screen</span> -<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">"console"</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = new_type_tree<span class="Delimiter">(</span><span class="Constant">"address:console"</span><span class="Delimiter">);</span> +<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">"console"</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"address:console"</span><span class="Delimiter">);</span> <span id="L201" class="LineNr">201 </span> <span class="Comment">// End Initialize Type Of Special Name In Scenario(r)</span> <span id="L202" class="LineNr">202 </span><span class="Delimiter">}</span> <span id="L203" class="LineNr">203 </span> <span id="L204" class="LineNr">204 </span><span class="Delimiter">:(scenario events_in_scenario)</span> -<span id="L205" class="LineNr">205 </span><span class="muScenario">scenario</span> events-in-scenario [ +<span id="L205" class="LineNr">205 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> events-in-scenario [ <span id="L206" class="LineNr">206 </span> assume-console [ <span id="L207" class="LineNr">207 </span> type [abc] <span id="L208" class="LineNr">208 </span> left-click <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span> @@ -313,7 +313,7 @@ if ('onhashchange' in window) { <span id="L255" class="LineNr">255 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L256" class="LineNr">256 </span>REPLACE_IN_CONSOLE<span class="Delimiter">,</span> <span id="L257" class="LineNr">257 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L258" class="LineNr">258 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"replace-in-console"</span><span class="Delimiter">,</span> REPLACE_IN_CONSOLE<span class="Delimiter">);</span> +<span id="L258" class="LineNr">258 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"replace-in-console"</span><span class="Delimiter">,</span> REPLACE_IN_CONSOLE<span class="Delimiter">);</span> <span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L260" class="LineNr">260 </span><span class="Normal">case</span> REPLACE_IN_CONSOLE: <span class="Delimiter">{</span> <span id="L261" class="LineNr">261 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -322,35 +322,35 @@ if ('onhashchange' in window) { <span id="L264" class="LineNr">264 </span><span class="Normal">case</span> REPLACE_IN_CONSOLE: <span class="Delimiter">{</span> <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> <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> -<span id="L267" class="LineNr">267 </span> raise << <span class="Constant">"console not initialized</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L267" class="LineNr">267 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"console not initialized</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L268" class="LineNr">268 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L269" class="LineNr">269 </span> <span class="Delimiter">}</span> -<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> -<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> -<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> +<span id="L270" class="LineNr">270 </span> <span class="Normal">int</span> console_address = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> CONSOLE<span class="Delimiter">);</span> +<span id="L271" class="LineNr">271 </span> <span class="Normal">int</span> console_data = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_address+<span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L272" class="LineNr">272 </span> <span class="Normal">int</span> length = <a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> console_data<span class="Delimiter">);</span> <span class="Comment">// array length</span> <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 < length<span class="Delimiter">;</span> ++i<span class="Delimiter">,</span> curr+=size_of_event<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<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> -<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> -<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 < size_of_event<span class="Delimiter">();</span> ++n<span class="Delimiter">)</span> -<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> +<span id="L274" class="LineNr">274 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> 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 id="L275" class="LineNr">275 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> 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 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 < <a href='085scenario_console.cc.html#L295'>size_of_event</a><span class="Delimiter">();</span> ++n<span class="Delimiter">)</span> +<span id="L277" class="LineNr">277 </span> <a href='001help.cc.html#L218'>put</a><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 id="L278" class="LineNr">278 </span> <span class="Delimiter">}</span> <span id="L279" class="LineNr">279 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L280" class="LineNr">280 </span><span class="Delimiter">}</span> <span id="L281" class="LineNr">281 </span> <span id="L282" class="LineNr">282 </span><span class="Delimiter">:(code)</span> -<span id="L283" class="LineNr">283 </span><span class="Normal">int</span> count_events<span class="Delimiter">(</span><span class="Normal">const</span> recipe& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L283" class="LineNr">283 </span><span class="Normal">int</span> <a href='085scenario_console.cc.html#L283'>count_events</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe& r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L284" class="LineNr">284 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> -<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 < 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 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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L286" class="LineNr">286 </span> <span class="Normal">const</span> instruction& curr = r<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <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">"type"</span><span class="Delimiter">)</span> -<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> +<span id="L288" class="LineNr">288 </span> result += <a href='038new_text.cc.html#L131'>unicode_length</a><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 id="L289" class="LineNr">289 </span> <span class="Normal">else</span> <span id="L290" class="LineNr">290 </span> ++result<span class="Delimiter">;</span> <span id="L291" class="LineNr">291 </span> <span class="Delimiter">}</span> <span id="L292" class="LineNr">292 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L293" class="LineNr">293 </span><span class="Delimiter">}</span> <span id="L294" class="LineNr">294 </span> -<span id="L295" class="LineNr">295 </span><span class="Normal">int</span> size_of_event<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L295" class="LineNr">295 </span><span class="Normal">int</span> <a href='085scenario_console.cc.html#L295'>size_of_event</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L296" class="LineNr">296 </span> <span class="Comment">// memoize result if already computed</span> <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> <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> @@ -360,7 +360,7 @@ if ('onhashchange' in window) { <span id="L302" class="LineNr">302 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L303" class="LineNr">303 </span><span class="Delimiter">}</span> <span id="L304" class="LineNr">304 </span> -<span id="L305" class="LineNr">305 </span><span class="Normal">int</span> size_of_console<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L305" class="LineNr">305 </span><span class="Normal">int</span> <a href='085scenario_console.cc.html#L305'>size_of_console</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L306" class="LineNr">306 </span> <span class="Comment">// memoize result if already computed</span> <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> <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> diff --git a/html/086scenario_console_test.mu.html b/html/086scenario_console_test.mu.html index 41d4bb1d..9e2bc500 100644 --- a/html/086scenario_console_test.mu.html +++ b/html/086scenario_console_test.mu.html @@ -61,10 +61,10 @@ if ('onhashchange' in window) { <span id="L7" class="LineNr"> 7 </span> type <span class="Constant">[abc]</span> <span id="L8" class="LineNr"> 8 </span> ] <span id="L9" class="LineNr"> 9 </span> run [ -<span id="L10" class="LineNr">10 </span> 1:char, 2:bool <span class="Special"><-</span> read-key console -<span id="L11" class="LineNr">11 </span> 3:char, 4:bool <span class="Special"><-</span> read-key console -<span id="L12" class="LineNr">12 </span> 5:char, 6:bool <span class="Special"><-</span> read-key console -<span id="L13" class="LineNr">13 </span> 7:char, 8:bool <span class="Special"><-</span> read-key console +<span id="L10" class="LineNr">10 </span> 1:char, 2:bool <span class="Special"><-</span> <a href='084console.mu.html#L62'>read-key</a> <a href='084console.mu.html#L23'>console</a> +<span id="L11" class="LineNr">11 </span> 3:char, 4:bool <span class="Special"><-</span> <a href='084console.mu.html#L62'>read-key</a> <a href='084console.mu.html#L23'>console</a> +<span id="L12" class="LineNr">12 </span> 5:char, 6:bool <span class="Special"><-</span> <a href='084console.mu.html#L62'>read-key</a> <a href='084console.mu.html#L23'>console</a> +<span id="L13" class="LineNr">13 </span> 7:char, 8:bool <span class="Special"><-</span> <a href='084console.mu.html#L62'>read-key</a> <a href='084console.mu.html#L23'>console</a> <span id="L14" class="LineNr">14 </span> ] <span id="L15" class="LineNr">15 </span> memory-should-contain [ <span id="L16" class="LineNr">16 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 97</span> <span class="Comment"># 'a'</span> diff --git a/html/087file.cc.html b/html/087file.cc.html index d57b3b2e..56397ce4 100644 --- a/html/087file.cc.html +++ b/html/087file.cc.html @@ -69,30 +69,30 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L13" class="LineNr"> 13 </span>_OPEN_FILE_FOR_READING<span class="Delimiter">,</span> <span id="L14" class="LineNr"> 14 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L15" class="LineNr"> 15 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-file-for-reading"</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_READING<span class="Delimiter">);</span> +<span id="L15" class="LineNr"> 15 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-file-for-reading"</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_READING<span class="Delimiter">);</span> <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L17" class="LineNr"> 17 </span><span class="Normal">case</span> _OPEN_FILE_FOR_READING: <span class="Delimiter">{</span> -<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> -<span id="L19" class="LineNr"> 19 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-reading' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L18" class="LineNr"> 18 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L19" class="LineNr"> 19 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-reading' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L20" class="LineNr"> 20 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L21" class="LineNr"> 21 </span> <span class="Delimiter">}</span> <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> -<span id="L23" class="LineNr"> 23 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-file-for-reading' should be a string, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L23" class="LineNr"> 23 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-file-for-reading' should be a string, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L24" class="LineNr"> 24 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L25" class="LineNr"> 25 </span> <span class="Delimiter">}</span> -<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> -<span id="L27" class="LineNr"> 27 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-reading' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L26" class="LineNr"> 26 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L27" class="LineNr"> 27 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-reading' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L28" class="LineNr"> 28 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L29" class="LineNr"> 29 </span> <span class="Delimiter">}</span> <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> -<span id="L31" class="LineNr"> 31 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-file-for-reading' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L31" class="LineNr"> 31 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-file-for-reading' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L32" class="LineNr"> 32 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L33" class="LineNr"> 33 </span> <span class="Delimiter">}</span> <span id="L34" class="LineNr"> 34 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L35" class="LineNr"> 35 </span><span class="Delimiter">}</span> <span id="L36" class="LineNr"> 36 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L37" class="LineNr"> 37 </span><span class="Normal">case</span> _OPEN_FILE_FOR_READING: <span class="Delimiter">{</span> -<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> +<span id="L38" class="LineNr"> 38 </span> string filename = <a href='038new_text.cc.html#L143'>read_mu_text</a><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 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> >= <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">FILE</span>*<span class="Delimiter">));</span> <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">"r"</span><span class="Delimiter">);</span> <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>><span class="Delimiter">(</span>f<span class="Delimiter">);</span> @@ -104,30 +104,30 @@ if ('onhashchange' in window) { <span id="L47" class="LineNr"> 47 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L48" class="LineNr"> 48 </span>_OPEN_FILE_FOR_WRITING<span class="Delimiter">,</span> <span id="L49" class="LineNr"> 49 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L50" class="LineNr"> 50 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-file-for-writing"</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_WRITING<span class="Delimiter">);</span> +<span id="L50" class="LineNr"> 50 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-file-for-writing"</span><span class="Delimiter">,</span> _OPEN_FILE_FOR_WRITING<span class="Delimiter">);</span> <span id="L51" class="LineNr"> 51 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L52" class="LineNr"> 52 </span><span class="Normal">case</span> _OPEN_FILE_FOR_WRITING: <span class="Delimiter">{</span> -<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> -<span id="L54" class="LineNr"> 54 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-writing' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L53" class="LineNr"> 53 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L54" class="LineNr"> 54 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-writing' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L55" class="LineNr"> 55 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L56" class="LineNr"> 56 </span> <span class="Delimiter">}</span> <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> -<span id="L58" class="LineNr"> 58 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-file-for-writing' should be a string, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L58" class="LineNr"> 58 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-file-for-writing' should be a string, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L59" class="LineNr"> 59 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L60" class="LineNr"> 60 </span> <span class="Delimiter">}</span> -<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> -<span id="L62" class="LineNr"> 62 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-writing' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L61" class="LineNr"> 61 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L62" class="LineNr"> 62 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-file-for-writing' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L63" class="LineNr"> 63 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L64" class="LineNr"> 64 </span> <span class="Delimiter">}</span> <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> -<span id="L66" class="LineNr"> 66 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-file-for-writing' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L66" class="LineNr"> 66 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-file-for-writing' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L67" class="LineNr"> 67 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L68" class="LineNr"> 68 </span> <span class="Delimiter">}</span> <span id="L69" class="LineNr"> 69 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L70" class="LineNr"> 70 </span><span class="Delimiter">}</span> <span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L72" class="LineNr"> 72 </span><span class="Normal">case</span> _OPEN_FILE_FOR_WRITING: <span class="Delimiter">{</span> -<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> +<span id="L73" class="LineNr"> 73 </span> string filename = <a href='038new_text.cc.html#L143'>read_mu_text</a><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 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> >= <span class="Normal">sizeof</span><span class="Delimiter">(</span><span class="Normal">FILE</span>*<span class="Delimiter">));</span> <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>><span class="Delimiter">(</span>fopen<span class="Delimiter">(</span>filename<span class="Delimiter">.</span>c_str<span class="Delimiter">(),</span> <span class="Constant">"w"</span><span class="Delimiter">));</span> <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> @@ -138,27 +138,27 @@ if ('onhashchange' in window) { <span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L82" class="LineNr"> 82 </span>_READ_FROM_FILE<span class="Delimiter">,</span> <span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L84" class="LineNr"> 84 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$read-from-file"</span><span class="Delimiter">,</span> _READ_FROM_FILE<span class="Delimiter">);</span> +<span id="L84" class="LineNr"> 84 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$read-from-file"</span><span class="Delimiter">,</span> _READ_FROM_FILE<span class="Delimiter">);</span> <span id="L85" class="LineNr"> 85 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L86" class="LineNr"> 86 </span><span class="Normal">case</span> _READ_FROM_FILE: <span class="Delimiter">{</span> -<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> -<span id="L88" class="LineNr"> 88 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-file' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L87" class="LineNr"> 87 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L88" class="LineNr"> 88 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-file' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L89" class="LineNr"> 89 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L90" class="LineNr"> 90 </span> <span class="Delimiter">}</span> <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> -<span id="L92" class="LineNr"> 92 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$read-from-file' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L92" class="LineNr"> 92 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$read-from-file' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L93" class="LineNr"> 93 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L94" class="LineNr"> 94 </span> <span class="Delimiter">}</span> -<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> -<span id="L96" class="LineNr"> 96 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-file' requires exactly two products, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L95" class="LineNr"> 95 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L96" class="LineNr"> 96 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-file' requires exactly two products, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L97" class="LineNr"> 97 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L98" class="LineNr"> 98 </span> <span class="Delimiter">}</span> <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> -<span id="L100" class="LineNr">100 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$read-from-file' should be a character, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L100" class="LineNr">100 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$read-from-file' should be a character, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L101" class="LineNr">101 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L102" class="LineNr">102 </span> <span class="Delimiter">}</span> <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> -<span id="L104" class="LineNr">104 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second product of '$read-from-file' should be a boolean, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L104" class="LineNr">104 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second product of '$read-from-file' should be a boolean, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L105" class="LineNr">105 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L106" class="LineNr">106 </span> <span class="Delimiter">}</span> <span id="L107" class="LineNr">107 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -168,7 +168,7 @@ if ('onhashchange' in window) { <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</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 id="L112" class="LineNr">112 </span> <span class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span><<span class="Normal">FILE</span>*><span class="Delimiter">(</span>x<span class="Delimiter">);</span> <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> -<span id="L114" class="LineNr">114 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"can't read from null file in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"can't read from null file in '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L115" class="LineNr">115 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L116" class="LineNr">116 </span> <span class="Delimiter">}</span> <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> @@ -178,7 +178,7 @@ if ('onhashchange' in window) { <span id="L121" class="LineNr">121 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L122" class="LineNr">122 </span> <span class="Delimiter">}</span> <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> -<span id="L124" class="LineNr">124 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"file in invalid state in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L124" class="LineNr">124 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"file in invalid state in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L125" class="LineNr">125 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L126" class="LineNr">126 </span> <span class="Delimiter">}</span> <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> @@ -188,8 +188,8 @@ if ('onhashchange' in window) { <span id="L131" class="LineNr">131 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L132" class="LineNr">132 </span> <span class="Delimiter">}</span> <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> -<span id="L134" class="LineNr">134 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"couldn't read from file in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L135" class="LineNr">135 </span> raise << <span class="Constant">" errno: "</span> << errno << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L134" class="LineNr">134 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"couldn't read from file in '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L135" class="LineNr">135 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" errno: "</span> << errno << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L136" class="LineNr">136 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L137" class="LineNr">137 </span> <span class="Delimiter">}</span> <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> @@ -202,23 +202,23 @@ if ('onhashchange' in window) { <span id="L145" class="LineNr">145 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L146" class="LineNr">146 </span>_WRITE_TO_FILE<span class="Delimiter">,</span> <span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L148" class="LineNr">148 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$write-to-file"</span><span class="Delimiter">,</span> _WRITE_TO_FILE<span class="Delimiter">);</span> +<span id="L148" class="LineNr">148 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$write-to-file"</span><span class="Delimiter">,</span> _WRITE_TO_FILE<span class="Delimiter">);</span> <span id="L149" class="LineNr">149 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L150" class="LineNr">150 </span><span class="Normal">case</span> _WRITE_TO_FILE: <span class="Delimiter">{</span> -<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> -<span id="L152" class="LineNr">152 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$write-to-file' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L151" class="LineNr">151 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L152" class="LineNr">152 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$write-to-file' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L153" class="LineNr">153 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L154" class="LineNr">154 </span> <span class="Delimiter">}</span> <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> -<span id="L156" class="LineNr">156 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$write-to-file' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L156" class="LineNr">156 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$write-to-file' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L157" class="LineNr">157 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L158" class="LineNr">158 </span> <span class="Delimiter">}</span> <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> -<span id="L160" class="LineNr">160 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of '$write-to-file' should be a character, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L160" class="LineNr">160 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of '$write-to-file' should be a character, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L161" class="LineNr">161 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L162" class="LineNr">162 </span> <span class="Delimiter">}</span> <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> -<span id="L164" class="LineNr">164 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$write-to-file' writes to no products, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$write-to-file' writes to no products, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L165" class="LineNr">165 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L166" class="LineNr">166 </span> <span class="Delimiter">}</span> <span id="L167" class="LineNr">167 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -228,20 +228,20 @@ if ('onhashchange' in window) { <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</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 id="L172" class="LineNr">172 </span> <span class="Normal">FILE</span>* f = <span class="Normal">reinterpret_cast</span><<span class="Normal">FILE</span>*><span class="Delimiter">(</span>x<span class="Delimiter">);</span> <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> -<span id="L174" class="LineNr">174 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"can't write to null file in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L174" class="LineNr">174 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"can't write to null file in '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L175" class="LineNr">175 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L176" class="LineNr">176 </span> <span class="Delimiter">}</span> <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> <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> -<span id="L179" class="LineNr">179 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"file in invalid state in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L179" class="LineNr">179 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"file in invalid state in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L180" class="LineNr">180 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L181" class="LineNr">181 </span> <span class="Delimiter">}</span> <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</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 id="L183" class="LineNr">183 </span> <span class="Normal">char</span> c = <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>y<span class="Delimiter">);</span> <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> <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> -<span id="L186" class="LineNr">186 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"couldn't write to file in '"</span> << to_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L187" class="LineNr">187 </span> raise << <span class="Constant">" errno: "</span> << errno << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L186" class="LineNr">186 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"couldn't write to file in '"</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L187" class="LineNr">187 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">" errno: "</span> << errno << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L188" class="LineNr">188 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L189" class="LineNr">189 </span> <span class="Delimiter">}</span> <span id="L190" class="LineNr">190 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -250,23 +250,23 @@ if ('onhashchange' in window) { <span id="L193" class="LineNr">193 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L194" class="LineNr">194 </span>_CLOSE_FILE<span class="Delimiter">,</span> <span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L196" class="LineNr">196 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$close-file"</span><span class="Delimiter">,</span> _CLOSE_FILE<span class="Delimiter">);</span> +<span id="L196" class="LineNr">196 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$close-file"</span><span class="Delimiter">,</span> _CLOSE_FILE<span class="Delimiter">);</span> <span id="L197" class="LineNr">197 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L198" class="LineNr">198 </span><span class="Normal">case</span> _CLOSE_FILE: <span class="Delimiter">{</span> -<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> -<span id="L200" class="LineNr">200 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-file' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L199" class="LineNr">199 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L200" class="LineNr">200 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-file' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L201" class="LineNr">201 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L202" class="LineNr">202 </span> <span class="Delimiter">}</span> <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> -<span id="L204" class="LineNr">204 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$close-file' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L204" class="LineNr">204 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$close-file' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L205" class="LineNr">205 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L206" class="LineNr">206 </span> <span class="Delimiter">}</span> -<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> -<span id="L208" class="LineNr">208 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-file' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L207" class="LineNr">207 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L208" class="LineNr">208 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-file' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L209" class="LineNr">209 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L210" class="LineNr">210 </span> <span class="Delimiter">}</span> <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> -<span id="L212" class="LineNr">212 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-file' requires its product to be the same as its ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L212" class="LineNr">212 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-file' requires its product to be the same as its ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L213" class="LineNr">213 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L214" class="LineNr">214 </span> <span class="Delimiter">}</span> <span id="L215" class="LineNr">215 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/088file.mu.html b/html/088file.mu.html index 3ef5afce..811fa5dc 100644 --- a/html/088file.mu.html +++ b/html/088file.mu.html @@ -65,85 +65,85 @@ if ('onhashchange' in window) { <span id="L8" class="LineNr"> 8 </span><span class="Comment"># - slurp - synchronously read from a file</span> <span id="L9" class="LineNr"> 9 </span><span class="Comment"># - dump - synchronously write to a file</span> <span id="L10" class="LineNr"> 10 </span> -<span id="L11" class="LineNr"> 11 </span><span class="muData">container</span> resources [ +<span id="L11" class="LineNr"> 11 </span><span class="muData">container</span> <a href='088file.mu.html#L11'>resources</a> [ <span id="L12" class="LineNr"> 12 </span> lock:bool -<span id="L13" class="LineNr"> 13 </span> data:&:@:resource +<span id="L13" class="LineNr"> 13 </span> data:&:@:<a href='088file.mu.html#L16'>resource</a> <span id="L14" class="LineNr"> 14 </span>] <span id="L15" class="LineNr"> 15 </span> -<span id="L16" class="LineNr"> 16 </span><span class="muData">container</span> resource [ +<span id="L16" class="LineNr"> 16 </span><span class="muData">container</span> <a href='088file.mu.html#L16'>resource</a> [ <span id="L17" class="LineNr"> 17 </span> name:text <span id="L18" class="LineNr"> 18 </span> contents:text <span id="L19" class="LineNr"> 19 </span>] <span id="L20" class="LineNr"> 20 </span> -<span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> start-reading resources:&:resources, filename:text<span class="muRecipe"> -> </span>contents:&:source:char, error?:bool [ +<span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L21'>start-reading</a> <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, filename:text<span class="muRecipe"> -> </span>contents:&:source:char, error?:bool [ <span id="L22" class="LineNr"> 22 </span> <span class="Constant">local-scope</span> <span id="L23" class="LineNr"> 23 </span> <span class="Constant">load-ingredients</span> <span id="L24" class="LineNr"> 24 </span> error? <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span id="L25" class="LineNr"> 25 </span> <span class="Delimiter">{</span> -<span id="L26" class="LineNr"> 26 </span> <span class="muControl">break-unless</span> resources +<span id="L26" class="LineNr"> 26 </span> <span class="muControl">break-unless</span> <a href='088file.mu.html#L11'>resources</a> <span id="L27" class="LineNr"> 27 </span> <span class="Comment"># fake file system</span> -<span id="L28" class="LineNr"> 28 </span> contents, error? <span class="Special"><-</span> start-reading-from-fake-resource resources, filename +<span id="L28" class="LineNr"> 28 </span> contents, error? <span class="Special"><-</span> <a href='088file.mu.html#L53'>start-reading-from-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>, filename <span id="L29" class="LineNr"> 29 </span> <span class="muControl">return</span> <span id="L30" class="LineNr"> 30 </span> <span class="Delimiter">}</span> <span id="L31" class="LineNr"> 31 </span> <span class="Comment"># real file system</span> <span id="L32" class="LineNr"> 32 </span> file:num <span class="Special"><-</span> $open-file-for-reading filename <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> -<span id="L34" class="LineNr"> 34 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel<span class="Constant"> 30</span> -<span id="L35" class="LineNr"> 35 </span> start-running receive-from-file file, sink +<span id="L34" class="LineNr"> 34 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a><span class="Constant"> 30</span> +<span id="L35" class="LineNr"> 35 </span> start-running <a href='088file.mu.html#L76'>receive-from-file</a> file, sink <span id="L36" class="LineNr"> 36 </span>] <span id="L37" class="LineNr"> 37 </span> -<span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> slurp resources:&:resources, filename:text<span class="muRecipe"> -> </span>contents:text, error?:bool [ +<span id="L38" class="LineNr"> 38 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, filename:text<span class="muRecipe"> -> </span>contents:text, error?:bool [ <span id="L39" class="LineNr"> 39 </span> <span class="Constant">local-scope</span> <span id="L40" class="LineNr"> 40 </span> <span class="Constant">load-ingredients</span> -<span id="L41" class="LineNr"> 41 </span> source:&:source:char, error?:bool <span class="Special"><-</span> start-reading resources, filename +<span id="L41" class="LineNr"> 41 </span> source:&:source:char, error?:bool <span class="Special"><-</span> <a href='088file.mu.html#L21'>start-reading</a> <a href='088file.mu.html#L11'>resources</a>, filename <span id="L42" class="LineNr"> 42 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/contents</span> -<span id="L43" class="LineNr"> 43 </span> buf:&:buffer <span class="Special"><-</span> new-buffer <span class="Constant">30/capacity</span> +<span id="L43" class="LineNr"> 43 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a> <span class="Constant">30/capacity</span> <span id="L44" class="LineNr"> 44 </span> <span class="Delimiter">{</span> <span id="L45" class="LineNr"> 45 </span> c:char, done?:bool, source <span class="Special"><-</span> read source <span id="L46" class="LineNr"> 46 </span> <span class="muControl">break-if</span> done? <span id="L47" class="LineNr"> 47 </span> buf <span class="Special"><-</span> append buf, c <span id="L48" class="LineNr"> 48 </span> <span class="muControl">loop</span> <span id="L49" class="LineNr"> 49 </span> <span class="Delimiter">}</span> -<span id="L50" class="LineNr"> 50 </span> contents <span class="Special"><-</span> buffer-to-array buf +<span id="L50" class="LineNr"> 50 </span> contents <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L51" class="LineNr"> 51 </span>] <span id="L52" class="LineNr"> 52 </span> -<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> start-reading-from-fake-resource resources:&:resources, resource:text<span class="muRecipe"> -> </span>contents:&:source:char, error?:bool [ +<span id="L53" class="LineNr"> 53 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L53'>start-reading-from-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='088file.mu.html#L16'>resource</a>:text<span class="muRecipe"> -> </span>contents:&:source:char, error?:bool [ <span id="L54" class="LineNr"> 54 </span> <span class="Constant">local-scope</span> <span id="L55" class="LineNr"> 55 </span> <span class="Constant">load-ingredients</span> <span id="L56" class="LineNr"> 56 </span> error? <span class="Special"><-</span> copy <span class="Constant">0/no-error</span> <span id="L57" class="LineNr"> 57 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> -<span id="L58" class="LineNr"> 58 </span> data:&:@:resource <span class="Special"><-</span> get *resources, <span class="Constant">data:offset</span> +<span id="L58" class="LineNr"> 58 </span> data:&:@:<a href='088file.mu.html#L16'>resource</a> <span class="Special"><-</span> get *resources, <span class="Constant">data:offset</span> <span id="L59" class="LineNr"> 59 </span> len:num <span class="Special"><-</span> length *data <span id="L60" class="LineNr"> 60 </span> <span class="Delimiter">{</span> <span id="L61" class="LineNr"> 61 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L62" class="LineNr"> 62 </span> <span class="muControl">break-if</span> done? -<span id="L63" class="LineNr"> 63 </span> tmp:resource <span class="Special"><-</span> index *data, i +<span id="L63" class="LineNr"> 63 </span> tmp:<a href='088file.mu.html#L16'>resource</a> <span class="Special"><-</span> index *data, i <span id="L64" class="LineNr"> 64 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L65" class="LineNr"> 65 </span> curr-resource:text <span class="Special"><-</span> get tmp, <span class="Constant">name:offset</span> -<span id="L66" class="LineNr"> 66 </span> found?:bool <span class="Special"><-</span> equal resource, curr-resource +<span id="L66" class="LineNr"> 66 </span> found?:bool <span class="Special"><-</span> equal <a href='088file.mu.html#L16'>resource</a>, curr-resource <span id="L67" class="LineNr"> 67 </span> <span class="muControl">loop-unless</span> found? -<span id="L68" class="LineNr"> 68 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel<span class="Constant"> 30</span> +<span id="L68" class="LineNr"> 68 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a><span class="Constant"> 30</span> <span id="L69" class="LineNr"> 69 </span> curr-contents:text <span class="Special"><-</span> get tmp, <span class="Constant">contents:offset</span> -<span id="L70" class="LineNr"> 70 </span> start-running receive-from-text curr-contents, sink +<span id="L70" class="LineNr"> 70 </span> start-running <a href='088file.mu.html#L89'>receive-from-text</a> curr-contents, sink <span id="L71" class="LineNr"> 71 </span> <span class="muControl">return</span> <span id="L72" class="LineNr"> 72 </span> <span class="Delimiter">}</span> <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> <span id="L74" class="LineNr"> 74 </span>] <span id="L75" class="LineNr"> 75 </span> -<span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> receive-from-file file:num, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char [ +<span id="L76" class="LineNr"> 76 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L76'>receive-from-file</a> file:num, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char [ <span id="L77" class="LineNr"> 77 </span> <span class="Constant">local-scope</span> <span id="L78" class="LineNr"> 78 </span> <span class="Constant">load-ingredients</span> <span id="L79" class="LineNr"> 79 </span> <span class="Delimiter">{</span> <span id="L80" class="LineNr"> 80 </span> c:char, eof?:bool <span class="Special"><-</span> $read-from-file file <span id="L81" class="LineNr"> 81 </span> <span class="muControl">break-if</span> eof? -<span id="L82" class="LineNr"> 82 </span> sink <span class="Special"><-</span> write sink, c +<span id="L82" class="LineNr"> 82 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, c <span id="L83" class="LineNr"> 83 </span> <span class="muControl">loop</span> <span id="L84" class="LineNr"> 84 </span> <span class="Delimiter">}</span> <span id="L85" class="LineNr"> 85 </span> sink <span class="Special"><-</span> close sink <span id="L86" class="LineNr"> 86 </span> file <span class="Special"><-</span> $close-file file <span id="L87" class="LineNr"> 87 </span>] <span id="L88" class="LineNr"> 88 </span> -<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> receive-from-text contents:text, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char [ +<span id="L89" class="LineNr"> 89 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L89'>receive-from-text</a> contents:text, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char [ <span id="L90" class="LineNr"> 90 </span> <span class="Constant">local-scope</span> <span id="L91" class="LineNr"> 91 </span> <span class="Constant">load-ingredients</span> <span id="L92" class="LineNr"> 92 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> @@ -152,22 +152,22 @@ if ('onhashchange' in window) { <span id="L95" class="LineNr"> 95 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L96" class="LineNr"> 96 </span> <span class="muControl">break-if</span> done? <span id="L97" class="LineNr"> 97 </span> c:char <span class="Special"><-</span> index *contents, i -<span id="L98" class="LineNr"> 98 </span> sink <span class="Special"><-</span> write sink, c +<span id="L98" class="LineNr"> 98 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, c <span id="L99" class="LineNr"> 99 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L100" class="LineNr">100 </span> <span class="muControl">loop</span> <span id="L101" class="LineNr">101 </span> <span class="Delimiter">}</span> <span id="L102" class="LineNr">102 </span> sink <span class="Special"><-</span> close sink <span id="L103" class="LineNr">103 </span>] <span id="L104" class="LineNr">104 </span> -<span id="L105" class="LineNr">105 </span><span class="muRecipe">def</span> start-writing resources:&:resources, filename:text<span class="muRecipe"> -> </span>sink:&:sink:char, routine-id:num, error?:bool [ +<span id="L105" class="LineNr">105 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, filename:text<span class="muRecipe"> -> </span>sink:&:sink:char, routine-id:num, error?:bool [ <span id="L106" class="LineNr">106 </span> <span class="Constant">local-scope</span> <span id="L107" class="LineNr">107 </span> <span class="Constant">load-ingredients</span> <span id="L108" class="LineNr">108 </span> error? <span class="Special"><-</span> copy <span class="Constant">0/false</span> -<span id="L109" class="LineNr">109 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel<span class="Constant"> 30</span> +<span id="L109" class="LineNr">109 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a><span class="Constant"> 30</span> <span id="L110" class="LineNr">110 </span> <span class="Delimiter">{</span> -<span id="L111" class="LineNr">111 </span> <span class="muControl">break-unless</span> resources +<span id="L111" class="LineNr">111 </span> <span class="muControl">break-unless</span> <a href='088file.mu.html#L11'>resources</a> <span id="L112" class="LineNr">112 </span> <span class="Comment"># fake file system</span> -<span id="L113" class="LineNr">113 </span> routine-id <span class="Special"><-</span> start-running transmit-to-fake-resource resources, filename, source +<span id="L113" class="LineNr">113 </span> routine-id <span class="Special"><-</span> start-running <a href='088file.mu.html#L162'>transmit-to-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>, filename, source <span id="L114" class="LineNr">114 </span> <span class="muControl">return</span> <span id="L115" class="LineNr">115 </span> <span class="Delimiter">}</span> <span id="L116" class="LineNr">116 </span> <span class="Comment"># real file system</span> @@ -178,15 +178,15 @@ if ('onhashchange' in window) { <span id="L121" class="LineNr">121 </span> msg:text <span class="Special"><-</span> append <span class="Constant">[no such file: ]</span> filename <span id="L122" class="LineNr">122 </span> assert file, msg <span id="L123" class="LineNr">123 </span> <span class="Delimiter">}</span> -<span id="L124" class="LineNr">124 </span> routine-id <span class="Special"><-</span> start-running transmit-to-file file, source +<span id="L124" class="LineNr">124 </span> routine-id <span class="Special"><-</span> start-running <a href='088file.mu.html#L150'>transmit-to-file</a> file, source <span id="L125" class="LineNr">125 </span>] <span id="L126" class="LineNr">126 </span> -<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> dump resources:&:resources, filename:text, contents:text<span class="muRecipe"> -> </span>resources:&:resources, error?:bool [ +<span id="L127" class="LineNr">127 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L127'>dump</a> <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, filename:text, contents:text<span class="muRecipe"> -> </span><a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, error?:bool [ <span id="L128" class="LineNr">128 </span> <span class="Constant">local-scope</span> <span id="L129" class="LineNr">129 </span> <span class="Constant">load-ingredients</span> <span id="L130" class="LineNr">130 </span> <span class="Comment"># todo: really create an empty file</span> -<span id="L131" class="LineNr">131 </span> <span class="muControl">return-unless</span> contents, resources, <span class="Constant">0/no-error</span> -<span id="L132" class="LineNr">132 </span> sink-file:&:sink:char, write-routine:num, error?:bool <span class="Special"><-</span> start-writing resources, filename +<span id="L131" class="LineNr">131 </span> <span class="muControl">return-unless</span> contents, <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">0/no-error</span> +<span id="L132" class="LineNr">132 </span> sink-file:&:sink:char, write-routine:num, error?:bool <span class="Special"><-</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>, filename <span id="L133" class="LineNr">133 </span> <span class="muControl">return-if</span> error? <span id="L134" class="LineNr">134 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L135" class="LineNr">135 </span> len:num <span class="Special"><-</span> length *contents @@ -194,7 +194,7 @@ if ('onhashchange' in window) { <span id="L137" class="LineNr">137 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L138" class="LineNr">138 </span> <span class="muControl">break-if</span> done? <span id="L139" class="LineNr">139 </span> c:char <span class="Special"><-</span> index *contents, i -<span id="L140" class="LineNr">140 </span> sink-file <span class="Special"><-</span> write sink-file, c +<span id="L140" class="LineNr">140 </span> sink-file <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink-file, c <span id="L141" class="LineNr">141 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L142" class="LineNr">142 </span> <span class="muControl">loop</span> <span id="L143" class="LineNr">143 </span> <span class="Delimiter">}</span> @@ -204,7 +204,7 @@ if ('onhashchange' in window) { <span id="L147" class="LineNr">147 </span> wait-for-routine write-routine <span id="L148" class="LineNr">148 </span>] <span id="L149" class="LineNr">149 </span> -<span id="L150" class="LineNr">150 </span><span class="muRecipe">def</span> transmit-to-file file:num, source:&:source:char<span class="muRecipe"> -> </span>source:&:source:char [ +<span id="L150" class="LineNr">150 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L150'>transmit-to-file</a> file:num, source:&:source:char<span class="muRecipe"> -> </span>source:&:source:char [ <span id="L151" class="LineNr">151 </span> <span class="Constant">local-scope</span> <span id="L152" class="LineNr">152 </span> <span class="Constant">load-ingredients</span> <span id="L153" class="LineNr">153 </span> <span class="Delimiter">{</span> @@ -216,31 +216,31 @@ if ('onhashchange' in window) { <span id="L159" class="LineNr">159 </span> file <span class="Special"><-</span> $close-file file <span id="L160" class="LineNr">160 </span>] <span id="L161" class="LineNr">161 </span> -<span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> transmit-to-fake-resource resources:&:resources, filename:text, source:&:source:char<span class="muRecipe"> -> </span>resources:&:resources, source:&:source:char [ +<span id="L162" class="LineNr">162 </span><span class="muRecipe">def</span> <a href='088file.mu.html#L162'>transmit-to-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, filename:text, source:&:source:char<span class="muRecipe"> -> </span><a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, source:&:source:char [ <span id="L163" class="LineNr">163 </span> <span class="Constant">local-scope</span> <span id="L164" class="LineNr">164 </span> <span class="Constant">load-ingredients</span> <span id="L165" class="LineNr">165 </span> lock:location <span class="Special"><-</span> get-location *resources, <span class="Constant">lock:offset</span> <span id="L166" class="LineNr">166 </span> wait-for-reset-then-set lock <span id="L167" class="LineNr">167 </span> <span class="Comment"># compute new file contents</span> -<span id="L168" class="LineNr">168 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> +<span id="L168" class="LineNr">168 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> <span id="L169" class="LineNr">169 </span> <span class="Delimiter">{</span> <span id="L170" class="LineNr">170 </span> c:char, done?:bool, source <span class="Special"><-</span> read source <span id="L171" class="LineNr">171 </span> <span class="muControl">break-if</span> done? <span id="L172" class="LineNr">172 </span> buf <span class="Special"><-</span> append buf, c <span id="L173" class="LineNr">173 </span> <span class="muControl">loop</span> <span id="L174" class="LineNr">174 </span> <span class="Delimiter">}</span> -<span id="L175" class="LineNr">175 </span> contents:text <span class="Special"><-</span> buffer-to-array buf -<span id="L176" class="LineNr">176 </span> new-resource:resource <span class="Special"><-</span> merge filename, contents +<span id="L175" class="LineNr">175 </span> contents:text <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf +<span id="L176" class="LineNr">176 </span> new-resource:<a href='088file.mu.html#L16'>resource</a> <span class="Special"><-</span> merge filename, contents <span id="L177" class="LineNr">177 </span> <span class="Comment"># write to resources</span> <span id="L178" class="LineNr">178 </span> curr-filename:text <span class="Special"><-</span> copy<span class="Constant"> 0</span> -<span id="L179" class="LineNr">179 </span> data:&:@:resource <span class="Special"><-</span> get *resources, <span class="Constant">data:offset</span> +<span id="L179" class="LineNr">179 </span> data:&:@:<a href='088file.mu.html#L16'>resource</a> <span class="Special"><-</span> get *resources, <span class="Constant">data:offset</span> <span id="L180" class="LineNr">180 </span> <span class="Comment"># replace file contents if it already exists</span> <span id="L181" class="LineNr">181 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L182" class="LineNr">182 </span> len:num <span class="Special"><-</span> length *data <span id="L183" class="LineNr">183 </span> <span class="Delimiter">{</span> <span id="L184" class="LineNr">184 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L185" class="LineNr">185 </span> <span class="muControl">break-if</span> done? -<span id="L186" class="LineNr">186 </span> tmp:resource <span class="Special"><-</span> index *data, i +<span id="L186" class="LineNr">186 </span> tmp:<a href='088file.mu.html#L16'>resource</a> <span class="Special"><-</span> index *data, i <span id="L187" class="LineNr">187 </span> curr-filename <span class="Special"><-</span> get tmp, <span class="Constant">name:offset</span> <span id="L188" class="LineNr">188 </span> found?:bool <span class="Special"><-</span> equal filename, curr-filename <span id="L189" class="LineNr">189 </span> <span class="Delimiter">{</span> @@ -253,14 +253,14 @@ if ('onhashchange' in window) { <span id="L196" class="LineNr">196 </span> <span class="Delimiter">}</span> <span id="L197" class="LineNr">197 </span> <span class="Comment"># if file didn't already exist, make room for it</span> <span id="L198" class="LineNr">198 </span> new-len:num <span class="Special"><-</span> add len,<span class="Constant"> 1</span> -<span id="L199" class="LineNr">199 </span> new-data:&:@:resource <span class="Special"><-</span> new <span class="Constant">resource:type</span>, new-len +<span id="L199" class="LineNr">199 </span> new-data:&:@:<a href='088file.mu.html#L16'>resource</a> <span class="Special"><-</span> new <span class="Constant"><a href='088file.mu.html#L16'>resource</a>:type</span>, new-len <span id="L200" class="LineNr">200 </span> put *resources, <span class="Constant">data:offset</span>, new-data <span id="L201" class="LineNr">201 </span> <span class="Comment"># copy over old files</span> <span id="L202" class="LineNr">202 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L203" class="LineNr">203 </span> <span class="Delimiter">{</span> <span id="L204" class="LineNr">204 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L205" class="LineNr">205 </span> <span class="muControl">break-if</span> done? -<span id="L206" class="LineNr">206 </span> tmp:resource <span class="Special"><-</span> index *data, i +<span id="L206" class="LineNr">206 </span> tmp:<a href='088file.mu.html#L16'>resource</a> <span class="Special"><-</span> index *data, i <span id="L207" class="LineNr">207 </span> put-index *new-data, i, tmp <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> <span id="L209" class="LineNr">209 </span> <span class="Comment"># write new file</span> diff --git a/html/089scenario_filesystem.cc.html b/html/089scenario_filesystem.cc.html index 06538413..309007dd 100644 --- a/html/089scenario_filesystem.cc.html +++ b/html/089scenario_filesystem.cc.html @@ -62,7 +62,7 @@ if ('onhashchange' in window) { <span id="L4" class="LineNr"> 4 </span> <span id="L5" class="LineNr"> 5 </span><span class="Delimiter">:(scenarios run_mu_scenario)</span> <span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(scenario simple_filesystem)</span> -<span id="L7" class="LineNr"> 7 </span><span class="muScenario">scenario</span> simple-filesystem [ +<span id="L7" class="LineNr"> 7 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> simple-filesystem [ <span id="L8" class="LineNr"> 8 </span> local-scope <span id="L9" class="LineNr"> 9 </span> assume-resources [ <span id="L10" class="LineNr"> 10 </span> <span class="Comment"># file 'a' containing two lines of data</span> @@ -106,7 +106,7 @@ if ('onhashchange' in window) { <span id="L48" class="LineNr"> 48 </span>] <span id="L49" class="LineNr"> 49 </span> <span id="L50" class="LineNr"> 50 </span><span class="Delimiter">:(scenario escaping_file_contents)</span> -<span id="L51" class="LineNr"> 51 </span><span class="muScenario">scenario</span> escaping-file-contents [ +<span id="L51" class="LineNr"> 51 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> escaping-file-contents [ <span id="L52" class="LineNr"> 52 </span> local-scope <span id="L53" class="LineNr"> 53 </span> assume-resources [ <span id="L54" class="LineNr"> 54 </span> <span class="Comment"># file 'a' containing a '|'</span> @@ -134,10 +134,10 @@ if ('onhashchange' in window) { <span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(before "End Special Scenario Variable Names(r)")</span> <span id="L77" class="LineNr"> 77 </span>Name[r][<span class="Constant">"resources"</span>] = RESOURCES<span class="Delimiter">;</span> <span id="L78" class="LineNr"> 78 </span><span class="Comment">//: make 'resources' always a raw location in scenarios</span> -<span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(before "End is_special_name Special-cases")</span> +<span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> <span id="L80" class="LineNr"> 80 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"resources"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L81" class="LineNr"> 81 </span><span class="Delimiter">:(before "End Initialize Type Of Special Name In Scenario(r)")</span> -<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">"resources"</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = new_type_tree<span class="Delimiter">(</span><span class="Constant">"address:resources"</span><span class="Delimiter">);</span> +<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">"resources"</span><span class="Delimiter">)</span> r<span class="Delimiter">.</span>type = <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">"address:resources"</span><span class="Delimiter">);</span> <span id="L83" class="LineNr"> 83 </span> <span id="L84" class="LineNr"> 84 </span><span class="Delimiter">:(before "End initialize_transform_rewrite_literal_string_to_text()")</span> <span id="L85" class="LineNr"> 85 </span>recipes_taking_literal_strings<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><span class="Constant">"assume-resources"</span><span class="Delimiter">);</span> @@ -146,7 +146,7 @@ if ('onhashchange' in window) { <span id="L88" class="LineNr"> 88 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L89" class="LineNr"> 89 </span>ASSUME_RESOURCES<span class="Delimiter">,</span> <span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L91" class="LineNr"> 91 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"assume-resources"</span><span class="Delimiter">,</span> ASSUME_RESOURCES<span class="Delimiter">);</span> +<span id="L91" class="LineNr"> 91 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"assume-resources"</span><span class="Delimiter">,</span> ASSUME_RESOURCES<span class="Delimiter">);</span> <span id="L92" class="LineNr"> 92 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L93" class="LineNr"> 93 </span><span class="Normal">case</span> ASSUME_RESOURCES: <span class="Delimiter">{</span> <span id="L94" class="LineNr"> 94 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -154,101 +154,101 @@ if ('onhashchange' in window) { <span id="L96" class="LineNr"> 96 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L97" class="LineNr"> 97 </span><span class="Normal">case</span> ASSUME_RESOURCES: <span class="Delimiter">{</span> <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> -<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> +<span id="L99" class="LineNr"> 99 </span> <a href='089scenario_filesystem.cc.html#L104'>assume_resources</a><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 id="L100" class="LineNr">100 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L101" class="LineNr">101 </span><span class="Delimiter">}</span> <span id="L102" class="LineNr">102 </span> <span id="L103" class="LineNr">103 </span><span class="Delimiter">:(code)</span> -<span id="L104" class="LineNr">104 </span><span class="Normal">void</span> assume_resources<span class="Delimiter">(</span><span class="Normal">const</span> string& data<span class="Delimiter">,</span> <span class="Normal">const</span> string& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L104" class="LineNr">104 </span><span class="Normal">void</span> <a href='089scenario_filesystem.cc.html#L104'>assume_resources</a><span class="Delimiter">(</span><span class="Normal">const</span> string& data<span class="Delimiter">,</span> <span class="Normal">const</span> string& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L105" class="LineNr">105 </span> map<string<span class="Delimiter">,</span> string> contents<span class="Delimiter">;</span> -<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> -<span id="L107" class="LineNr">107 </span> construct_resources_object<span class="Delimiter">(</span>contents<span class="Delimiter">);</span> +<span id="L106" class="LineNr">106 </span> <a href='089scenario_filesystem.cc.html#L110'>parse_resources</a><span class="Delimiter">(</span>data<span class="Delimiter">,</span> contents<span class="Delimiter">,</span> caller<span class="Delimiter">);</span> +<span id="L107" class="LineNr">107 </span> <a href='089scenario_filesystem.cc.html#L205'>construct_resources_object</a><span class="Delimiter">(</span>contents<span class="Delimiter">);</span> <span id="L108" class="LineNr">108 </span><span class="Delimiter">}</span> <span id="L109" class="LineNr">109 </span> -<span id="L110" class="LineNr">110 </span><span class="Normal">void</span> parse_resources<span class="Delimiter">(</span><span class="Normal">const</span> string& data<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> string>& out<span class="Delimiter">,</span> <span class="Normal">const</span> string& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L110" class="LineNr">110 </span><span class="Normal">void</span> <a href='089scenario_filesystem.cc.html#L110'>parse_resources</a><span class="Delimiter">(</span><span class="Normal">const</span> string& data<span class="Delimiter">,</span> map<string<span class="Delimiter">,</span> string>& out<span class="Delimiter">,</span> <span class="Normal">const</span> string& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L111" class="LineNr">111 </span> istringstream in<span class="Delimiter">(</span>data<span class="Delimiter">);</span> <span id="L112" class="LineNr">112 </span> in >> std::noskipws<span class="Delimiter">;</span> <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> <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> -<span id="L115" class="LineNr">115 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L115" class="LineNr">115 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> -<span id="L117" class="LineNr">117 </span> string filename = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L117" class="LineNr">117 </span> string filename = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L119" class="LineNr">119 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L120" class="LineNr">120 </span> raise << <span class="Constant">"incomplete 'resources' block at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L120" class="LineNr">120 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'resources' block at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L121" class="LineNr">121 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L122" class="LineNr">122 </span> <span class="Delimiter">}</span> <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> -<span id="L124" class="LineNr">124 </span> raise << caller << <span class="Constant">": assume-resources: filename '"</span> << filename << <span class="Constant">"' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L124" class="LineNr">124 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: filename '"</span> << filename << <span class="Constant">"' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L125" class="LineNr">125 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L126" class="LineNr">126 </span> <span class="Delimiter">}</span> <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> -<span id="L128" class="LineNr">128 </span> raise << caller << <span class="Constant">": assume-resources: filename '"</span> << filename << <span class="Constant">"' must end with a ']'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L128" class="LineNr">128 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: filename '"</span> << filename << <span class="Constant">"' must <a href='003trace.cc.html#L195'>end</a> with a ']'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L129" class="LineNr">129 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span> <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> -<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> +<span id="L132" class="LineNr">132 </span> filename<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>filename<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span> <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> -<span id="L134" class="LineNr">134 </span> raise << caller << <span class="Constant">": assume-resources: no data for filename '"</span> << filename << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L134" class="LineNr">134 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: no data for filename '"</span> << filename << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L135" class="LineNr">135 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L136" class="LineNr">136 </span> <span class="Delimiter">}</span> -<span id="L137" class="LineNr">137 </span> string arrow = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L137" class="LineNr">137 </span> string arrow = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L139" class="LineNr">139 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L140" class="LineNr">140 </span> raise << <span class="Constant">"incomplete 'resources' block at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L140" class="LineNr">140 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'resources' block at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L141" class="LineNr">141 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L142" class="LineNr">142 </span> <span class="Delimiter">}</span> <span id="L143" class="LineNr">143 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>arrow != <span class="Constant">"<-"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L144" class="LineNr">144 </span> raise << caller << <span class="Constant">": assume-resources: expected '<-' after filename '"</span> << filename << <span class="Constant">"' but got '"</span> << arrow << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L144" class="LineNr">144 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: expected '<-' after filename '"</span> << filename << <span class="Constant">"' but got '"</span> << arrow << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L145" class="LineNr">145 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L146" class="LineNr">146 </span> <span class="Delimiter">}</span> <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> -<span id="L148" class="LineNr">148 </span> raise << caller << <span class="Constant">": assume-resources: no data for filename '"</span> << filename << <span class="Constant">"' after '<-'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L148" class="LineNr">148 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: no data for filename '"</span> << filename << <span class="Constant">"' after '<-'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L149" class="LineNr">149 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L150" class="LineNr">150 </span> <span class="Delimiter">}</span> -<span id="L151" class="LineNr">151 </span> string contents = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L151" class="LineNr">151 </span> string contents = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <span id="L153" class="LineNr">153 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L154" class="LineNr">154 </span> raise << <span class="Constant">"incomplete 'resources' block at end of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L154" class="LineNr">154 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'resources' block at <a href='003trace.cc.html#L195'>end</a> of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L155" class="LineNr">155 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L156" class="LineNr">156 </span> <span class="Delimiter">}</span> <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> -<span id="L158" class="LineNr">158 </span> raise << caller << <span class="Constant">": assume-resources: file contents '"</span> << contents << <span class="Constant">"' for filename '"</span> << filename << <span class="Constant">"' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L158" class="LineNr">158 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: file contents '"</span> << contents << <span class="Constant">"' for filename '"</span> << filename << <span class="Constant">"' must begin with a '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L159" class="LineNr">159 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L160" class="LineNr">160 </span> <span class="Delimiter">}</span> <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> -<span id="L162" class="LineNr">162 </span> raise << caller << <span class="Constant">": assume-resources: file contents '"</span> << contents << <span class="Constant">"' for filename '"</span> << filename << <span class="Constant">"' must end with a ']'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L162" class="LineNr">162 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: file contents '"</span> << contents << <span class="Constant">"' for filename '"</span> << filename << <span class="Constant">"' must <a href='003trace.cc.html#L195'>end</a> with a ']'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L163" class="LineNr">163 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L164" class="LineNr">164 </span> <span class="Delimiter">}</span> <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> -<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> -<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> +<span id="L166" class="LineNr">166 </span> contents<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>contents<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L167" class="LineNr">167 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> filename<span class="Delimiter">,</span> <a href='089scenario_filesystem.cc.html#L171'>munge_resources_contents</a><span class="Delimiter">(</span>contents<span class="Delimiter">,</span> filename<span class="Delimiter">,</span> caller<span class="Delimiter">));</span> <span id="L168" class="LineNr">168 </span> <span class="Delimiter">}</span> <span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span> <span id="L170" class="LineNr">170 </span> -<span id="L171" class="LineNr">171 </span>string munge_resources_contents<span class="Delimiter">(</span><span class="Normal">const</span> string& data<span class="Delimiter">,</span> <span class="Normal">const</span> string& filename<span class="Delimiter">,</span> <span class="Normal">const</span> string& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L171" class="LineNr">171 </span>string <a href='089scenario_filesystem.cc.html#L171'>munge_resources_contents</a><span class="Delimiter">(</span><span class="Normal">const</span> string& data<span class="Delimiter">,</span> <span class="Normal">const</span> string& filename<span class="Delimiter">,</span> <span class="Normal">const</span> string& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">""</span><span class="Delimiter">;</span> <span id="L173" class="LineNr">173 </span> istringstream in<span class="Delimiter">(</span>data<span class="Delimiter">);</span> <span id="L174" class="LineNr">174 </span> in >> std::noskipws<span class="Delimiter">;</span> -<span id="L175" class="LineNr">175 </span> skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L175" class="LineNr">175 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L176" class="LineNr">176 </span> ostringstream out<span class="Delimiter">;</span> <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> <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> -<span id="L179" class="LineNr">179 </span> skip_whitespace<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L179" class="LineNr">179 </span> <a href='038new_text.cc.html#L220'>skip_whitespace</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <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> <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> -<span id="L182" class="LineNr">182 </span> raise << caller << <span class="Constant">": assume-resources: file contents for filename '"</span> << filename << <span class="Constant">"' must be delimited in '|'s</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L182" class="LineNr">182 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": assume-resources: file contents for filename '"</span> << filename << <span class="Constant">"' must be delimited in '|'s</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L183" class="LineNr">183 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L184" class="LineNr">184 </span> <span class="Delimiter">}</span> <span id="L185" class="LineNr">185 </span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span> <span class="Comment">// skip leading '|'</span> <span id="L186" class="LineNr">186 </span> string line<span class="Delimiter">;</span> <span id="L187" class="LineNr">187 </span> getline<span class="Delimiter">(</span>in<span class="Delimiter">,</span> line<span class="Delimiter">);</span> -<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 < SIZE<span class="Delimiter">(</span>line<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>line<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <span id="L191" class="LineNr">191 </span> ++i<span class="Delimiter">;</span> <span class="Comment">// skip</span> -<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> -<span id="L193" class="LineNr">193 </span> raise << caller << <span class="Constant">": 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">"</span> << end<span class="Delimiter">();</span> +<span id="L192" class="LineNr">192 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i == <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>line<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L193" class="LineNr">193 </span> <a href='003trace.cc.html#L178'>raise</a> << caller << <span class="Constant">": 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">"</span> << end<span class="Delimiter">();</span> <span id="L194" class="LineNr">194 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L195" class="LineNr">195 </span> <span class="Delimiter">}</span> <span id="L196" class="LineNr">196 </span> <span class="Delimiter">}</span> @@ -260,39 +260,39 @@ if ('onhashchange' in window) { <span id="L202" class="LineNr">202 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L203" class="LineNr">203 </span><span class="Delimiter">}</span> <span id="L204" class="LineNr">204 </span> -<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<string<span class="Delimiter">,</span> string>& contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L205" class="LineNr">205 </span><span class="Normal">void</span> <a href='089scenario_filesystem.cc.html#L205'>construct_resources_object</a><span class="Delimiter">(</span><span class="Normal">const</span> map<string<span class="Delimiter">,</span> string>& contents<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L206" class="LineNr">206 </span> <span class="Normal">int</span> resources_data_address = allocate<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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 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> -<span id="L208" class="LineNr">208 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> string>::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> -<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">-></span>first<span class="Delimiter">));</span> -<span id="L210" class="LineNr">210 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing file name "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << curr << end<span class="Delimiter">();</span> -<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> -<span id="L212" class="LineNr">212 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L208" class="LineNr">208 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<string<span class="Delimiter">,</span> string>::const_iterator p = contents<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != contents<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L209" class="LineNr">209 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>first<span class="Delimiter">));</span> +<span id="L210" class="LineNr">210 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing file name "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << curr << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L211" class="LineNr">211 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L212" class="LineNr">212 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L213" class="LineNr">213 </span> ++curr<span class="Delimiter">;</span> -<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">-></span>second<span class="Delimiter">));</span> -<span id="L215" class="LineNr">215 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing file contents "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << curr << end<span class="Delimiter">();</span> -<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> -<span id="L217" class="LineNr">217 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << end<span class="Delimiter">();</span> +<span id="L214" class="LineNr">214 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">));</span> +<span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing file contents "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << curr << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L216" class="LineNr">216 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L217" class="LineNr">217 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L218" class="LineNr">218 </span> ++curr<span class="Delimiter">;</span> <span id="L219" class="LineNr">219 </span> <span class="Delimiter">}</span> <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> -<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> -<span id="L222" class="LineNr">222 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing resources size "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << curr << end<span class="Delimiter">();</span> -<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> -<span id="L224" class="LineNr">224 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << resources_data_address << end<span class="Delimiter">();</span> +<span id="L221" class="LineNr">221 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>contents<span class="Delimiter">));</span> <span class="Comment">// size of array</span> +<span id="L222" class="LineNr">222 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing resources size "</span> << get<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)</span> << <span class="Constant">" in location "</span> << curr << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L223" class="LineNr">223 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L224" class="LineNr">224 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << resources_data_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L225" class="LineNr">225 </span> <span class="Comment">// wrap the resources data in a 'resources' object</span> -<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> +<span id="L226" class="LineNr">226 </span> <span class="Normal">int</span> resources_address = allocate<span class="Delimiter">(</span><a href='089scenario_filesystem.cc.html#L237'>size_of_resources</a><span class="Delimiter">());</span> <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> -<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> -<span id="L229" class="LineNr">229 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing resources data address "</span> << resources_data_address << <span class="Constant">" in location "</span> << curr << end<span class="Delimiter">();</span> -<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> -<span id="L231" class="LineNr">231 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << resources_address << end<span class="Delimiter">();</span> +<span id="L228" class="LineNr">228 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">,</span> resources_data_address<span class="Delimiter">);</span> +<span id="L229" class="LineNr">229 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing resources data <a href='043space.cc.html#L76'>address</a> "</span> << resources_data_address << <span class="Constant">" in location "</span> << curr << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L230" class="LineNr">230 </span> <a href='001help.cc.html#L218'>put</a><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> +<span id="L231" class="LineNr">231 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing refcount 1 in location "</span> << resources_address << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L232" class="LineNr">232 </span> <span class="Comment">// save in product</span> -<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> -<span id="L234" class="LineNr">234 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing resources address "</span> << resources_address << <span class="Constant">" in location "</span> << RESOURCES << end<span class="Delimiter">();</span> +<span id="L233" class="LineNr">233 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> RESOURCES<span class="Delimiter">,</span> resources_address<span class="Delimiter">);</span> +<span id="L234" class="LineNr">234 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing resources <a href='043space.cc.html#L76'>address</a> "</span> << resources_address << <span class="Constant">" in location "</span> << RESOURCES << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L235" class="LineNr">235 </span><span class="Delimiter">}</span> <span id="L236" class="LineNr">236 </span> -<span id="L237" class="LineNr">237 </span><span class="Normal">int</span> size_of_resources<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L237" class="LineNr">237 </span><span class="Normal">int</span> <a href='089scenario_filesystem.cc.html#L237'>size_of_resources</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L238" class="LineNr">238 </span> <span class="Comment">// memoize result if already computed</span> <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> <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> diff --git a/html/090scenario_filesystem_test.mu.html b/html/090scenario_filesystem_test.mu.html index 3418c8b3..9595f8f4 100644 --- a/html/090scenario_filesystem_test.mu.html +++ b/html/090scenario_filesystem_test.mu.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <span id="L7" class="LineNr"> 7 </span><span class="Constant"> |xyz|</span> <span id="L8" class="LineNr"> 8 </span> ] <span id="L9" class="LineNr"> 9 </span> ] -<span id="L10" class="LineNr">10 </span> contents:&:source:char <span class="Special"><-</span> start-reading resources, <span class="Constant">[a]</span> +<span id="L10" class="LineNr">10 </span> contents:&:source:char <span class="Special"><-</span> <a href='088file.mu.html#L21'>start-reading</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[a]</span> <span id="L11" class="LineNr">11 </span> 1:char/<span class="Special">raw</span> <span class="Special"><-</span> read contents <span id="L12" class="LineNr">12 </span> 2:char/<span class="Special">raw</span> <span class="Special"><-</span> read contents <span id="L13" class="LineNr">13 </span> 3:char/<span class="Special">raw</span> <span class="Special"><-</span> read contents @@ -80,12 +80,12 @@ if ('onhashchange' in window) { <span id="L26" class="LineNr">26 </span> <span class="Constant">local-scope</span> <span id="L27" class="LineNr">27 </span> assume-resources [ <span id="L28" class="LineNr">28 </span> ] -<span id="L29" class="LineNr">29 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> start-writing resources, <span class="Constant">[a]</span> -<span id="L30" class="LineNr">30 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">120/x</span> -<span id="L31" class="LineNr">31 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">121/y</span> +<span id="L29" class="LineNr">29 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[a]</span> +<span id="L30" class="LineNr">30 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">120/x</span> +<span id="L31" class="LineNr">31 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">121/y</span> <span id="L32" class="LineNr">32 </span> close sink <span id="L33" class="LineNr">33 </span> wait-for-routine writer -<span id="L34" class="LineNr">34 </span> contents-read-back:text <span class="Special"><-</span> slurp resources, <span class="Constant">[a]</span> +<span id="L34" class="LineNr">34 </span> contents-read-back:text <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[a]</span> <span id="L35" class="LineNr">35 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal contents-read-back, <span class="Constant">[xy]</span> <span id="L36" class="LineNr">36 </span> memory-should-contain [ <span id="L37" class="LineNr">37 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># file contents read back exactly match what was written</span> @@ -99,12 +99,12 @@ if ('onhashchange' in window) { <span id="L45" class="LineNr">45 </span><span class="Constant"> |abc|</span> <span id="L46" class="LineNr">46 </span> ] <span id="L47" class="LineNr">47 </span> ] -<span id="L48" class="LineNr">48 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> start-writing resources, <span class="Constant">[b]</span> -<span id="L49" class="LineNr">49 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">120/x</span> -<span id="L50" class="LineNr">50 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">121/y</span> +<span id="L48" class="LineNr">48 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[b]</span> +<span id="L49" class="LineNr">49 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">120/x</span> +<span id="L50" class="LineNr">50 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">121/y</span> <span id="L51" class="LineNr">51 </span> close sink <span id="L52" class="LineNr">52 </span> wait-for-routine writer -<span id="L53" class="LineNr">53 </span> contents-read-back:text <span class="Special"><-</span> slurp resources, <span class="Constant">[b]</span> +<span id="L53" class="LineNr">53 </span> contents-read-back:text <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[b]</span> <span id="L54" class="LineNr">54 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal contents-read-back, <span class="Constant">[xy]</span> <span id="L55" class="LineNr">55 </span> memory-should-contain [ <span id="L56" class="LineNr">56 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># file contents read back exactly match what was written</span> @@ -116,12 +116,12 @@ if ('onhashchange' in window) { <span id="L62" class="LineNr">62 </span> assume-resources [ <span id="L63" class="LineNr">63 </span> <span class="Constant">[a]</span> <span class="Special"><-</span> <span class="Constant">[]</span> <span id="L64" class="LineNr">64 </span> ] -<span id="L65" class="LineNr">65 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> start-writing resources, <span class="Constant">[a]</span> -<span id="L66" class="LineNr">66 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">120/x</span> -<span id="L67" class="LineNr">67 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">121/y</span> +<span id="L65" class="LineNr">65 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[a]</span> +<span id="L66" class="LineNr">66 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">120/x</span> +<span id="L67" class="LineNr">67 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">121/y</span> <span id="L68" class="LineNr">68 </span> close sink <span id="L69" class="LineNr">69 </span> wait-for-routine writer -<span id="L70" class="LineNr">70 </span> contents-read-back:text <span class="Special"><-</span> slurp resources, <span class="Constant">[a]</span> +<span id="L70" class="LineNr">70 </span> contents-read-back:text <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[a]</span> <span id="L71" class="LineNr">71 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal contents-read-back, <span class="Constant">[xy]</span> <span id="L72" class="LineNr">72 </span> memory-should-contain [ <span id="L73" class="LineNr">73 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># file contents read back exactly match what was written</span> @@ -136,14 +136,14 @@ if ('onhashchange' in window) { <span id="L82" class="LineNr">82 </span><span class="Constant"> |bcd|</span> <span id="L83" class="LineNr">83 </span> ] <span id="L84" class="LineNr">84 </span> ] -<span id="L85" class="LineNr">85 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> start-writing resources, <span class="Constant">[a]</span> -<span id="L86" class="LineNr">86 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">120/x</span> -<span id="L87" class="LineNr">87 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">121/y</span> +<span id="L85" class="LineNr">85 </span> sink:&:sink:char, writer:num/routine <span class="Special"><-</span> <a href='088file.mu.html#L105'>start-writing</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[a]</span> +<span id="L86" class="LineNr">86 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">120/x</span> +<span id="L87" class="LineNr">87 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">121/y</span> <span id="L88" class="LineNr">88 </span> close sink <span id="L89" class="LineNr">89 </span> wait-for-routine writer -<span id="L90" class="LineNr">90 </span> contents-read-back:text <span class="Special"><-</span> slurp resources, <span class="Constant">[a]</span> +<span id="L90" class="LineNr">90 </span> contents-read-back:text <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[a]</span> <span id="L91" class="LineNr">91 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal contents-read-back, <span class="Constant">[xy]</span> -<span id="L92" class="LineNr">92 </span> other-file-contents:text <span class="Special"><-</span> slurp resources, <span class="Constant">[b]</span> +<span id="L92" class="LineNr">92 </span> other-file-contents:text <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[b]</span> <span id="L93" class="LineNr">93 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal other-file-contents, <span class="Constant">[bcd</span> <span id="L94" class="LineNr">94 </span><span class="Constant">]</span> <span id="L95" class="LineNr">95 </span> memory-should-contain [ diff --git a/html/091socket.cc.html b/html/091socket.cc.html index 75fbb8da..482a8b88 100644 --- a/html/091socket.cc.html +++ b/html/091socket.cc.html @@ -71,36 +71,36 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L14" class="LineNr"> 14 </span>_OPEN_CLIENT_SOCKET<span class="Delimiter">,</span> <span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L16" class="LineNr"> 16 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-client-socket"</span><span class="Delimiter">,</span> _OPEN_CLIENT_SOCKET<span class="Delimiter">);</span> +<span id="L16" class="LineNr"> 16 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-client-socket"</span><span class="Delimiter">,</span> _OPEN_CLIENT_SOCKET<span class="Delimiter">);</span> <span id="L17" class="LineNr"> 17 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L18" class="LineNr"> 18 </span><span class="Normal">case</span> _OPEN_CLIENT_SOCKET: <span class="Delimiter">{</span> -<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> -<span id="L20" class="LineNr"> 20 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-client-socket' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L19" class="LineNr"> 19 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L20" class="LineNr"> 20 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-client-socket' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L21" class="LineNr"> 21 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L22" class="LineNr"> 22 </span> <span class="Delimiter">}</span> <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> -<span id="L24" class="LineNr"> 24 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-client-socket' should be text (the hostname), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L24" class="LineNr"> 24 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-client-socket' should be text (the hostname), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L25" class="LineNr"> 25 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L26" class="LineNr"> 26 </span> <span class="Delimiter">}</span> <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> -<span id="L28" class="LineNr"> 28 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of '$open-client-socket' should be a number (the port of the hostname to connect to), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L28" class="LineNr"> 28 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of '$open-client-socket' should be a number (the port of the hostname to connect to), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L29" class="LineNr"> 29 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L30" class="LineNr"> 30 </span> <span class="Delimiter">}</span> -<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> -<span id="L32" class="LineNr"> 32 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-client-socket' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L31" class="LineNr"> 31 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L32" class="LineNr"> 32 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-client-socket' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L33" class="LineNr"> 33 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L34" class="LineNr"> 34 </span> <span class="Delimiter">}</span> <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> -<span id="L36" class="LineNr"> 36 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-client-socket' should be a number (socket handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L36" class="LineNr"> 36 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-client-socket' should be a number (socket handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L37" class="LineNr"> 37 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L38" class="LineNr"> 38 </span> <span class="Delimiter">}</span> <span id="L39" class="LineNr"> 39 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L40" class="LineNr"> 40 </span><span class="Delimiter">}</span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L42" class="LineNr"> 42 </span><span class="Normal">case</span> _OPEN_CLIENT_SOCKET: <span class="Delimiter">{</span> -<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> +<span id="L43" class="LineNr"> 43 </span> string host = <a href='038new_text.cc.html#L143'>read_mu_text</a><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 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> -<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> +<span id="L45" class="LineNr"> 45 </span> socket_t* client = <a href='091socket.cc.html#L57'>client_socket</a><span class="Delimiter">(</span>host<span class="Delimiter">,</span> port<span class="Delimiter">);</span> <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> <span id="L47" class="LineNr"> 47 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>client<span class="Delimiter">-></span>fd < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// error</span> <span id="L48" class="LineNr"> 48 </span> <span class="Normal">delete</span> client<span class="Delimiter">;</span> @@ -112,11 +112,11 @@ if ('onhashchange' in window) { <span id="L54" class="LineNr"> 54 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L55" class="LineNr"> 55 </span><span class="Delimiter">}</span> <span id="L56" class="LineNr"> 56 </span><span class="Delimiter">:(code)</span> -<span id="L57" class="LineNr"> 57 </span>socket_t* client_socket<span class="Delimiter">(</span><span class="Normal">const</span> string& host<span class="Delimiter">,</span> <span class="Normal">int</span> port<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L57" class="LineNr"> 57 </span>socket_t* <a href='091socket.cc.html#L57'>client_socket</a><span class="Delimiter">(</span><span class="Normal">const</span> string& host<span class="Delimiter">,</span> <span class="Normal">int</span> port<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L58" class="LineNr"> 58 </span> socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span> <span id="L59" class="LineNr"> 59 </span> result<span class="Delimiter">-></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 id="L60" class="LineNr"> 60 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">-></span>fd < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L61" class="LineNr"> 61 </span> raise << <span class="Constant">"Failed to create socket.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L61" class="LineNr"> 61 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"Failed to create socket.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L62" class="LineNr"> 62 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L63" class="LineNr"> 63 </span> <span class="Delimiter">}</span> <span id="L64" class="LineNr"> 64 </span> result<span class="Delimiter">-></span>addr<span class="Delimiter">.</span>sin_family = AF_INET<span class="Delimiter">;</span> @@ -126,7 +126,7 @@ if ('onhashchange' in window) { <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">-></span>fd<span class="Delimiter">,</span> <span class="Normal">reinterpret_cast</span><sockaddr*><span class="Delimiter">(</span>&result<span class="Delimiter">-></span>addr<span class="Delimiter">),</span> <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-></span>addr<span class="Delimiter">))</span> < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L69" class="LineNr"> 69 </span> close<span class="Delimiter">(</span>result<span class="Delimiter">-></span>fd<span class="Delimiter">);</span> <span id="L70" class="LineNr"> 70 </span> result<span class="Delimiter">-></span>fd = -<span class="Constant">1</span><span class="Delimiter">;</span> -<span id="L71" class="LineNr"> 71 </span> raise << <span class="Constant">"Failed to connect to "</span> << host << <span class="Constant">':'</span> << port << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L71" class="LineNr"> 71 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"Failed to connect to "</span> << host << <span class="Constant">':'</span> << port << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L72" class="LineNr"> 72 </span> <span class="Delimiter">}</span> <span id="L73" class="LineNr"> 73 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L74" class="LineNr"> 74 </span><span class="Delimiter">}</span> @@ -134,23 +134,23 @@ if ('onhashchange' in window) { <span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L77" class="LineNr"> 77 </span>_OPEN_SERVER_SOCKET<span class="Delimiter">,</span> <span id="L78" class="LineNr"> 78 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L79" class="LineNr"> 79 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-server-socket"</span><span class="Delimiter">,</span> _OPEN_SERVER_SOCKET<span class="Delimiter">);</span> +<span id="L79" class="LineNr"> 79 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$open-server-socket"</span><span class="Delimiter">,</span> _OPEN_SERVER_SOCKET<span class="Delimiter">);</span> <span id="L80" class="LineNr"> 80 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L81" class="LineNr"> 81 </span><span class="Normal">case</span> _OPEN_SERVER_SOCKET: <span class="Delimiter">{</span> -<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> -<span id="L83" class="LineNr"> 83 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-server-socket' requires exactly one ingredient (the port to listen for requests on), but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L82" class="LineNr"> 82 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L83" class="LineNr"> 83 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-server-socket' requires exactly one ingredient (the port to listen for requests on), but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L84" class="LineNr"> 84 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L85" class="LineNr"> 85 </span> <span class="Delimiter">}</span> <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> -<span id="L87" class="LineNr"> 87 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-server-socket' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L87" class="LineNr"> 87 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$open-server-socket' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L88" class="LineNr"> 88 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">}</span> -<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> -<span id="L91" class="LineNr"> 91 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-server-socket' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L90" class="LineNr"> 90 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L91" class="LineNr"> 91 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$open-server-socket' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L92" class="LineNr"> 92 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">}</span> <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> -<span id="L95" class="LineNr"> 95 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-server-socket' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L95" class="LineNr"> 95 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$open-server-socket' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L96" class="LineNr"> 96 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L97" class="LineNr"> 97 </span> <span class="Delimiter">}</span> <span id="L98" class="LineNr"> 98 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -158,7 +158,7 @@ if ('onhashchange' in window) { <span id="L100" class="LineNr">100 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L101" class="LineNr">101 </span><span class="Normal">case</span> _OPEN_SERVER_SOCKET: <span class="Delimiter">{</span> <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> -<span id="L103" class="LineNr">103 </span> socket_t* server = server_socket<span class="Delimiter">(</span>port<span class="Delimiter">);</span> +<span id="L103" class="LineNr">103 </span> socket_t* server = <a href='091socket.cc.html#L115'>server_socket</a><span class="Delimiter">(</span>port<span class="Delimiter">);</span> <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> <span id="L105" class="LineNr">105 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">-></span>fd < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L106" class="LineNr">106 </span> <span class="Normal">delete</span> server<span class="Delimiter">;</span> @@ -170,11 +170,11 @@ if ('onhashchange' in window) { <span id="L112" class="LineNr">112 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L113" class="LineNr">113 </span><span class="Delimiter">}</span> <span id="L114" class="LineNr">114 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L115" class="LineNr">115 </span>socket_t* <a href='091socket.cc.html#L115'>server_socket</a><span class="Delimiter">(</span><span class="Normal">int</span> port<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L116" class="LineNr">116 </span> socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span> <span id="L117" class="LineNr">117 </span> result<span class="Delimiter">-></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 id="L118" class="LineNr">118 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">-></span>fd < <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L119" class="LineNr">119 </span> raise << <span class="Constant">"Failed to create server socket.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"Failed to create server socket.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L120" class="LineNr">120 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L121" class="LineNr">121 </span> <span class="Delimiter">}</span> <span id="L122" class="LineNr">122 </span> <span class="Normal">int</span> dummy = <span class="Constant">0</span><span class="Delimiter">;</span> @@ -188,7 +188,7 @@ if ('onhashchange' in window) { <span id="L130" class="LineNr">130 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L131" class="LineNr">131 </span> close<span class="Delimiter">(</span>result<span class="Delimiter">-></span>fd<span class="Delimiter">);</span> <span id="L132" class="LineNr">132 </span> result<span class="Delimiter">-></span>fd = -<span class="Constant">1</span><span class="Delimiter">;</span> -<span id="L133" class="LineNr">133 </span> raise << <span class="Constant">"Failed to bind result socket to port "</span> << port << <span class="Constant">". Something's already using that port.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L133" class="LineNr">133 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"Failed to bind result socket to port "</span> << port << <span class="Constant">". Something's already using that port.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> <span id="L134" class="LineNr">134 </span> <span class="Delimiter">}</span> <span id="L135" class="LineNr">135 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L136" class="LineNr">136 </span><span class="Delimiter">}</span> @@ -196,23 +196,23 @@ if ('onhashchange' in window) { <span id="L138" class="LineNr">138 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L139" class="LineNr">139 </span>_ACCEPT<span class="Delimiter">,</span> <span id="L140" class="LineNr">140 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L141" class="LineNr">141 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$accept"</span><span class="Delimiter">,</span> _ACCEPT<span class="Delimiter">);</span> +<span id="L141" class="LineNr">141 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$accept"</span><span class="Delimiter">,</span> _ACCEPT<span class="Delimiter">);</span> <span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L143" class="LineNr">143 </span><span class="Normal">case</span> _ACCEPT: <span class="Delimiter">{</span> -<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> -<span id="L145" class="LineNr">145 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$accept' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L144" class="LineNr">144 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L145" class="LineNr">145 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$accept' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L146" class="LineNr">146 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L147" class="LineNr">147 </span> <span class="Delimiter">}</span> <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> -<span id="L149" class="LineNr">149 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$accept' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L149" class="LineNr">149 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$accept' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L150" class="LineNr">150 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L151" class="LineNr">151 </span> <span class="Delimiter">}</span> -<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> -<span id="L153" class="LineNr">153 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$accept' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L152" class="LineNr">152 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L153" class="LineNr">153 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$accept' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L154" class="LineNr">154 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L155" class="LineNr">155 </span> <span class="Delimiter">}</span> <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> -<span id="L157" class="LineNr">157 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$accept' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L157" class="LineNr">157 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$accept' should be a number (file handle), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L158" class="LineNr">158 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L159" class="LineNr">159 </span> <span class="Delimiter">}</span> <span id="L160" class="LineNr">160 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -224,7 +224,7 @@ if ('onhashchange' in window) { <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</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 id="L167" class="LineNr">167 </span> socket_t* server = <span class="Normal">reinterpret_cast</span><socket_t*><span class="Delimiter">(</span>x<span class="Delimiter">);</span> <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> -<span id="L169" class="LineNr">169 </span> socket_t* session = accept_session<span class="Delimiter">(</span>server<span class="Delimiter">);</span> +<span id="L169" class="LineNr">169 </span> socket_t* session = <a href='091socket.cc.html#L179'>accept_session</a><span class="Delimiter">(</span>server<span class="Delimiter">);</span> <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span>><span class="Delimiter">(</span>session<span class="Delimiter">);</span> <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><<span class="Normal">double</span>><span class="Delimiter">(</span>result<span class="Delimiter">));</span> <span id="L172" class="LineNr">172 </span> <span class="Delimiter">}</span> @@ -234,7 +234,7 @@ if ('onhashchange' in window) { <span id="L176" class="LineNr">176 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L177" class="LineNr">177 </span><span class="Delimiter">}</span> <span id="L178" class="LineNr">178 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L179" class="LineNr">179 </span>socket_t* <a href='091socket.cc.html#L179'>accept_session</a><span class="Delimiter">(</span>socket_t* server<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L180" class="LineNr">180 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>server<span class="Delimiter">-></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> <span id="L181" class="LineNr">181 </span> socket_t* result = <span class="Normal">new</span> socket_t<span class="Delimiter">;</span> <span id="L182" class="LineNr">182 </span> socklen_t dummy = <span class="Normal">sizeof</span><span class="Delimiter">(</span>result<span class="Delimiter">-></span>addr<span class="Delimiter">);</span> @@ -245,36 +245,36 @@ if ('onhashchange' in window) { <span id="L187" class="LineNr">187 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L188" class="LineNr">188 </span>_READ_FROM_SOCKET<span class="Delimiter">,</span> <span id="L189" class="LineNr">189 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L190" class="LineNr">190 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$read-from-socket"</span><span class="Delimiter">,</span> _READ_FROM_SOCKET<span class="Delimiter">);</span> +<span id="L190" class="LineNr">190 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$read-from-socket"</span><span class="Delimiter">,</span> _READ_FROM_SOCKET<span class="Delimiter">);</span> <span id="L191" class="LineNr">191 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L192" class="LineNr">192 </span><span class="Normal">case</span> _READ_FROM_SOCKET: <span class="Delimiter">{</span> -<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> -<span id="L194" class="LineNr">194 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-socket' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L193" class="LineNr">193 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L194" class="LineNr">194 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-socket' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L195" class="LineNr">195 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L196" class="LineNr">196 </span> <span class="Delimiter">}</span> <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> -<span id="L198" class="LineNr">198 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$read-from-socket' should be a number (socket), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L198" class="LineNr">198 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$read-from-socket' should be a number (socket), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L199" class="LineNr">199 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L200" class="LineNr">200 </span> <span class="Delimiter">}</span> -<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> +<span id="L201" class="LineNr">201 </span> <span class="Normal">int</span> nprod = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> <span id="L202" class="LineNr">202 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>nprod == <span class="Constant">0</span> || nprod > <span class="Constant">4</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L203" class="LineNr">203 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-socket' requires 1-4 products, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L203" class="LineNr">203 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$read-from-socket' requires 1-4 products, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L204" class="LineNr">204 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L205" class="LineNr">205 </span> <span class="Delimiter">}</span> <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> -<span id="L207" class="LineNr">207 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$read-from-socket' should be a character, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L207" class="LineNr">207 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first product of '$read-from-socket' should be a character, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L208" class="LineNr">208 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L209" class="LineNr">209 </span> <span class="Delimiter">}</span> <span id="L210" class="LineNr">210 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>nprod > <span class="Constant">1</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> -<span id="L211" class="LineNr">211 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second product of '$read-from-socket' should be a boolean (data received?), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L211" class="LineNr">211 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second product of '$read-from-socket' should be a boolean (data received?), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L212" class="LineNr">212 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L213" class="LineNr">213 </span> <span class="Delimiter">}</span> <span id="L214" class="LineNr">214 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>nprod > <span class="Constant">2</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">2</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L215" class="LineNr">215 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"third product of '$read-from-socket' should be a boolean (eof?), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"third product of '$read-from-socket' should be a boolean (eof?), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L216" class="LineNr">216 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L217" class="LineNr">217 </span> <span class="Delimiter">}</span> <span id="L218" class="LineNr">218 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>nprod > <span class="Constant">3</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">3</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L219" class="LineNr">219 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"fourth product of '$read-from-socket' should be a number (error code), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L219" class="LineNr">219 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"fourth product of '$read-from-socket' should be a number (error code), but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L220" class="LineNr">220 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L221" class="LineNr">221 </span> <span class="Delimiter">}</span> <span id="L222" class="LineNr">222 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -310,7 +310,7 @@ if ('onhashchange' in window) { <span id="L252" class="LineNr">252 </span> <span class="Delimiter">}</span> <span id="L253" class="LineNr">253 </span> <span class="Normal">else</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> <span id="L254" class="LineNr">254 </span> <span class="Normal">int</span> error_code = errno<span class="Delimiter">;</span> -<span id="L255" class="LineNr">255 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"error in $read-from-socket</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L255" class="LineNr">255 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"error in $read-from-socket</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <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> <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> <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> @@ -338,11 +338,11 @@ if ('onhashchange' in window) { <span id="L280" class="LineNr">280 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L281" class="LineNr">281 </span>_WRITE_TO_SOCKET<span class="Delimiter">,</span> <span id="L282" class="LineNr">282 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L283" class="LineNr">283 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$write-to-socket"</span><span class="Delimiter">,</span> _WRITE_TO_SOCKET<span class="Delimiter">);</span> +<span id="L283" class="LineNr">283 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$write-to-socket"</span><span class="Delimiter">,</span> _WRITE_TO_SOCKET<span class="Delimiter">);</span> <span id="L284" class="LineNr">284 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L285" class="LineNr">285 </span><span class="Normal">case</span> _WRITE_TO_SOCKET: <span class="Delimiter">{</span> -<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> -<span id="L287" class="LineNr">287 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$write-to-socket' requires exactly two ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L286" class="LineNr">286 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L287" class="LineNr">287 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$write-to-socket' requires exactly two ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L288" class="LineNr">288 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L289" class="LineNr">289 </span> <span class="Delimiter">}</span> <span id="L290" class="LineNr">290 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -355,7 +355,7 @@ if ('onhashchange' in window) { <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><<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</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 id="L298" class="LineNr">298 </span> <span class="Normal">char</span> c = <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>y<span class="Delimiter">);</span> <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">-></span>fd<span class="Delimiter">,</span> &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> -<span id="L300" class="LineNr">300 </span> raise << maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"failed to write to socket</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L300" class="LineNr">300 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"failed to write to socket</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L301" class="LineNr">301 </span> exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L302" class="LineNr">302 </span> <span class="Delimiter">}</span> <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> @@ -366,23 +366,23 @@ if ('onhashchange' in window) { <span id="L308" class="LineNr">308 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L309" class="LineNr">309 </span>_CLOSE_SOCKET<span class="Delimiter">,</span> <span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L311" class="LineNr">311 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$close-socket"</span><span class="Delimiter">,</span> _CLOSE_SOCKET<span class="Delimiter">);</span> +<span id="L311" class="LineNr">311 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$close-socket"</span><span class="Delimiter">,</span> _CLOSE_SOCKET<span class="Delimiter">);</span> <span id="L312" class="LineNr">312 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L313" class="LineNr">313 </span><span class="Normal">case</span> _CLOSE_SOCKET: <span class="Delimiter">{</span> -<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> -<span id="L315" class="LineNr">315 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-socket' requires exactly two ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L314" class="LineNr">314 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L315" class="LineNr">315 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-socket' requires exactly two ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L316" class="LineNr">316 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L317" class="LineNr">317 </span> <span class="Delimiter">}</span> <span id="L318" class="LineNr">318 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L319" class="LineNr">319 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$close-socket' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L319" class="LineNr">319 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of '$close-socket' should be a number, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L320" class="LineNr">320 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L321" class="LineNr">321 </span> <span class="Delimiter">}</span> -<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> -<span id="L323" class="LineNr">323 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-socket' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L322" class="LineNr">322 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L323" class="LineNr">323 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'$close-socket' requires exactly one product, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L324" class="LineNr">324 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L325" class="LineNr">325 </span> <span class="Delimiter">}</span> <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> -<span id="L327" class="LineNr">327 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of '$close-socket' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L327" class="LineNr">327 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of '$close-socket' must be first ingredient '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"', but got '"</span> << inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L328" class="LineNr">328 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L329" class="LineNr">329 </span> <span class="Delimiter">}</span> <span id="L330" class="LineNr">330 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> diff --git a/html/092socket.mu.html b/html/092socket.mu.html index 7c57c72a..a578d166 100644 --- a/html/092socket.mu.html +++ b/html/092socket.mu.html @@ -65,15 +65,15 @@ if ('onhashchange' in window) { <span id="L7" class="LineNr"> 7 </span> <span class="Comment"># that way repeatedly running the test will give ports time to timeout and</span> <span id="L8" class="LineNr"> 8 </span> <span class="Comment"># close before reusing them</span> <span id="L9" class="LineNr"> 9 </span> make-random-nondeterministic -<span id="L10" class="LineNr"> 10 </span> port:num <span class="Special"><-</span> random-in-range <span class="Constant">0/real-random-numbers</span>,<span class="Constant"> 8000</span>,<span class="Constant"> 8100</span> +<span id="L10" class="LineNr"> 10 </span> port:num <span class="Special"><-</span> <a href='068random.mu.html#L57'>random-in-range</a> <span class="Constant">0/real-random-numbers</span>,<span class="Constant"> 8000</span>,<span class="Constant"> 8100</span> <span id="L11" class="LineNr"> 11 </span> run [ <span id="L12" class="LineNr"> 12 </span> socket:num <span class="Special"><-</span> $open-server-socket port <span id="L13" class="LineNr"> 13 </span> assert socket, <span class="Constant">[ </span> <span id="L14" class="LineNr"> 14 </span><span class="Constant">F - example-server-test: $open-server-socket failed]</span> -<span id="L15" class="LineNr"> 15 </span> handler-routine:number <span class="Special"><-</span> start-running serve-one-request socket, example-handler +<span id="L15" class="LineNr"> 15 </span> handler-routine:number <span class="Special"><-</span> start-running <a href='092socket.mu.html#L55'>serve-one-request</a> socket, <a href='092socket.mu.html#L26'>example-handler</a> <span id="L16" class="LineNr"> 16 </span> ] -<span id="L17" class="LineNr"> 17 </span> source:&:source:char <span class="Special"><-</span> start-reading-from-network <span class="Constant">0/real-resources</span>, <span class="Constant">[localhost/]</span>, port -<span id="L18" class="LineNr"> 18 </span> response:text <span class="Special"><-</span> drain source +<span id="L17" class="LineNr"> 17 </span> source:&:source:char <span class="Special"><-</span> <a href='092socket.mu.html#L69'>start-reading-from-network</a> <span class="Constant">0/real-resources</span>, <span class="Constant">[localhost/]</span>, port +<span id="L18" class="LineNr"> 18 </span> response:text <span class="Special"><-</span> <a href='075channel.mu.html#L487'>drain</a> source <span id="L19" class="LineNr"> 19 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *response <span id="L20" class="LineNr"> 20 </span> memory-should-contain [ <span id="L21" class="LineNr"> 21 </span> 10:array:character <span class="Special"><-</span> <span class="Constant">[abc]</span> @@ -81,7 +81,7 @@ if ('onhashchange' in window) { <span id="L23" class="LineNr"> 23 </span> socket <span class="Special"><-</span> $close-socket socket <span id="L24" class="LineNr"> 24 </span>] <span id="L25" class="LineNr"> 25 </span><span class="Comment"># helper just for this scenario</span> -<span id="L26" class="LineNr"> 26 </span><span class="muRecipe">def</span> example-handler query:text<span class="muRecipe"> -> </span>response:text [ +<span id="L26" class="LineNr"> 26 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L26'>example-handler</a> query:text<span class="muRecipe"> -> </span>response:text [ <span id="L27" class="LineNr"> 27 </span> <span class="Constant">local-scope</span> <span id="L28" class="LineNr"> 28 </span> <span class="Constant">load-ingredients</span> <span id="L29" class="LineNr"> 29 </span> <span class="muControl">return</span> <span class="Constant">[abc]</span> @@ -98,9 +98,9 @@ if ('onhashchange' in window) { <span id="L40" class="LineNr"> 40 </span> ] <span id="L41" class="LineNr"> 41 </span> ] <span id="L42" class="LineNr"> 42 </span> run [ -<span id="L43" class="LineNr"> 43 </span> source:&:source:char <span class="Special"><-</span> start-reading-from-network resources, <span class="Constant">[example.com/]</span> +<span id="L43" class="LineNr"> 43 </span> source:&:source:char <span class="Special"><-</span> <a href='092socket.mu.html#L69'>start-reading-from-network</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[example.com/]</span> <span id="L44" class="LineNr"> 44 </span> ] -<span id="L45" class="LineNr"> 45 </span> contents:text <span class="Special"><-</span> drain source +<span id="L45" class="LineNr"> 45 </span> contents:text <span class="Special"><-</span> <a href='075channel.mu.html#L487'>drain</a> source <span id="L46" class="LineNr"> 46 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *contents <span id="L47" class="LineNr"> 47 </span> memory-should-contain [ <span id="L48" class="LineNr"> 48 </span> 10:array:character <span class="Special"><-</span> <span class="Constant">[abc</span> @@ -110,21 +110,21 @@ if ('onhashchange' in window) { <span id="L52" class="LineNr"> 52 </span> <span id="L53" class="LineNr"> 53 </span><span class="muData">type</span> request-handler = (recipe text<span class="muRecipe"> -> </span>text) <span id="L54" class="LineNr"> 54 </span> -<span id="L55" class="LineNr"> 55 </span><span class="muRecipe">def</span> serve-one-request socket:num, request-handler:request-handler<span class="muRecipe"> -> </span>socket:num [ +<span id="L55" class="LineNr"> 55 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L55'>serve-one-request</a> socket:num, request-handler:request-handler<span class="muRecipe"> -> </span>socket:num [ <span id="L56" class="LineNr"> 56 </span> <span class="Constant">local-scope</span> <span id="L57" class="LineNr"> 57 </span> <span class="Constant">load-ingredients</span> <span id="L58" class="LineNr"> 58 </span> session:num <span class="Special"><-</span> $accept socket <span id="L59" class="LineNr"> 59 </span> assert session, <span class="Constant">[ </span> <span id="L60" class="LineNr"> 60 </span><span class="Constant">F - example-server-test: $accept failed]</span> -<span id="L61" class="LineNr"> 61 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel<span class="Constant"> 30</span> -<span id="L62" class="LineNr"> 62 </span> start-running receive-from-socket session, sink -<span id="L63" class="LineNr"> 63 </span> query:text <span class="Special"><-</span> drain contents +<span id="L61" class="LineNr"> 61 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a><span class="Constant"> 30</span> +<span id="L62" class="LineNr"> 62 </span> start-running <a href='092socket.mu.html#L104'>receive-from-socket</a> session, sink +<span id="L63" class="LineNr"> 63 </span> query:text <span class="Special"><-</span> <a href='075channel.mu.html#L487'>drain</a> contents <span id="L64" class="LineNr"> 64 </span> response:text <span class="Special"><-</span> call request-handler, query -<span id="L65" class="LineNr"> 65 </span> write-to-socket session, response +<span id="L65" class="LineNr"> 65 </span> <a href='092socket.mu.html#L132'>write-to-socket</a> session, response <span id="L66" class="LineNr"> 66 </span> session <span class="Special"><-</span> $close-socket session <span id="L67" class="LineNr"> 67 </span>] <span id="L68" class="LineNr"> 68 </span> -<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> start-reading-from-network resources:&:resources, uri:text<span class="muRecipe"> -> </span>contents:&:source:char [ +<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L69'>start-reading-from-network</a> <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, uri:text<span class="muRecipe"> -> </span>contents:&:source:char [ <span id="L70" class="LineNr"> 70 </span> <span class="Constant">local-scope</span> <span id="L71" class="LineNr"> 71 </span> <span class="Constant">load-ingredients</span> <span id="L72" class="LineNr"> 72 </span> <span class="Delimiter">{</span> @@ -133,25 +133,25 @@ if ('onhashchange' in window) { <span id="L75" class="LineNr"> 75 </span> port <span class="Special"><-</span> copy <span class="Constant">80/http-port</span> <span id="L76" class="LineNr"> 76 </span> <span class="Delimiter">}</span> <span id="L77" class="LineNr"> 77 </span> <span class="Delimiter">{</span> -<span id="L78" class="LineNr"> 78 </span> <span class="muControl">break-unless</span> resources +<span id="L78" class="LineNr"> 78 </span> <span class="muControl">break-unless</span> <a href='088file.mu.html#L11'>resources</a> <span id="L79" class="LineNr"> 79 </span> <span class="Comment"># fake network</span> -<span id="L80" class="LineNr"> 80 </span> contents <span class="Special"><-</span> start-reading-from-fake-resource resources, uri +<span id="L80" class="LineNr"> 80 </span> contents <span class="Special"><-</span> <a href='088file.mu.html#L53'>start-reading-from-fake-resource</a> <a href='088file.mu.html#L11'>resources</a>, uri <span id="L81" class="LineNr"> 81 </span> <span class="muControl">return</span> <span id="L82" class="LineNr"> 82 </span> <span class="Delimiter">}</span> <span id="L83" class="LineNr"> 83 </span> <span class="Comment"># real network</span> -<span id="L84" class="LineNr"> 84 </span> host:text, path:text <span class="Special"><-</span> split-at uri, <span class="Constant">47/slash</span> +<span id="L84" class="LineNr"> 84 </span> host:text, path:text <span class="Special"><-</span> <a href='092socket.mu.html#L148'>split-at</a> uri, <span class="Constant">47/slash</span> <span id="L85" class="LineNr"> 85 </span> socket:num <span class="Special"><-</span> $open-client-socket host, port <span id="L86" class="LineNr"> 86 </span> assert socket, <span class="Constant">[contents]</span> -<span id="L87" class="LineNr"> 87 </span> req:text <span class="Special"><-</span> interpolate <span class="Constant">[GET _ HTTP/1.1]</span>, path -<span id="L88" class="LineNr"> 88 </span> request-socket socket, req -<span id="L89" class="LineNr"> 89 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel<span class="Constant"> 10000</span> -<span id="L90" class="LineNr"> 90 </span> start-running receive-from-client-socket-and-close socket, sink +<span id="L87" class="LineNr"> 87 </span> req:text <span class="Special"><-</span> <a href='061text.mu.html#L506'>interpolate</a> <span class="Constant">[GET _ HTTP/1.1]</span>, path +<span id="L88" class="LineNr"> 88 </span> <a href='092socket.mu.html#L93'>request-socket</a> socket, req +<span id="L89" class="LineNr"> 89 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a><span class="Constant"> 10000</span> +<span id="L90" class="LineNr"> 90 </span> start-running <a href='092socket.mu.html#L125'>receive-from-client-socket-and-close</a> socket, sink <span id="L91" class="LineNr"> 91 </span>] <span id="L92" class="LineNr"> 92 </span> -<span id="L93" class="LineNr"> 93 </span><span class="muRecipe">def</span> request-socket socket:num, s:text<span class="muRecipe"> -> </span>socket:num [ +<span id="L93" class="LineNr"> 93 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L93'>request-socket</a> socket:num, s:text<span class="muRecipe"> -> </span>socket:num [ <span id="L94" class="LineNr"> 94 </span> <span class="Constant">local-scope</span> <span id="L95" class="LineNr"> 95 </span> <span class="Constant">load-ingredients</span> -<span id="L96" class="LineNr"> 96 </span> write-to-socket socket, s +<span id="L96" class="LineNr"> 96 </span> <a href='092socket.mu.html#L132'>write-to-socket</a> socket, s <span id="L97" class="LineNr"> 97 </span> $write-to-socket socket, <span class="Constant">13/cr</span> <span id="L98" class="LineNr"> 98 </span> $write-to-socket socket, <span class="Constant">10/lf</span> <span id="L99" class="LineNr"> 99 </span> <span class="Comment"># empty line to delimit request</span> @@ -159,7 +159,7 @@ if ('onhashchange' in window) { <span id="L101" class="LineNr">101 </span> $write-to-socket socket, <span class="Constant">10/lf</span> <span id="L102" class="LineNr">102 </span>] <span id="L103" class="LineNr">103 </span> -<span id="L104" class="LineNr">104 </span><span class="muRecipe">def</span> receive-from-socket socket:num, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char, socket:num [ +<span id="L104" class="LineNr">104 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L104'>receive-from-socket</a> socket:num, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char, socket:num [ <span id="L105" class="LineNr">105 </span> <span class="Constant">local-scope</span> <span id="L106" class="LineNr">106 </span> <span class="Constant">load-ingredients</span> <span id="L107" class="LineNr">107 </span> <span class="Delimiter">{</span> @@ -169,7 +169,7 @@ if ('onhashchange' in window) { <span id="L111" class="LineNr">111 </span> <span class="muControl">break-if</span> error <span id="L112" class="LineNr">112 </span> <span class="Delimiter">{</span> <span id="L113" class="LineNr">113 </span> <span class="muControl">break-unless</span> found? -<span id="L114" class="LineNr">114 </span> sink <span class="Special"><-</span> write sink, c +<span id="L114" class="LineNr">114 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, c <span id="L115" class="LineNr">115 </span> <span class="Delimiter">}</span> <span id="L116" class="LineNr">116 </span> <span class="Delimiter">{</span> <span id="L117" class="LineNr">117 </span> <span class="muControl">break-if</span> found? @@ -180,14 +180,14 @@ if ('onhashchange' in window) { <span id="L122" class="LineNr">122 </span> sink <span class="Special"><-</span> close sink <span id="L123" class="LineNr">123 </span>] <span id="L124" class="LineNr">124 </span> -<span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> receive-from-client-socket-and-close socket:num, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char, socket:num [ +<span id="L125" class="LineNr">125 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L125'>receive-from-client-socket-and-close</a> socket:num, sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char, socket:num [ <span id="L126" class="LineNr">126 </span> <span class="Constant">local-scope</span> <span id="L127" class="LineNr">127 </span> <span class="Constant">load-ingredients</span> -<span id="L128" class="LineNr">128 </span> sink <span class="Special"><-</span> receive-from-socket socket, sink +<span id="L128" class="LineNr">128 </span> sink <span class="Special"><-</span> <a href='092socket.mu.html#L104'>receive-from-socket</a> socket, sink <span id="L129" class="LineNr">129 </span> socket <span class="Special"><-</span> $close-socket socket <span id="L130" class="LineNr">130 </span>] <span id="L131" class="LineNr">131 </span> -<span id="L132" class="LineNr">132 </span><span class="muRecipe">def</span> write-to-socket socket:num, s:text [ +<span id="L132" class="LineNr">132 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L132'>write-to-socket</a> socket:num, s:text [ <span id="L133" class="LineNr">133 </span> <span class="Constant">local-scope</span> <span id="L134" class="LineNr">134 </span> <span class="Constant">load-ingredients</span> <span id="L135" class="LineNr">135 </span> len:num <span class="Special"><-</span> length *s @@ -203,7 +203,7 @@ if ('onhashchange' in window) { <span id="L145" class="LineNr">145 </span>] <span id="L146" class="LineNr">146 </span> <span id="L147" class="LineNr">147 </span><span class="Comment"># like split-first, but don't eat the delimiter</span> -<span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> split-at text:text, delim:char<span class="muRecipe"> -> </span>x:text, y:text [ +<span id="L148" class="LineNr">148 </span><span class="muRecipe">def</span> <a href='092socket.mu.html#L148'>split-at</a> text:text, delim:char<span class="muRecipe"> -> </span>x:text, y:text [ <span id="L149" class="LineNr">149 </span> <span class="Constant">local-scope</span> <span id="L150" class="LineNr">150 </span> <span class="Constant">load-ingredients</span> <span id="L151" class="LineNr">151 </span> <span class="Comment"># empty text? return empty texts</span> @@ -216,15 +216,15 @@ if ('onhashchange' in window) { <span id="L158" class="LineNr">158 </span> <span class="muControl">return</span> <span id="L159" class="LineNr">159 </span> <span class="Delimiter">}</span> <span id="L160" class="LineNr">160 </span> idx:num <span class="Special"><-</span> find-next text, delim,<span class="Constant"> 0</span> -<span id="L161" class="LineNr">161 </span> x:text <span class="Special"><-</span> copy-range text,<span class="Constant"> 0</span>, idx -<span id="L162" class="LineNr">162 </span> y:text <span class="Special"><-</span> copy-range text, idx, len +<span id="L161" class="LineNr">161 </span> x:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> text,<span class="Constant"> 0</span>, idx +<span id="L162" class="LineNr">162 </span> y:text <span class="Special"><-</span> <a href='061text.mu.html#L1279'>copy-range</a> text, idx, len <span id="L163" class="LineNr">163 </span>] <span id="L164" class="LineNr">164 </span> <span id="L165" class="LineNr">165 </span><span class="muScenario">scenario</span> text-split-at [ <span id="L166" class="LineNr">166 </span> <span class="Constant">local-scope</span> <span id="L167" class="LineNr">167 </span> x:text <span class="Special"><-</span> new <span class="Constant">[a/b]</span> <span id="L168" class="LineNr">168 </span> run [ -<span id="L169" class="LineNr">169 </span> y:text, z:text <span class="Special"><-</span> split-at x, <span class="Constant">47/slash</span> +<span id="L169" class="LineNr">169 </span> y:text, z:text <span class="Special"><-</span> <a href='092socket.mu.html#L148'>split-at</a> x, <span class="Constant">47/slash</span> <span id="L170" class="LineNr">170 </span> 10:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *y <span id="L171" class="LineNr">171 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *z <span id="L172" class="LineNr">172 </span> ] diff --git a/html/100trace_browser.cc.html b/html/100trace_browser.cc.html index fad9475e..815d3208 100644 --- a/html/100trace_browser.cc.html +++ b/html/100trace_browser.cc.html @@ -60,22 +60,22 @@ if ('onhashchange' in window) { <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L5" class="LineNr"> 5 </span>_BROWSE_TRACE<span class="Delimiter">,</span> <span id="L6" class="LineNr"> 6 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L7" class="LineNr"> 7 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$browse-trace"</span><span class="Delimiter">,</span> _BROWSE_TRACE<span class="Delimiter">);</span> +<span id="L7" class="LineNr"> 7 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$browse-trace"</span><span class="Delimiter">,</span> _BROWSE_TRACE<span class="Delimiter">);</span> <span id="L8" class="LineNr"> 8 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L9" class="LineNr"> 9 </span><span class="Normal">case</span> _BROWSE_TRACE: <span class="Delimiter">{</span> <span id="L10" class="LineNr"> 10 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L11" class="LineNr"> 11 </span><span class="Delimiter">}</span> <span id="L12" class="LineNr"> 12 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L13" class="LineNr"> 13 </span><span class="Normal">case</span> _BROWSE_TRACE: <span class="Delimiter">{</span> -<span id="L14" class="LineNr"> 14 </span> start_trace_browser<span class="Delimiter">();</span> +<span id="L14" class="LineNr"> 14 </span> <a href='100trace_browser.cc.html#L33'>start_trace_browser</a><span class="Delimiter">();</span> <span id="L15" class="LineNr"> 15 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L16" class="LineNr"> 16 </span><span class="Delimiter">}</span> <span id="L17" class="LineNr"> 17 </span> <span id="L18" class="LineNr"> 18 </span><span class="Comment">//: browse a trace loaded from a file</span> <span id="L19" class="LineNr"> 19 </span><span class="Delimiter">:(after "Commandline Parsing")</span> -<span id="L20" class="LineNr"> 20 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc == <span class="Constant">3</span> && is_equal<span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">"browse-trace"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L21" class="LineNr"> 21 </span> load_trace<span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">);</span> -<span id="L22" class="LineNr"> 22 </span> start_trace_browser<span class="Delimiter">();</span> +<span id="L20" class="LineNr"> 20 </span><span class="Normal">if</span> <span class="Delimiter">(</span>argc == <span class="Constant">3</span> && <a href='001help.cc.html#L70'>is_equal</a><span class="Delimiter">(</span>argv[<span class="Constant">1</span>]<span class="Delimiter">,</span> <span class="Constant">"browse-trace"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L21" class="LineNr"> 21 </span> <a href='100trace_browser.cc.html#L223'>load_trace</a><span class="Delimiter">(</span>argv[<span class="Constant">2</span>]<span class="Delimiter">);</span> +<span id="L22" class="LineNr"> 22 </span> <a href='100trace_browser.cc.html#L33'>start_trace_browser</a><span class="Delimiter">();</span> <span id="L23" class="LineNr"> 23 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L24" class="LineNr"> 24 </span><span class="Delimiter">}</span> <span id="L25" class="LineNr"> 25 </span> @@ -86,17 +86,17 @@ if ('onhashchange' in window) { <span id="L30" class="LineNr"> 30 </span>map<<span class="Normal">int</span><span class="Delimiter">,</span> <span class="Normal">int</span>> Trace_index<span class="Delimiter">;</span> <span class="Comment">// screen row -> trace index</span> <span id="L31" class="LineNr"> 31 </span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(code)</span> -<span id="L33" class="LineNr"> 33 </span><span class="Normal">void</span> start_trace_browser<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L33" class="LineNr"> 33 </span><span class="Normal">void</span> <a href='100trace_browser.cc.html#L33'>start_trace_browser</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> <span id="L35" class="LineNr"> 35 </span> cerr << <span class="Constant">"computing min depth to display</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> <span id="L36" class="LineNr"> 36 </span> <span class="Normal">int</span> min_depth = <span class="Constant">9999</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L38" class="LineNr"> 38 </span> trace_line& curr_line = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L39" class="LineNr"> 39 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth < min_depth<span class="Delimiter">)</span> min_depth = curr_line<span class="Delimiter">.</span>depth<span class="Delimiter">;</span> <span id="L40" class="LineNr"> 40 </span> <span class="Delimiter">}</span> <span id="L41" class="LineNr"> 41 </span> cerr << <span class="Constant">"min depth is "</span> << min_depth << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L42" class="LineNr"> 42 </span> cerr << <span class="Constant">"computing lines to display</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L44" class="LineNr"> 44 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>depth == min_depth<span class="Delimiter">)</span> <span id="L45" class="LineNr"> 45 </span> Visible<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span> @@ -104,9 +104,9 @@ if ('onhashchange' in window) { <span id="L48" class="LineNr"> 48 </span> Display_row = Display_column = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L49" class="LineNr"> 49 </span> tb_event event<span class="Delimiter">;</span> <span id="L50" class="LineNr"> 50 </span> Top_of_screen = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L51" class="LineNr"> 51 </span> refresh_screen_rows<span class="Delimiter">();</span> +<span id="L51" class="LineNr"> 51 </span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">();</span> <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> -<span id="L53" class="LineNr"> 53 </span> render<span class="Delimiter">();</span> +<span id="L53" class="LineNr"> 53 </span> <a href='100trace_browser.cc.html#L173'>render</a><span class="Delimiter">();</span> <span id="L54" class="LineNr"> 54 </span> <span class="Normal">do</span> <span class="Delimiter">{</span> <span id="L55" class="LineNr"> 55 </span> tb_poll_event<span class="Delimiter">(</span>&event<span class="Delimiter">);</span> <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> @@ -134,9 +134,9 @@ if ('onhashchange' in window) { <span id="L78" class="LineNr"> 78 </span> <span class="Delimiter">}</span> <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> <span id="L80" class="LineNr"> 80 </span> <span class="Comment">// page-down</span> -<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> +<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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span> <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> -<span id="L83" class="LineNr"> 83 </span> refresh_screen_rows<span class="Delimiter">();</span> +<span id="L83" class="LineNr"> 83 </span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">();</span> <span id="L84" class="LineNr"> 84 </span> <span class="Delimiter">}</span> <span id="L85" class="LineNr"> 85 </span> <span class="Delimiter">}</span> <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> @@ -148,21 +148,21 @@ if ('onhashchange' in window) { <span id="L92" class="LineNr"> 92 </span> --Top_of_screen<span class="Delimiter">;</span> <span id="L93" class="LineNr"> 93 </span> <span class="Delimiter">}</span> <span id="L94" class="LineNr"> 94 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen >= <span class="Constant">0</span><span class="Delimiter">)</span> -<span id="L95" class="LineNr"> 95 </span> refresh_screen_rows<span class="Delimiter">();</span> +<span id="L95" class="LineNr"> 95 </span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">();</span> <span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> <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> <span id="L98" class="LineNr"> 98 </span> <span class="Comment">// go to bottom of screen; largely like page-up, interestingly</span> -<span id="L99" class="LineNr"> 99 </span> Top_of_screen = SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span> +<span id="L99" class="LineNr"> 99 </span> Top_of_screen = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span> <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 > <span class="Constant">0</span> && Top_of_screen > <span class="Constant">0</span><span class="Delimiter">;</span> --screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L101" class="LineNr">101 </span> --Top_of_screen<span class="Delimiter">;</span> <span id="L102" class="LineNr">102 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Top_of_screen <= <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L103" class="LineNr">103 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>Top_of_screen > <span class="Constant">0</span> && !contains_key<span class="Delimiter">(</span>Visible<span class="Delimiter">,</span> Top_of_screen<span class="Delimiter">))</span> <span id="L104" class="LineNr">104 </span> --Top_of_screen<span class="Delimiter">;</span> <span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span> -<span id="L106" class="LineNr">106 </span> refresh_screen_rows<span class="Delimiter">();</span> +<span id="L106" class="LineNr">106 </span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">();</span> <span id="L107" class="LineNr">107 </span> <span class="Comment">// move cursor to bottom</span> <span id="L108" class="LineNr">108 </span> Display_row = Last_printed_row<span class="Delimiter">;</span> -<span id="L109" class="LineNr">109 </span> refresh_screen_rows<span class="Delimiter">();</span> +<span id="L109" class="LineNr">109 </span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">();</span> <span id="L110" class="LineNr">110 </span> <span class="Delimiter">}</span> <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> <span id="L112" class="LineNr">112 </span> <span class="Comment">// expand lines under current by one level</span> @@ -171,7 +171,7 @@ if ('onhashchange' in window) { <span id="L115" class="LineNr">115 </span> <span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L116" class="LineNr">116 </span> <span class="Comment">// simultaneously compute end_index and min_depth</span> <span id="L117" class="LineNr">117 </span> <span class="Normal">int</span> min_depth = <span class="Constant">9999</span><span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L120" class="LineNr">120 </span> trace_line& curr_line = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L121" class="LineNr">121 </span> assert<span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth > Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>start_index<span class="Delimiter">).</span>depth<span class="Delimiter">);</span> @@ -185,7 +185,7 @@ if ('onhashchange' in window) { <span id="L129" class="LineNr">129 </span> Visible<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span> <span id="L131" class="LineNr">131 </span> <span class="Delimiter">}</span> -<span id="L132" class="LineNr">132 </span> refresh_screen_rows<span class="Delimiter">();</span> +<span id="L132" class="LineNr">132 </span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">();</span> <span id="L133" class="LineNr">133 </span> <span class="Delimiter">}</span> <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> <span id="L135" class="LineNr">135 </span> <span class="Comment">// collapse all lines under current</span> @@ -194,7 +194,7 @@ if ('onhashchange' in window) { <span id="L138" class="LineNr">138 </span> <span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span> <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> <span id="L140" class="LineNr">140 </span> <span class="Normal">int</span> initial_depth = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>start_index<span class="Delimiter">).</span>depth<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L143" class="LineNr">143 </span> trace_line& curr_line = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L144" class="LineNr">144 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_line<span class="Delimiter">.</span>depth <= initial_depth<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -204,29 +204,29 @@ if ('onhashchange' in window) { <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 < end_index<span class="Delimiter">;</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L149" class="LineNr">149 </span> Visible<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>index<span class="Delimiter">);</span> <span id="L150" class="LineNr">150 </span> <span class="Delimiter">}</span> -<span id="L151" class="LineNr">151 </span> refresh_screen_rows<span class="Delimiter">();</span> +<span id="L151" class="LineNr">151 </span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">();</span> <span id="L152" class="LineNr">152 </span> <span class="Delimiter">}</span> <span id="L153" class="LineNr">153 </span> <span class="Delimiter">}</span> <span id="L154" class="LineNr">154 </span> tb_shutdown<span class="Delimiter">();</span> <span id="L155" class="LineNr">155 </span><span class="Delimiter">}</span> <span id="L156" class="LineNr">156 </span> <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> -<span id="L158" class="LineNr">158 </span><span class="Normal">void</span> refresh_screen_rows<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L158" class="LineNr">158 </span><span class="Normal">void</span> <a href='100trace_browser.cc.html#L158'>refresh_screen_rows</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> -<span id="L160" class="LineNr">160 </span> Trace_index<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<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 < tb_height<span class="Delimiter">()</span> && index < SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++screen_row<span class="Delimiter">,</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L160" class="LineNr">160 </span> Trace_index<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<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 < tb_height<span class="Delimiter">()</span> && index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">);</span> ++screen_row<span class="Delimiter">,</span> ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L162" class="LineNr">162 </span> <span class="Comment">// skip lines without depth for now</span> <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> <span id="L164" class="LineNr">164 </span> ++index<span class="Delimiter">;</span> -<span id="L165" class="LineNr">165 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>index >= SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">))</span> <span class="Identifier">goto</span> done<span class="Delimiter">;</span> +<span id="L165" class="LineNr">165 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>index >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">))</span> <span class="Identifier">goto</span> done<span class="Delimiter">;</span> <span id="L166" class="LineNr">166 </span> <span class="Delimiter">}</span> -<span id="L167" class="LineNr">167 </span> assert<span class="Delimiter">(</span>index < SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">));</span> -<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> +<span id="L167" class="LineNr">167 </span> assert<span class="Delimiter">(</span>index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">));</span> +<span id="L168" class="LineNr">168 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Trace_index<span class="Delimiter">,</span> screen_row<span class="Delimiter">,</span> index<span class="Delimiter">);</span> <span id="L169" class="LineNr">169 </span> <span class="Delimiter">}</span> <span id="L170" class="LineNr">170 </span><span class="Normal">done</span>:<span class="Delimiter">;</span> <span id="L171" class="LineNr">171 </span><span class="Delimiter">}</span> <span id="L172" class="LineNr">172 </span> -<span id="L173" class="LineNr">173 </span><span class="Normal">void</span> render<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L173" class="LineNr">173 </span><span class="Normal">void</span> <a href='100trace_browser.cc.html#L173'>render</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L174" class="LineNr">174 </span> <span class="Normal">int</span> screen_row = <span class="Constant">0</span><span class="Delimiter">;</span> <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 < tb_height<span class="Delimiter">();</span> ++screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> @@ -234,36 +234,36 @@ if ('onhashchange' in window) { <span id="L178" class="LineNr">178 </span> ostringstream out<span class="Delimiter">;</span> <span id="L179" class="LineNr">179 </span> out << std::setw<span class="Delimiter">(</span><span class="Constant">4</span><span class="Delimiter">)</span> << curr_line<span class="Delimiter">.</span>depth << <span class="Constant">' '</span> << curr_line<span class="Delimiter">.</span>label << <span class="Constant">": "</span> << curr_line<span class="Delimiter">.</span>contents<span class="Delimiter">;</span> <span id="L180" class="LineNr">180 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>screen_row < tb_height<span class="Delimiter">()</span>-<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> +<span id="L181" class="LineNr">181 </span> <span class="Normal">int</span> delta = <a href='100trace_browser.cc.html#L199'>lines_hidden</a><span class="Delimiter">(</span>screen_row<span class="Delimiter">);</span> <span id="L182" class="LineNr">182 </span> <span class="Comment">// home-brew escape sequence for red</span> <span id="L183" class="LineNr">183 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>delta > <span class="Constant">999</span><span class="Delimiter">)</span> out << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L184" class="LineNr">184 </span> out << <span class="Constant">" ("</span> << delta << <span class="Constant">")"</span><span class="Delimiter">;</span> <span id="L185" class="LineNr">185 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>delta > <span class="Constant">999</span><span class="Delimiter">)</span> out << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span> <span id="L186" class="LineNr">186 </span> <span class="Delimiter">}</span> -<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> +<span id="L187" class="LineNr">187 </span> <a href='100trace_browser.cc.html#L207'>render_line</a><span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> out<span class="Delimiter">.</span>str<span class="Delimiter">());</span> <span id="L188" class="LineNr">188 </span> <span class="Delimiter">}</span> <span id="L189" class="LineNr">189 </span> <span class="Comment">// clear rest of screen</span> <span id="L190" class="LineNr">190 </span> Last_printed_row = screen_row-<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L191" class="LineNr">191 </span> <span class="Normal">for</span> <span class="Delimiter">(;</span> screen_row < tb_height<span class="Delimiter">();</span> ++screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L192" class="LineNr">192 </span> render_line<span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> <span class="Constant">"~"</span><span class="Delimiter">);</span> +<span id="L192" class="LineNr">192 </span> <a href='100trace_browser.cc.html#L207'>render_line</a><span class="Delimiter">(</span>screen_row<span class="Delimiter">,</span> <span class="Constant">"~"</span><span class="Delimiter">);</span> <span id="L193" class="LineNr">193 </span> <span class="Delimiter">}</span> <span id="L194" class="LineNr">194 </span> <span class="Comment">// move cursor back to display row at the end</span> <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> <span id="L196" class="LineNr">196 </span> tb_present<span class="Delimiter">();</span> <span id="L197" class="LineNr">197 </span><span class="Delimiter">}</span> <span id="L198" class="LineNr">198 </span> -<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> +<span id="L199" class="LineNr">199 </span><span class="Normal">int</span> <a href='100trace_browser.cc.html#L199'>lines_hidden</a><span class="Delimiter">(</span><span class="Normal">int</span> screen_row<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> -<span id="L202" class="LineNr">202 </span> <span class="Identifier">return</span> SIZE<span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></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 id="L202" class="LineNr">202 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Trace_stream<span class="Delimiter">-></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 id="L203" class="LineNr">203 </span> <span class="Normal">else</span> <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> <span id="L205" class="LineNr">205 </span><span class="Delimiter">}</span> <span id="L206" class="LineNr">206 </span> -<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& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L207" class="LineNr">207 </span><span class="Normal">void</span> <a href='100trace_browser.cc.html#L207'>render_line</a><span class="Delimiter">(</span><span class="Normal">int</span> screen_row<span class="Delimiter">,</span> <span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L208" class="LineNr">208 </span> <span class="Normal">int</span> col = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L209" class="LineNr">209 </span> <span class="Normal">int</span> color = TB_WHITE<span class="Delimiter">;</span> -<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 < tb_width<span class="Delimiter">()</span> && col < SIZE<span class="Delimiter">(</span>s<span class="Delimiter">);</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < tb_width<span class="Delimiter">()</span> && col < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">);</span> ++col<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <span id="L213" class="LineNr">213 </span> <span class="Comment">// escapes. hack: can't start a line with them.</span> @@ -276,14 +276,14 @@ if ('onhashchange' in window) { <span id="L220" class="LineNr">220 </span> <span class="Delimiter">}</span> <span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span> <span id="L222" class="LineNr">222 </span> -<span id="L223" class="LineNr">223 </span><span class="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> +<span id="L223" class="LineNr">223 </span><span class="Normal">void</span> <a href='100trace_browser.cc.html#L223'>load_trace</a><span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">char</span>* filename<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L224" class="LineNr">224 </span> ifstream tin<span class="Delimiter">(</span>filename<span class="Delimiter">);</span> <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> <span id="L226" class="LineNr">226 </span> cerr << <span class="Constant">"no such file: "</span> << filename << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L227" class="LineNr">227 </span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L228" class="LineNr">228 </span> <span class="Delimiter">}</span> <span id="L229" class="LineNr">229 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> -<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> +<span id="L230" class="LineNr">230 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>tin<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L231" class="LineNr">231 </span> tin >> std::noskipws<span class="Delimiter">;</span> <span id="L232" class="LineNr">232 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>tin<span class="Delimiter">);</span> <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> @@ -296,7 +296,7 @@ if ('onhashchange' in window) { <span id="L240" class="LineNr">240 </span> tin >> depth<span class="Delimiter">;</span> <span id="L241" class="LineNr">241 </span> string label<span class="Delimiter">;</span> <span id="L242" class="LineNr">242 </span> tin >> label<span class="Delimiter">;</span> -<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> +<span id="L243" class="LineNr">243 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*--label<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><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><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> <span id="L244" class="LineNr">244 </span> string line<span class="Delimiter">;</span> <span id="L245" class="LineNr">245 </span> getline<span class="Delimiter">(</span>tin<span class="Delimiter">,</span> line<span class="Delimiter">);</span> <span id="L246" class="LineNr">246 </span> Trace_stream<span class="Delimiter">-></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> diff --git a/html/101run_sandboxed.cc.html b/html/101run_sandboxed.cc.html index 8152a5e4..047418bf 100644 --- a/html/101run_sandboxed.cc.html +++ b/html/101run_sandboxed.cc.html @@ -62,7 +62,7 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span><span class="Comment">//: return some result in text form.</span> <span id="L3" class="LineNr"> 3 </span> <span id="L4" class="LineNr"> 4 </span><span class="Delimiter">:(scenario run_interactive_code)</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L6" class="LineNr"> 6 </span> <span class="Constant">1</span>:num/<span class="Special">raw <- </span>copy <span class="Constant">0</span> <span id="L7" class="LineNr"> 7 </span> <span class="Constant">2</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [<span class="Constant">1</span>:num/<span class="Special">raw <- </span>copy <span class="Constant">34</span>] <span id="L8" class="LineNr"> 8 </span> run-sandboxed <span class="Constant">2</span>:text @@ -71,7 +71,7 @@ if ('onhashchange' in window) { <span id="L11" class="LineNr"> 11 </span><span class="traceContains">+mem: storing 34 in location 3</span> <span id="L12" class="LineNr"> 12 </span> <span id="L13" class="LineNr"> 13 </span><span class="Delimiter">:(scenario run_interactive_empty)</span> -<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> main [ +<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L15" class="LineNr"> 15 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe <span id="L16" class="LineNr"> 16 </span> <span class="Constant">2</span>:text<span class="Special"> <- </span>run-sandboxed <span class="Constant">1</span>:text <span id="L17" class="LineNr"> 17 </span>] @@ -85,7 +85,7 @@ if ('onhashchange' in window) { <span id="L25" class="LineNr"> 25 </span><span class="Comment">//: for starters, users can't override 'main' when the environment is running</span> <span id="L26" class="LineNr"> 26 </span><span class="Delimiter">:(before "End Load Recipe Name")</span> <span id="L27" class="LineNr"> 27 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Sandbox_mode && result<span class="Delimiter">.</span>name == <span class="Constant">"main"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L28" class="LineNr"> 28 </span> slurp_balanced_bracket<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L28" class="LineNr"> 28 </span> <a href='016dilated_reagent.cc.html#L57'>slurp_balanced_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span id="L29" class="LineNr"> 29 </span> <span class="Identifier">return</span> -<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L30" class="LineNr"> 30 </span><span class="Delimiter">}</span> <span id="L31" class="LineNr"> 31 </span> @@ -97,30 +97,30 @@ if ('onhashchange' in window) { <span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L38" class="LineNr"> 38 </span>RUN_SANDBOXED<span class="Delimiter">,</span> <span id="L39" class="LineNr"> 39 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L40" class="LineNr"> 40 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"run-sandboxed"</span><span class="Delimiter">,</span> RUN_SANDBOXED<span class="Delimiter">);</span> +<span id="L40" class="LineNr"> 40 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"run-sandboxed"</span><span class="Delimiter">,</span> RUN_SANDBOXED<span class="Delimiter">);</span> <span id="L41" class="LineNr"> 41 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L42" class="LineNr"> 42 </span><span class="Normal">case</span> RUN_SANDBOXED: <span class="Delimiter">{</span> -<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> -<span id="L44" class="LineNr"> 44 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'run-sandboxed' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L43" class="LineNr"> 43 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L44" class="LineNr"> 44 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'run-sandboxed' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L45" class="LineNr"> 45 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L46" class="LineNr"> 46 </span> <span class="Delimiter">}</span> <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> -<span id="L48" class="LineNr"> 48 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'run-sandboxed' should be a string, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L48" class="LineNr"> 48 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'run-sandboxed' should be a string, but got '"</span> << 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> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L49" class="LineNr"> 49 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L50" class="LineNr"> 50 </span> <span class="Delimiter">}</span> <span id="L51" class="LineNr"> 51 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L52" class="LineNr"> 52 </span><span class="Delimiter">}</span> <span id="L53" class="LineNr"> 53 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L54" class="LineNr"> 54 </span><span class="Normal">case</span> RUN_SANDBOXED: <span class="Delimiter">{</span> -<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> +<span id="L55" class="LineNr"> 55 </span> <span class="Normal">bool</span> new_code_pushed_to_stack = <a href='101run_sandboxed.cc.html#L90'>run_interactive</a><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 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> <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> <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> -<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> +<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><a href='101run_sandboxed.cc.html#L421'>trace_error_contents</a><span class="Delimiter">());</span> <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> -<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> +<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><a href='101run_sandboxed.cc.html#L435'>trace_app_contents</a><span class="Delimiter">());</span> <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> -<span id="L63" class="LineNr"> 63 </span> run_code_end<span class="Delimiter">();</span> +<span id="L63" class="LineNr"> 63 </span> <a href='101run_sandboxed.cc.html#L151'>run_code_end</a><span class="Delimiter">();</span> <span id="L64" class="LineNr"> 64 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// done with this instruction</span> <span id="L65" class="LineNr"> 65 </span> <span class="Delimiter">}</span> <span id="L66" class="LineNr"> 66 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> @@ -147,7 +147,7 @@ if ('onhashchange' in window) { <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> <span id="L88" class="LineNr"> 88 </span><span class="Comment">// all errors.</span> <span id="L89" class="LineNr"> 89 </span><span class="Comment">// returns true if successfully called (no errors found during load and transform)</span> -<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> +<span id="L90" class="LineNr"> 90 </span><span class="Normal">bool</span> <a href='101run_sandboxed.cc.html#L90'>run_interactive</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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">"interactive"</span><span class="Delimiter">)</span> && get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"interactive"</span><span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L92" class="LineNr"> 92 </span> <span class="Comment">// try to sandbox the run as best you can</span> <span id="L93" class="LineNr"> 93 </span> <span class="Comment">// todo: test this</span> @@ -155,9 +155,9 @@ if ('onhashchange' in window) { <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 < Reserved_for_tests<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span id="L96" class="LineNr"> 96 </span> Memory<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L97" class="LineNr"> 97 </span> <span class="Delimiter">}</span> -<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> -<span id="L99" class="LineNr"> 99 </span> Name[get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"interactive"</span><span class="Delimiter">)</span>]<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> -<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> +<span id="L98" class="LineNr"> 98 </span> string command = <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span><a href='101run_sandboxed.cc.html#L400'>strip_comments</a><span class="Delimiter">(</span><a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">)));</span> +<span id="L99" class="LineNr"> 99 </span> Name[get<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"interactive"</span><span class="Delimiter">)</span>]<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L100" class="LineNr">100 </span> <a href='101run_sandboxed.cc.html#L140'>run_code_begin</a><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 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> <span id="L102" class="LineNr">102 </span> <span class="Comment">// don't kill the current routine on parse errors</span> <span id="L103" class="LineNr">103 </span> routine* save_current_routine = Current_routine<span class="Delimiter">;</span> @@ -171,14 +171,14 @@ if ('onhashchange' in window) { <span id="L111" class="LineNr">111 </span> <span class="Constant">"$stop-tracking-products</span><span class="cSpecial">\n</span><span class="Constant">"</span> + <span id="L112" class="LineNr">112 </span> <span class="Constant">"return screen</span><span class="cSpecial">\n</span><span class="Constant">"</span> + <span id="L113" class="LineNr">113 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L114" class="LineNr">114 </span> transform_all<span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> <span id="L115" class="LineNr">115 </span> Current_routine = save_current_routine<span class="Delimiter">;</span> <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">"error"</span><span class="Delimiter">)</span> > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L117" class="LineNr">117 </span> <span class="Comment">// now call 'sandbox' which will run 'interactive' in a separate routine,</span> <span id="L118" class="LineNr">118 </span> <span class="Comment">// and wait for it</span> <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> <span id="L120" class="LineNr">120 </span> ++Save_trace_stream<span class="Delimiter">-></span>callstack_depth<span class="Delimiter">;</span> -<span id="L121" class="LineNr">121 </span> trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"run-sandboxed: incrementing callstack depth to "</span> << Save_trace_stream<span class="Delimiter">-></span>callstack_depth << end<span class="Delimiter">();</span> +<span id="L121" class="LineNr">121 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"trace"</span><span class="Delimiter">)</span> << <span class="Constant">"run-sandboxed: incrementing callstack depth to "</span> << Save_trace_stream<span class="Delimiter">-></span>callstack_depth << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L122" class="LineNr">122 </span> assert<span class="Delimiter">(</span>Save_trace_stream<span class="Delimiter">-></span>callstack_depth < <span class="Constant">9000</span><span class="Delimiter">);</span> <span class="Comment">// 9998-101 plus cushion</span> <span id="L123" class="LineNr">123 </span> <span class="Delimiter">}</span> <span id="L124" class="LineNr">124 </span> Current_routine<span class="Delimiter">-></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">"sandbox"</span><span class="Delimiter">)));</span> @@ -197,18 +197,18 @@ if ('onhashchange' in window) { <span id="L137" class="LineNr">137 </span>map<string<span class="Delimiter">,</span> type_tree*> Type_abbreviations_snapshot_stash<span class="Delimiter">;</span> <span id="L138" class="LineNr">138 </span> <span id="L139" class="LineNr">139 </span><span class="Delimiter">:(code)</span> -<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> +<span id="L140" class="LineNr">140 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L140'>run_code_begin</a><span class="Delimiter">(</span><span class="Normal">bool</span> should_stash_snapshots<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L141" class="LineNr">141 </span> <span class="Comment">// stuff to undo later, in run_code_end()</span> <span id="L142" class="LineNr">142 </span> Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L143" class="LineNr">143 </span> Disable_redefine_checks = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L144" class="LineNr">144 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>should_stash_snapshots<span class="Delimiter">)</span> -<span id="L145" class="LineNr">145 </span> stash_snapshots<span class="Delimiter">();</span> +<span id="L145" class="LineNr">145 </span> <a href='101run_sandboxed.cc.html#L167'>stash_snapshots</a><span class="Delimiter">();</span> <span id="L146" class="LineNr">146 </span> Save_trace_stream = Trace_stream<span class="Delimiter">;</span> <span id="L147" class="LineNr">147 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> <span id="L148" class="LineNr">148 </span> Trace_stream<span class="Delimiter">-></span>collect_depth = App_depth<span class="Delimiter">;</span> <span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span> <span id="L150" class="LineNr">150 </span> -<span id="L151" class="LineNr">151 </span><span class="Normal">void</span> run_code_end<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L151" class="LineNr">151 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L151'>run_code_end</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L152" class="LineNr">152 </span> Hide_errors = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L153" class="LineNr">153 </span> Disable_redefine_checks = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L154" class="LineNr">154 </span><span class="CommentedCode">//? ofstream fout("sandbox.log");</span> @@ -217,14 +217,14 @@ if ('onhashchange' in window) { <span id="L157" class="LineNr">157 </span> <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span> <span id="L158" class="LineNr">158 </span> Trace_stream = Save_trace_stream<span class="Delimiter">;</span> <span id="L159" class="LineNr">159 </span> Save_trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span> -<span id="L160" class="LineNr">160 </span> Save_trace_file<span class="Delimiter">.</span>clear<span class="Delimiter">();</span> +<span id="L160" class="LineNr">160 </span> Save_trace_file<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <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">"interactive"</span><span class="Delimiter">));</span> <span class="Comment">// keep past sandboxes from inserting errors</span> <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> -<span id="L163" class="LineNr">163 </span> unstash_snapshots<span class="Delimiter">();</span> +<span id="L163" class="LineNr">163 </span> <a href='101run_sandboxed.cc.html#L184'>unstash_snapshots</a><span class="Delimiter">();</span> <span id="L164" class="LineNr">164 </span><span class="Delimiter">}</span> <span id="L165" class="LineNr">165 </span> <span id="L166" class="LineNr">166 </span><span class="Comment">// keep sync'd with save_snapshots and restore_snapshots</span> -<span id="L167" class="LineNr">167 </span><span class="Normal">void</span> stash_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L167" class="LineNr">167 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L167'>stash_snapshots</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> <span id="L169" class="LineNr">169 </span> Recipe_ordinal_snapshot_stash = Recipe_ordinal_snapshot<span class="Delimiter">;</span> <span id="L170" class="LineNr">170 </span> assert<span class="Delimiter">(</span>Recipe_snapshot_stash<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> @@ -241,15 +241,15 @@ if ('onhashchange' in window) { <span id="L181" class="LineNr">181 </span> Type_abbreviations_snapshot_stash = Type_abbreviations_snapshot<span class="Delimiter">;</span> <span id="L182" class="LineNr">182 </span> save_snapshots<span class="Delimiter">();</span> <span id="L183" class="LineNr">183 </span><span class="Delimiter">}</span> -<span id="L184" class="LineNr">184 </span><span class="Normal">void</span> unstash_snapshots<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L184" class="LineNr">184 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L184'>unstash_snapshots</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L185" class="LineNr">185 </span> restore_snapshots<span class="Delimiter">();</span> -<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> -<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> -<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> -<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> -<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> -<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> -<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> +<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><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L187" class="LineNr">187 </span> Recipe_snapshot = Recipe_snapshot_stash<span class="Delimiter">;</span> Recipe_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<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><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L189" class="LineNr">189 </span> Type_snapshot = Type_snapshot_stash<span class="Delimiter">;</span> Type_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L190" class="LineNr">190 </span> Name_snapshot = Name_snapshot_stash<span class="Delimiter">;</span> Name_snapshot_stash<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<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><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<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><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L193" class="LineNr">193 </span><span class="Delimiter">}</span> <span id="L194" class="LineNr">194 </span> <span id="L195" class="LineNr">195 </span><span class="Delimiter">:(before "End Load Recipes")</span> @@ -278,7 +278,7 @@ if ('onhashchange' in window) { <span id="L218" class="LineNr">218 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"interactive"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">""</span><span class="Delimiter">;</span> <span id="L219" class="LineNr">219 </span> <span id="L220" class="LineNr">220 </span><span class="Delimiter">:(scenario run_interactive_comments)</span> -<span id="L221" class="LineNr">221 </span><span class="muRecipe">def</span> main [ +<span id="L221" class="LineNr">221 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L222" class="LineNr">222 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [<span class="Comment"># ab</span> <span id="L223" class="LineNr">223 </span>add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>] <span id="L224" class="LineNr">224 </span> <span class="Constant">2</span>:text<span class="Special"> <- </span>run-sandboxed <span class="Constant">1</span>:text @@ -289,7 +289,7 @@ if ('onhashchange' in window) { <span id="L229" class="LineNr">229 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L230" class="LineNr">230 </span>_START_TRACKING_PRODUCTS<span class="Delimiter">,</span> <span id="L231" class="LineNr">231 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L232" class="LineNr">232 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$start-tracking-products"</span><span class="Delimiter">,</span> _START_TRACKING_PRODUCTS<span class="Delimiter">);</span> +<span id="L232" class="LineNr">232 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$start-tracking-products"</span><span class="Delimiter">,</span> _START_TRACKING_PRODUCTS<span class="Delimiter">);</span> <span id="L233" class="LineNr">233 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L234" class="LineNr">234 </span><span class="Normal">case</span> _START_TRACKING_PRODUCTS: <span class="Delimiter">{</span> <span id="L235" class="LineNr">235 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -303,7 +303,7 @@ if ('onhashchange' in window) { <span id="L243" class="LineNr">243 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L244" class="LineNr">244 </span>_STOP_TRACKING_PRODUCTS<span class="Delimiter">,</span> <span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L246" class="LineNr">246 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$stop-tracking-products"</span><span class="Delimiter">,</span> _STOP_TRACKING_PRODUCTS<span class="Delimiter">);</span> +<span id="L246" class="LineNr">246 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$stop-tracking-products"</span><span class="Delimiter">,</span> _STOP_TRACKING_PRODUCTS<span class="Delimiter">);</span> <span id="L247" class="LineNr">247 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L248" class="LineNr">248 </span><span class="Normal">case</span> _STOP_TRACKING_PRODUCTS: <span class="Delimiter">{</span> <span id="L249" class="LineNr">249 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -317,7 +317,7 @@ if ('onhashchange' in window) { <span id="L257" class="LineNr">257 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L258" class="LineNr">258 </span>_MOST_RECENT_PRODUCTS<span class="Delimiter">,</span> <span id="L259" class="LineNr">259 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L260" class="LineNr">260 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$most-recent-products"</span><span class="Delimiter">,</span> _MOST_RECENT_PRODUCTS<span class="Delimiter">);</span> +<span id="L260" class="LineNr">260 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$most-recent-products"</span><span class="Delimiter">,</span> _MOST_RECENT_PRODUCTS<span class="Delimiter">);</span> <span id="L261" class="LineNr">261 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L262" class="LineNr">262 </span><span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span> <span id="L263" class="LineNr">263 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -325,14 +325,14 @@ if ('onhashchange' in window) { <span id="L265" class="LineNr">265 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L266" class="LineNr">266 </span><span class="Normal">case</span> _MOST_RECENT_PRODUCTS: <span class="Delimiter">{</span> <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> -<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> +<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><a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>Most_recent_products<span class="Delimiter">));</span> <span id="L269" class="LineNr">269 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span> <span id="L271" class="LineNr">271 </span> <span id="L272" class="LineNr">272 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L273" class="LineNr">273 </span>SAVE_ERRORS<span class="Delimiter">,</span> <span id="L274" class="LineNr">274 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L275" class="LineNr">275 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"save-errors"</span><span class="Delimiter">,</span> SAVE_ERRORS<span class="Delimiter">);</span> +<span id="L275" class="LineNr">275 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"save-errors"</span><span class="Delimiter">,</span> SAVE_ERRORS<span class="Delimiter">);</span> <span id="L276" class="LineNr">276 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L277" class="LineNr">277 </span><span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span> <span id="L278" class="LineNr">278 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -340,14 +340,14 @@ if ('onhashchange' in window) { <span id="L280" class="LineNr">280 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L281" class="LineNr">281 </span><span class="Normal">case</span> SAVE_ERRORS: <span class="Delimiter">{</span> <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> -<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> +<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><a href='101run_sandboxed.cc.html#L421'>trace_error_contents</a><span class="Delimiter">());</span> <span id="L284" class="LineNr">284 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L285" class="LineNr">285 </span><span class="Delimiter">}</span> <span id="L286" class="LineNr">286 </span> <span id="L287" class="LineNr">287 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L288" class="LineNr">288 </span>SAVE_APP_TRACE<span class="Delimiter">,</span> <span id="L289" class="LineNr">289 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L290" class="LineNr">290 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"save-app-trace"</span><span class="Delimiter">,</span> SAVE_APP_TRACE<span class="Delimiter">);</span> +<span id="L290" class="LineNr">290 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"save-app-trace"</span><span class="Delimiter">,</span> SAVE_APP_TRACE<span class="Delimiter">);</span> <span id="L291" class="LineNr">291 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L292" class="LineNr">292 </span><span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span> <span id="L293" class="LineNr">293 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -355,26 +355,26 @@ if ('onhashchange' in window) { <span id="L295" class="LineNr">295 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L296" class="LineNr">296 </span><span class="Normal">case</span> SAVE_APP_TRACE: <span class="Delimiter">{</span> <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> -<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> +<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><a href='101run_sandboxed.cc.html#L435'>trace_app_contents</a><span class="Delimiter">());</span> <span id="L299" class="LineNr">299 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L300" class="LineNr">300 </span><span class="Delimiter">}</span> <span id="L301" class="LineNr">301 </span> <span id="L302" class="LineNr">302 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L303" class="LineNr">303 </span>_CLEANUP_RUN_SANDBOXED<span class="Delimiter">,</span> <span id="L304" class="LineNr">304 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L305" class="LineNr">305 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$cleanup-run-sandboxed"</span><span class="Delimiter">,</span> _CLEANUP_RUN_SANDBOXED<span class="Delimiter">);</span> +<span id="L305" class="LineNr">305 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"$cleanup-run-sandboxed"</span><span class="Delimiter">,</span> _CLEANUP_RUN_SANDBOXED<span class="Delimiter">);</span> <span id="L306" class="LineNr">306 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L307" class="LineNr">307 </span><span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span> <span id="L308" class="LineNr">308 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L309" class="LineNr">309 </span><span class="Delimiter">}</span> <span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L311" class="LineNr">311 </span><span class="Normal">case</span> _CLEANUP_RUN_SANDBOXED: <span class="Delimiter">{</span> -<span id="L312" class="LineNr">312 </span> run_code_end<span class="Delimiter">();</span> +<span id="L312" class="LineNr">312 </span> <a href='101run_sandboxed.cc.html#L151'>run_code_end</a><span class="Delimiter">();</span> <span id="L313" class="LineNr">313 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L314" class="LineNr">314 </span><span class="Delimiter">}</span> <span id="L315" class="LineNr">315 </span> <span id="L316" class="LineNr">316 </span><span class="Delimiter">:(scenario "run_interactive_converts_result_to_text")</span> -<span id="L317" class="LineNr">317 </span><span class="muRecipe">def</span> main [ +<span id="L317" class="LineNr">317 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L318" class="LineNr">318 </span> <span class="Comment"># try to interactively add 2 and 2</span> <span id="L319" class="LineNr">319 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>] <span id="L320" class="LineNr">320 </span> <span class="Constant">2</span>:text<span class="Special"> <- </span>run-sandboxed <span class="Constant">1</span>:text @@ -384,7 +384,7 @@ if ('onhashchange' in window) { <span id="L324" class="LineNr">324 </span><span class="traceContains">+mem: storing 52 in location 11</span> <span id="L325" class="LineNr">325 </span> <span id="L326" class="LineNr">326 </span><span class="Delimiter">:(scenario "run_interactive_returns_text")</span> -<span id="L327" class="LineNr">327 </span><span class="muRecipe">def</span> main [ +<span id="L327" class="LineNr">327 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L328" class="LineNr">328 </span> <span class="Comment"># try to interactively add 2 and 2</span> <span id="L329" class="LineNr">329 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [ <span id="L330" class="LineNr">330 </span> <span class="Normal">x</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [a] @@ -399,7 +399,7 @@ if ('onhashchange' in window) { <span id="L339" class="LineNr">339 </span><span class="traceContains">+mem: storing 98 in location 12</span> <span id="L340" class="LineNr">340 </span> <span id="L341" class="LineNr">341 </span><span class="Delimiter">:(scenario "run_interactive_returns_errors")</span> -<span id="L342" class="LineNr">342 </span><span class="muRecipe">def</span> main [ +<span id="L342" class="LineNr">342 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L343" class="LineNr">343 </span> <span class="Comment"># run a command that generates an error</span> <span id="L344" class="LineNr">344 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [x:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L345" class="LineNr">345 </span>get x:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span>] @@ -414,7 +414,7 @@ if ('onhashchange' in window) { <span id="L354" class="LineNr">354 </span><span class="Comment"># ...</span> <span id="L355" class="LineNr">355 </span> <span id="L356" class="LineNr">356 </span><span class="Delimiter">:(scenario run_interactive_with_comment)</span> -<span id="L357" class="LineNr">357 </span><span class="muRecipe">def</span> main [ +<span id="L357" class="LineNr">357 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L358" class="LineNr">358 </span> <span class="Comment"># 2 instructions, with a comment after the first</span> <span id="L359" class="LineNr">359 </span> <span class="Constant">1</span>:&:@:num<span class="Special"> <- </span><span class="Normal">new</span> [a:num<span class="Special"> <- </span>copy <span class="Constant">0</span> <span class="Comment"># abc</span> <span id="L360" class="LineNr">360 </span><span class="Normal">b</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> @@ -426,12 +426,12 @@ if ('onhashchange' in window) { <span id="L366" class="LineNr">366 </span> <span id="L367" class="LineNr">367 </span><span class="Delimiter">:(before "End Running One Instruction")</span> <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> -<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> +<span id="L369" class="LineNr">369 </span> <a href='101run_sandboxed.cc.html#L372'>track_most_recent_products</a><span class="Delimiter">(</span>current_instruction<span class="Delimiter">(),</span> products<span class="Delimiter">);</span> <span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span> <span id="L371" class="LineNr">371 </span><span class="Delimiter">:(code)</span> -<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& instruction<span class="Delimiter">,</span> <span class="Normal">const</span> vector<vector<<span class="Normal">double</span>> >& products<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L372" class="LineNr">372 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L372'>track_most_recent_products</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction& <a href='010vm.cc.html#L32'>instruction</a><span class="Delimiter">,</span> <span class="Normal">const</span> vector<vector<<span class="Normal">double</span>> >& products<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L373" class="LineNr">373 </span> ostringstream out<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L376" class="LineNr">376 </span> <span class="Comment">// to a variable in the sandbox, because otherwise the results are</span> <span id="L377" class="LineNr">377 </span> <span class="Comment">// reclaimed before the sandbox sees them. So you get these interactions</span> @@ -442,14 +442,14 @@ if ('onhashchange' in window) { <span id="L382" class="LineNr">382 </span> <span class="Comment">//</span> <span id="L383" class="LineNr">383 </span> <span class="Comment">// x:text <- new [abc]</span> <span id="L384" class="LineNr">384 </span> <span class="Comment">// => abc</span> -<span id="L385" class="LineNr">385 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i < SIZE<span class="Delimiter">(</span>instruction<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<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> +<span id="L385" class="LineNr">385 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span><a href='010vm.cc.html#L32'>instruction</a><span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L386" class="LineNr">386 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L174'>is_mu_text</a><span class="Delimiter">(</span><a href='010vm.cc.html#L32'>instruction</a><span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span> <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> -<span id="L388" class="LineNr">388 </span> out << 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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L388" class="LineNr">388 </span> out << <a href='038new_text.cc.html#L143'>read_mu_text</a><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> << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L389" class="LineNr">389 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L390" class="LineNr">390 </span> <span class="Delimiter">}</span> <span id="L391" class="LineNr">391 </span> <span class="Delimiter">}</span> -<span id="L392" class="LineNr">392 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j < 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> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> ++j<span class="Delimiter">)</span> <span id="L393" class="LineNr">393 </span> out << 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> << <span class="Constant">' '</span><span class="Delimiter">;</span> <span id="L394" class="LineNr">394 </span> out << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L395" class="LineNr">395 </span> <span class="Delimiter">}</span> @@ -457,57 +457,57 @@ if ('onhashchange' in window) { <span id="L397" class="LineNr">397 </span><span class="Delimiter">}</span> <span id="L398" class="LineNr">398 </span> <span id="L399" class="LineNr">399 </span><span class="Delimiter">:(code)</span> -<span id="L400" class="LineNr">400 </span>string strip_comments<span class="Delimiter">(</span>string in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L400" class="LineNr">400 </span>string <a href='101run_sandboxed.cc.html#L400'>strip_comments</a><span class="Delimiter">(</span>string in<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L401" class="LineNr">401 </span> ostringstream result<span class="Delimiter">;</span> -<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 < SIZE<span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <span id="L404" class="LineNr">404 </span> result << in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L405" class="LineNr">405 </span> <span class="Delimiter">}</span> <span id="L406" class="LineNr">406 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L407" class="LineNr">407 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>i+<span class="Constant">1</span> < SIZE<span class="Delimiter">(</span>in<span class="Delimiter">)</span> && 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> +<span id="L407" class="LineNr">407 </span> <span class="Normal">while</span> <span class="Delimiter">(</span>i+<span class="Constant">1</span> < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> && 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> <span id="L408" class="LineNr">408 </span> ++i<span class="Delimiter">;</span> <span id="L409" class="LineNr">409 </span> <span class="Delimiter">}</span> <span id="L410" class="LineNr">410 </span> <span class="Delimiter">}</span> <span id="L411" class="LineNr">411 </span> <span class="Identifier">return</span> result<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <span id="L412" class="LineNr">412 </span><span class="Delimiter">}</span> <span id="L413" class="LineNr">413 </span> -<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> +<span id="L414" class="LineNr">414 </span><span class="Normal">int</span> <a href='101run_sandboxed.cc.html#L414'>stringified_value_of_location</a><span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L415" class="LineNr">415 </span> <span class="Comment">// convert to string</span> <span id="L416" class="LineNr">416 </span> ostringstream out<span class="Delimiter">;</span> -<span id="L417" class="LineNr">417 </span> out << no_scientific<span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">));</span> -<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> +<span id="L417" class="LineNr">417 </span> out << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">));</span> +<span id="L418" class="LineNr">418 </span> <span class="Identifier">return</span> <a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>out<span class="Delimiter">.</span>str<span class="Delimiter">());</span> <span id="L419" class="LineNr">419 </span><span class="Delimiter">}</span> <span id="L420" class="LineNr">420 </span> -<span id="L421" class="LineNr">421 </span><span class="Normal">int</span> trace_error_contents<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L421" class="LineNr">421 </span><span class="Normal">int</span> <a href='101run_sandboxed.cc.html#L421'>trace_error_contents</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> <span id="L423" class="LineNr">423 </span> ostringstream out<span class="Delimiter">;</span> -<span id="L424" class="LineNr">424 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L424" class="LineNr">424 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L425" class="LineNr">425 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>label != <span class="Constant">"error"</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L426" class="LineNr">426 </span> out << p<span class="Delimiter">-></span>contents<span class="Delimiter">;</span> -<span id="L427" class="LineNr">427 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-></span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L427" class="LineNr">427 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-></span>contents<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L428" class="LineNr">428 </span> <span class="Delimiter">}</span> <span id="L429" class="LineNr">429 </span> string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> -<span id="L430" class="LineNr">430 </span> truncate<span class="Delimiter">(</span>result<span class="Delimiter">);</span> +<span id="L430" class="LineNr">430 </span> <a href='101run_sandboxed.cc.html#L449'>truncate</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span> <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> -<span id="L432" class="LineNr">432 </span> <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">);</span> +<span id="L432" class="LineNr">432 </span> <span class="Identifier">return</span> <a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span> <span id="L433" class="LineNr">433 </span><span class="Delimiter">}</span> <span id="L434" class="LineNr">434 </span> -<span id="L435" class="LineNr">435 </span><span class="Normal">int</span> trace_app_contents<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L435" class="LineNr">435 </span><span class="Normal">int</span> <a href='101run_sandboxed.cc.html#L435'>trace_app_contents</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <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> <span id="L437" class="LineNr">437 </span> ostringstream out<span class="Delimiter">;</span> -<span id="L438" class="LineNr">438 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>end<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L438" class="LineNr">438 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L439" class="LineNr">439 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-></span>depth != App_depth<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L440" class="LineNr">440 </span> out << p<span class="Delimiter">-></span>contents<span class="Delimiter">;</span> -<span id="L441" class="LineNr">441 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-></span>contents<span class="Delimiter">.</span>end<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> +<span id="L441" class="LineNr">441 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>*--p<span class="Delimiter">-></span>contents<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> out << <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L442" class="LineNr">442 </span> <span class="Delimiter">}</span> <span id="L443" class="LineNr">443 </span> string result = out<span class="Delimiter">.</span>str<span class="Delimiter">();</span> <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> -<span id="L445" class="LineNr">445 </span> truncate<span class="Delimiter">(</span>result<span class="Delimiter">);</span> -<span id="L446" class="LineNr">446 </span> <span class="Identifier">return</span> new_mu_text<span class="Delimiter">(</span>result<span class="Delimiter">);</span> +<span id="L445" class="LineNr">445 </span> <a href='101run_sandboxed.cc.html#L449'>truncate</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span> +<span id="L446" class="LineNr">446 </span> <span class="Identifier">return</span> <a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>result<span class="Delimiter">);</span> <span id="L447" class="LineNr">447 </span><span class="Delimiter">}</span> <span id="L448" class="LineNr">448 </span> -<span id="L449" class="LineNr">449 </span><span class="Normal">void</span> truncate<span class="Delimiter">(</span>string& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<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> > <span class="Constant">1024</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L449" class="LineNr">449 </span><span class="Normal">void</span> <a href='101run_sandboxed.cc.html#L449'>truncate</a><span class="Delimiter">(</span>string& x<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L450" class="LineNr">450 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> > <span class="Constant">1024</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <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> <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> <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> @@ -521,15 +521,15 @@ if ('onhashchange' in window) { <span id="L461" class="LineNr">461 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> <span id="L462" class="LineNr">462 </span>RELOAD<span class="Delimiter">,</span> <span id="L463" class="LineNr">463 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L464" class="LineNr">464 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"reload"</span><span class="Delimiter">,</span> RELOAD<span class="Delimiter">);</span> +<span id="L464" class="LineNr">464 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"reload"</span><span class="Delimiter">,</span> RELOAD<span class="Delimiter">);</span> <span id="L465" class="LineNr">465 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> <span id="L466" class="LineNr">466 </span><span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span> -<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> -<span id="L468" class="LineNr">468 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'reload' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L467" class="LineNr">467 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L468" class="LineNr">468 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'reload' requires exactly one ingredient, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L469" class="LineNr">469 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L470" class="LineNr">470 </span> <span class="Delimiter">}</span> <span id="L471" class="LineNr">471 </span> <span class="Normal">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> -<span id="L472" class="LineNr">472 </span> raise << maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'reload' should be a string, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L472" class="LineNr">472 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'reload' should be a string, but got '"</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L473" class="LineNr">473 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L474" class="LineNr">474 </span> <span class="Delimiter">}</span> <span id="L475" class="LineNr">475 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> @@ -537,24 +537,24 @@ if ('onhashchange' in window) { <span id="L477" class="LineNr">477 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> <span id="L478" class="LineNr">478 </span><span class="Normal">case</span> RELOAD: <span class="Delimiter">{</span> <span id="L479" class="LineNr">479 </span> restore_non_recipe_snapshots<span class="Delimiter">();</span> -<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> -<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> +<span id="L480" class="LineNr">480 </span> string code = <a href='038new_text.cc.html#L143'>read_mu_text</a><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 id="L481" class="LineNr">481 </span> <a href='101run_sandboxed.cc.html#L140'>run_code_begin</a><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> <span id="L482" class="LineNr">482 </span> routine* save_current_routine = Current_routine<span class="Delimiter">;</span> <span id="L483" class="LineNr">483 </span> Current_routine = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span id="L484" class="LineNr">484 </span> Sandbox_mode = <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L485" class="LineNr">485 </span> vector<recipe_ordinal> recipes_reloaded = load<span class="Delimiter">(</span>code<span class="Delimiter">);</span> -<span id="L486" class="LineNr">486 </span> transform_all<span class="Delimiter">();</span> -<span id="L487" class="LineNr">487 </span> Trace_stream<span class="Delimiter">-></span>newline<span class="Delimiter">();</span> <span class="Comment">// flush trace</span> +<span id="L486" class="LineNr">486 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> +<span id="L487" class="LineNr">487 </span> Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> <span class="Comment">// flush trace</span> <span id="L488" class="LineNr">488 </span> Sandbox_mode = <span class="Constant">false</span><span class="Delimiter">;</span> <span id="L489" class="LineNr">489 </span> Current_routine = save_current_routine<span class="Delimiter">;</span> <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> -<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> -<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> +<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><a href='101run_sandboxed.cc.html#L421'>trace_error_contents</a><span class="Delimiter">());</span> +<span id="L492" class="LineNr">492 </span> <a href='101run_sandboxed.cc.html#L151'>run_code_end</a><span class="Delimiter">();</span> <span class="Comment">// wait until we're done with the trace contents</span> <span id="L493" class="LineNr">493 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L494" class="LineNr">494 </span><span class="Delimiter">}</span> <span id="L495" class="LineNr">495 </span> <span id="L496" class="LineNr">496 </span><span class="Delimiter">:(scenario reload_continues_past_error)</span> -<span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> main [ +<span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L498" class="LineNr">498 </span> local-scope <span id="L499" class="LineNr">499 </span> <span class="Normal">x</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [recipe foo [ <span id="L500" class="LineNr">500 </span> get <span class="Constant">1234</span>:num<span class="Delimiter">,</span> <span class="Constant">foo:offset</span> @@ -566,14 +566,14 @@ if ('onhashchange' in window) { <span id="L506" class="LineNr">506 </span> <span id="L507" class="LineNr">507 </span><span class="Delimiter">:(scenario reload_can_repeatedly_load_container_definitions)</span> <span id="L508" class="LineNr">508 </span><span class="Comment"># define a container and try to create it (merge requires knowing container size)</span> -<span id="L509" class="LineNr">509 </span><span class="muRecipe">def</span> main [ +<span id="L509" class="LineNr">509 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L510" class="LineNr">510 </span> local-scope <span id="L511" class="LineNr">511 </span> <span class="Normal">x</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [ <span id="L512" class="LineNr">512 </span> container foo [ <span id="L513" class="LineNr">513 </span> <span class="Normal">x</span>:num <span id="L514" class="LineNr">514 </span> <span class="Normal">y</span>:num <span id="L515" class="LineNr">515 </span> ] -<span id="L516" class="LineNr">516 </span> recipe bar [ +<span id="L516" class="LineNr">516 </span> <a href='010vm.cc.html#L19'>recipe</a> bar [ <span id="L517" class="LineNr">517 </span> local-scope <span id="L518" class="LineNr">518 </span> <span class="Normal">x</span>:foo<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> <span id="L519" class="LineNr">519 </span> ] diff --git a/html/999spaces.cc.html b/html/999spaces.cc.html index 02a4b1ca..f590e1a9 100644 --- a/html/999spaces.cc.html +++ b/html/999spaces.cc.html @@ -72,7 +72,7 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr">18 </span><span class="Comment">//:</span> <span id="L19" class="LineNr">19 </span><span class="Comment">//: 0 - unused (IDLE; do nothing)</span> <span id="L20" class="LineNr">20 </span><span class="Comment">//: 1-199 - primitives</span> -<span id="L21" class="LineNr">21 </span>assert<span class="Delimiter">(</span>MAX_PRIMITIVE_RECIPES < <span class="Constant">200</span><span class="Delimiter">);</span> +<span id="L21" class="LineNr">21 </span>assert<span class="Delimiter">(</span><a href='010vm.cc.html#L192'>MAX_PRIMITIVE_RECIPES</a> < <span class="Constant">200</span><span class="Delimiter">);</span> <span id="L22" class="LineNr">22 </span><span class="Comment">//: 200-999 - defined in .mu files as sequences of primitives</span> <span id="L23" class="LineNr">23 </span>assert<span class="Delimiter">(</span>Next_recipe_ordinal == <span class="Constant">1000</span><span class="Delimiter">);</span> <span id="L24" class="LineNr">24 </span><span class="Comment">//: 1000 onwards - reserved for tests, cleared between tests</span> diff --git a/html/channel.mu.html b/html/channel.mu.html index 2a485823..428e1b8b 100644 --- a/html/channel.mu.html +++ b/html/channel.mu.html @@ -68,7 +68,7 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr">12 </span> <span class="Comment"># other threads might get between these prints</span> <span id="L13" class="LineNr">13 </span> $print <span class="Constant">[produce: ]</span>, n, <span class="Constant">[ </span> <span id="L14" class="LineNr">14 </span><span class="Constant">]</span> -<span id="L15" class="LineNr">15 </span> sink <span class="Special"><-</span> write sink, n +<span id="L15" class="LineNr">15 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, n <span id="L16" class="LineNr">16 </span> n <span class="Special"><-</span> add n,<span class="Constant"> 1</span> <span id="L17" class="LineNr">17 </span> <span class="muControl">loop</span> <span id="L18" class="LineNr">18 </span> <span class="Delimiter">}</span> @@ -92,7 +92,7 @@ if ('onhashchange' in window) { <span id="L36" class="LineNr">36 </span> <span id="L37" class="LineNr">37 </span><span class="muRecipe">def</span> main [ <span id="L38" class="LineNr">38 </span> <span class="Constant">local-scope</span> -<span id="L39" class="LineNr">39 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">3/capacity</span> +<span id="L39" class="LineNr">39 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> <span id="L40" class="LineNr">40 </span> <span class="Comment"># create two background 'routines' that communicate by a channel</span> <span id="L41" class="LineNr">41 </span> routine1:num <span class="Special"><-</span> start-running producer, sink <span id="L42" class="LineNr">42 </span> routine2:num <span class="Special"><-</span> start-running consumer, source diff --git a/html/chessboard.mu.html b/html/chessboard.mu.html index c72e498a..3e4b09c8 100644 --- a/html/chessboard.mu.html +++ b/html/chessboard.mu.html @@ -90,10 +90,10 @@ if ('onhashchange' in window) { <span id="L30" class="LineNr"> 30 </span><span class="Constant">]</span> <span id="L31" class="LineNr"> 31 </span> ] <span id="L32" class="LineNr"> 32 </span> run [ -<span id="L33" class="LineNr"> 33 </span> screen:&:screen, console:&:console <span class="Special"><-</span> chessboard screen:&:screen, console:&:console +<span id="L33" class="LineNr"> 33 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> chessboard <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> <span id="L34" class="LineNr"> 34 </span> <span class="Comment"># icon for the cursor</span> <span id="L35" class="LineNr"> 35 </span> cursor-icon:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L36" class="LineNr"> 36 </span> screen <span class="Special"><-</span> print screen, cursor-icon +<span id="L36" class="LineNr"> 36 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, cursor-icon <span id="L37" class="LineNr"> 37 </span> ] <span id="L38" class="LineNr"> 38 </span> screen-should-contain [ <span id="L39" class="LineNr"> 39 </span> <span class="Comment"># 1 2 3 4 5 6 7 8 9 10 11</span> @@ -125,37 +125,37 @@ if ('onhashchange' in window) { <span id="L65" class="LineNr"> 65 </span> <span id="L66" class="LineNr"> 66 </span><span class="muData">type</span> board = &:@:&:@:char <span class="Comment"># a 2-D array of arrays of characters</span> <span id="L67" class="LineNr"> 67 </span> -<span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> chessboard screen:&:screen, console:&:console<span class="muRecipe"> -> </span>screen:&:screen, console:&:console [ +<span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> chessboard <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> [ <span id="L69" class="LineNr"> 69 </span> <span class="Constant">local-scope</span> <span id="L70" class="LineNr"> 70 </span> <span class="Constant">load-ingredients</span> <span id="L71" class="LineNr"> 71 </span> board:board <span class="Special"><-</span> initial-position <span id="L72" class="LineNr"> 72 </span> <span class="Comment"># hook up stdin</span> -<span id="L73" class="LineNr"> 73 </span> stdin-in:&:source:char, stdin-out:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">10/capacity</span> -<span id="L74" class="LineNr"> 74 </span> start-running send-keys-to-channel, console, stdin-out, screen +<span id="L73" class="LineNr"> 73 </span> stdin-in:&:source:char, stdin-out:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">10/capacity</span> +<span id="L74" class="LineNr"> 74 </span> start-running <a href='084console.mu.html#L73'>send-keys-to-channel</a>, <a href='084console.mu.html#L23'>console</a>, stdin-out, <a href='081print.mu.html#L4'>screen</a> <span id="L75" class="LineNr"> 75 </span> <span class="Comment"># buffer lines in stdin</span> -<span id="L76" class="LineNr"> 76 </span> buffered-stdin-in:&:source:char, buffered-stdin-out:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">10/capacity</span> -<span id="L77" class="LineNr"> 77 </span> start-running buffer-lines, stdin-in, buffered-stdin-out +<span id="L76" class="LineNr"> 76 </span> buffered-stdin-in:&:source:char, buffered-stdin-out:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">10/capacity</span> +<span id="L77" class="LineNr"> 77 </span> start-running <a href='075channel.mu.html#L388'>buffer-lines</a>, stdin-in, buffered-stdin-out <span id="L78" class="LineNr"> 78 </span> <span class="Delimiter">{</span> -<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> +<span id="L79" class="LineNr"> 79 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves.</span> <span id="L80" class="LineNr"> 80 </span><span class="Constant">]</span> -<span id="L81" class="LineNr"> 81 </span> cursor-to-next-line screen -<span id="L82" class="LineNr"> 82 </span> print-board screen, board -<span id="L83" class="LineNr"> 83 </span> cursor-to-next-line screen -<span id="L84" class="LineNr"> 84 </span> print screen, <span class="Constant">[Type in your move as <from square>-<to square>. For example: 'a2-a4'. Then press <enter>.</span> +<span id="L81" class="LineNr"> 81 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L82" class="LineNr"> 82 </span> print-board <a href='081print.mu.html#L4'>screen</a>, board +<span id="L83" class="LineNr"> 83 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L84" class="LineNr"> 84 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[Type in your move as <from square>-<to square>. For example: 'a2-a4'. Then press <enter>.</span> <span id="L85" class="LineNr"> 85 </span><span class="Constant">]</span> -<span id="L86" class="LineNr"> 86 </span> cursor-to-next-line screen -<span id="L87" class="LineNr"> 87 </span> print screen <span class="Constant">[Hit 'q' to exit.</span> +<span id="L86" class="LineNr"> 86 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L87" class="LineNr"> 87 </span> print <a href='081print.mu.html#L4'>screen</a> <span class="Constant">[Hit 'q' to exit.</span> <span id="L88" class="LineNr"> 88 </span><span class="Constant">]</span> <span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">{</span> -<span id="L90" class="LineNr"> 90 </span> cursor-to-next-line screen -<span id="L91" class="LineNr"> 91 </span> screen <span class="Special"><-</span> print screen, <span class="Constant">[move: ]</span> -<span id="L92" class="LineNr"> 92 </span> m:&:move, quit:bool, error:bool <span class="Special"><-</span> read-move buffered-stdin-in, screen +<span id="L90" class="LineNr"> 90 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L91" class="LineNr"> 91 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[move: ]</span> +<span id="L92" class="LineNr"> 92 </span> m:&:move, quit:bool, error:bool <span class="Special"><-</span> read-move buffered-stdin-in, <a href='081print.mu.html#L4'>screen</a> <span id="L93" class="LineNr"> 93 </span> <span class="muControl">break-if</span> quit, <span class="Constant">+quit</span> -<span id="L94" class="LineNr"> 94 </span> buffered-stdin-in <span class="Special"><-</span> clear buffered-stdin-in <span class="Comment"># cleanup after error. todo: test this?</span> +<span id="L94" class="LineNr"> 94 </span> buffered-stdin-in <span class="Special"><-</span> <a href='075channel.mu.html#L161'>clear</a> buffered-stdin-in <span class="Comment"># cleanup after error. todo: test this?</span> <span id="L95" class="LineNr"> 95 </span> <span class="muControl">loop-if</span> error <span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> <span id="L97" class="LineNr"> 97 </span> board <span class="Special"><-</span> make-move board, m -<span id="L98" class="LineNr"> 98 </span> screen <span class="Special"><-</span> clear-screen screen +<span id="L98" class="LineNr"> 98 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L27'>clear-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L99" class="LineNr"> 99 </span> <span class="muControl">loop</span> <span id="L100" class="LineNr">100 </span> <span class="Delimiter">}</span> <span id="L101" class="LineNr">101 </span><span class="Constant"> +quit</span> @@ -200,7 +200,7 @@ if ('onhashchange' in window) { <span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span> <span id="L141" class="LineNr">141 </span>] <span id="L142" class="LineNr">142 </span> -<span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> print-board screen:&:screen, board:board<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> print-board <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board:board<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L144" class="LineNr">144 </span> <span class="Constant">local-scope</span> <span id="L145" class="LineNr">145 </span> <span class="Constant">load-ingredients</span> <span id="L146" class="LineNr">146 </span> row:num <span class="Special"><-</span> copy<span class="Constant"> 7</span> <span class="Comment"># start printing from the top of the board</span> @@ -211,8 +211,8 @@ if ('onhashchange' in window) { <span id="L151" class="LineNr">151 </span> <span class="muControl">break-if</span> done? <span id="L152" class="LineNr">152 </span> <span class="Comment"># print rank number as a legend</span> <span id="L153" class="LineNr">153 </span> rank:num <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L154" class="LineNr">154 </span> print-integer screen, rank -<span id="L155" class="LineNr">155 </span> print screen, <span class="Constant">[ | ]</span> +<span id="L154" class="LineNr">154 </span> <a href='081print.mu.html#L687'>print-integer</a> <a href='081print.mu.html#L4'>screen</a>, rank +<span id="L155" class="LineNr">155 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[ | ]</span> <span id="L156" class="LineNr">156 </span> <span class="Comment"># print each square in the row</span> <span id="L157" class="LineNr">157 </span> col:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L158" class="LineNr">158 </span> <span class="Delimiter">{</span> @@ -220,20 +220,20 @@ if ('onhashchange' in window) { <span id="L160" class="LineNr">160 </span> <span class="muControl">break-if</span> done?:bool <span id="L161" class="LineNr">161 </span> f:&:@:char <span class="Special"><-</span> index *board, col <span id="L162" class="LineNr">162 </span> c:char <span class="Special"><-</span> index *f, row -<span id="L163" class="LineNr">163 </span> print screen, c -<span id="L164" class="LineNr">164 </span> print screen, space +<span id="L163" class="LineNr">163 </span> print <a href='081print.mu.html#L4'>screen</a>, c +<span id="L164" class="LineNr">164 </span> print <a href='081print.mu.html#L4'>screen</a>, space <span id="L165" class="LineNr">165 </span> col <span class="Special"><-</span> add col,<span class="Constant"> 1</span> <span id="L166" class="LineNr">166 </span> <span class="muControl">loop</span> <span id="L167" class="LineNr">167 </span> <span class="Delimiter">}</span> <span id="L168" class="LineNr">168 </span> row <span class="Special"><-</span> subtract row,<span class="Constant"> 1</span> -<span id="L169" class="LineNr">169 </span> cursor-to-next-line screen +<span id="L169" class="LineNr">169 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> <span id="L170" class="LineNr">170 </span> <span class="muControl">loop</span> <span id="L171" class="LineNr">171 </span> <span class="Delimiter">}</span> <span id="L172" class="LineNr">172 </span> <span class="Comment"># print file letters as legend</span> -<span id="L173" class="LineNr">173 </span> print screen, <span class="Constant">[ +----------------]</span> -<span id="L174" class="LineNr">174 </span> cursor-to-next-line screen -<span id="L175" class="LineNr">175 </span> print screen, <span class="Constant">[ a b c d e f g h]</span> -<span id="L176" class="LineNr">176 </span> cursor-to-next-line screen +<span id="L173" class="LineNr">173 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[ +----------------]</span> +<span id="L174" class="LineNr">174 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L175" class="LineNr">175 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[ a b c d e f g h]</span> +<span id="L176" class="LineNr">176 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> <span id="L177" class="LineNr">177 </span>] <span id="L178" class="LineNr">178 </span> <span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> initial-position<span class="muRecipe"> -> </span>board:board [ @@ -247,7 +247,7 @@ if ('onhashchange' in window) { <span id="L187" class="LineNr">187 </span> <span class="Comment"># B P _ _ _ _ p B</span> <span id="L188" class="LineNr">188 </span> <span class="Comment"># N P _ _ _ _ p n</span> <span id="L189" class="LineNr">189 </span> <span class="Comment"># R P _ _ _ _ p r</span> -<span id="L190" class="LineNr">190 </span> initial-position:&:@:char <span class="Special"><-</span> 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 id="L190" class="LineNr">190 </span> initial-position:&:@:char <span class="Special"><-</span> <a href='063array.mu.html#L16'>new-array</a> <span class="Constant">82/R</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">114/r</span>, <span class="Constant">78/N</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">110/n</span>, <span class="Constant">66/B</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">98/b</span>, <span class="Constant">81/Q</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">113/q</span>, <span class="Constant">75/K</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">107/k</span>, <span class="Constant">66/B</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">98/b</span>, <span class="Constant">78/N</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">110/n</span>, <span class="Constant">82/R</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">114/r</span> <span id="L191" class="LineNr">191 </span><span class="CommentedCode">#? 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r,</span> <span id="L192" class="LineNr">192 </span><span class="CommentedCode">#? 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n,</span> <span id="L193" class="LineNr">193 </span><span class="CommentedCode">#? 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, </span> @@ -264,7 +264,7 @@ if ('onhashchange' in window) { <span id="L204" class="LineNr">204 </span> board:board <span class="Special"><-</span> initial-position <span id="L205" class="LineNr">205 </span> assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span> <span id="L206" class="LineNr">206 </span> run [ -<span id="L207" class="LineNr">207 </span> screen:&:screen <span class="Special"><-</span> print-board screen:&:screen, board +<span id="L207" class="LineNr">207 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print-board <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board <span id="L208" class="LineNr">208 </span> ] <span id="L209" class="LineNr">209 </span> screen-should-contain [ <span id="L210" class="LineNr">210 </span> <span class="Comment"># 012345678901234567890123456789</span> @@ -294,35 +294,35 @@ if ('onhashchange' in window) { <span id="L234" class="LineNr">234 </span>] <span id="L235" class="LineNr">235 </span> <span id="L236" class="LineNr">236 </span><span class="Comment"># prints only error messages to screen</span> -<span id="L237" class="LineNr">237 </span><span class="muRecipe">def</span> read-move stdin:&:source:char, screen:&:screen<span class="muRecipe"> -> </span>result:&:move, quit?:bool, error?:bool, stdin:&:source:char, screen:&:screen [ +<span id="L237" class="LineNr">237 </span><span class="muRecipe">def</span> read-move stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:&:move, quit?:bool, error?:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L238" class="LineNr">238 </span> <span class="Constant">local-scope</span> <span id="L239" class="LineNr">239 </span> <span class="Constant">load-ingredients</span> -<span id="L240" class="LineNr">240 </span> from-file:num, quit?:bool, error?:bool <span class="Special"><-</span> read-file stdin, screen +<span id="L240" class="LineNr">240 </span> from-file:num, quit?:bool, error?:bool <span class="Special"><-</span> read-file stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L241" class="LineNr">241 </span> <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span> <span id="L242" class="LineNr">242 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span> <span id="L243" class="LineNr">243 </span> <span class="Comment"># construct the move object</span> <span id="L244" class="LineNr">244 </span> result:&:move <span class="Special"><-</span> new <span class="Constant">move:type</span> <span id="L245" class="LineNr">245 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">from-file:offset</span>, from-file -<span id="L246" class="LineNr">246 </span> from-rank:num, quit?, error? <span class="Special"><-</span> read-rank stdin, screen +<span id="L246" class="LineNr">246 </span> from-rank:num, quit?, error? <span class="Special"><-</span> read-rank stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L247" class="LineNr">247 </span> <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span> <span id="L248" class="LineNr">248 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span> <span id="L249" class="LineNr">249 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">from-rank:offset</span>, from-rank -<span id="L250" class="LineNr">250 </span> error? <span class="Special"><-</span> expect-from-channel stdin, <span class="Constant">45/dash</span>, screen +<span id="L250" class="LineNr">250 </span> error? <span class="Special"><-</span> expect-from-channel stdin, <span class="Constant">45/dash</span>, <a href='081print.mu.html#L4'>screen</a> <span id="L251" class="LineNr">251 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span> -<span id="L252" class="LineNr">252 </span> to-file:num, quit?, error? <span class="Special"><-</span> read-file stdin, screen +<span id="L252" class="LineNr">252 </span> to-file:num, quit?, error? <span class="Special"><-</span> read-file stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L253" class="LineNr">253 </span> <span class="muControl">return-if</span> quit?:bool, <span class="Constant">0/dummy</span> <span id="L254" class="LineNr">254 </span> <span class="muControl">return-if</span> error?:bool, <span class="Constant">0/dummy</span> <span id="L255" class="LineNr">255 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">to-file:offset</span>, to-file -<span id="L256" class="LineNr">256 </span> to-rank:num, quit?, error? <span class="Special"><-</span> read-rank stdin, screen +<span id="L256" class="LineNr">256 </span> to-rank:num, quit?, error? <span class="Special"><-</span> read-rank stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L257" class="LineNr">257 </span> <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span> <span id="L258" class="LineNr">258 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span> <span id="L259" class="LineNr">259 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">to-rank:offset</span>, to-rank -<span id="L260" class="LineNr">260 </span> error? <span class="Special"><-</span> expect-from-channel stdin, <span class="Constant">10/newline</span>, screen +<span id="L260" class="LineNr">260 </span> error? <span class="Special"><-</span> expect-from-channel stdin, <span class="Constant">10/newline</span>, <a href='081print.mu.html#L4'>screen</a> <span id="L261" class="LineNr">261 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span> <span id="L262" class="LineNr">262 </span>] <span id="L263" class="LineNr">263 </span> <span id="L264" class="LineNr">264 </span><span class="Comment"># valid values for file: 0-7</span> -<span id="L265" class="LineNr">265 </span><span class="muRecipe">def</span> read-file stdin:&:source:char, screen:&:screen<span class="muRecipe"> -> </span>file:num, quit:bool, error:bool, stdin:&:source:char, screen:&:screen [ +<span id="L265" class="LineNr">265 </span><span class="muRecipe">def</span> read-file stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>file:num, quit:bool, error:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L266" class="LineNr">266 </span> <span class="Constant">local-scope</span> <span id="L267" class="LineNr">267 </span> <span class="Constant">load-ingredients</span> <span id="L268" class="LineNr">268 </span> c:char, eof?:bool, stdin <span class="Special"><-</span> read stdin @@ -345,7 +345,7 @@ if ('onhashchange' in window) { <span id="L285" class="LineNr">285 </span> <span class="Delimiter">{</span> <span id="L286" class="LineNr">286 </span> newline?:bool <span class="Special"><-</span> equal c, <span class="Constant">10/newline</span> <span id="L287" class="LineNr">287 </span> <span class="muControl">break-unless</span> newline? -<span id="L288" class="LineNr">288 </span> print screen, <span class="Constant">[that's not enough]</span> +<span id="L288" class="LineNr">288 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[that's not enough]</span> <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> <span id="L290" class="LineNr">290 </span> <span class="Delimiter">}</span> <span id="L291" class="LineNr">291 </span> file:num <span class="Special"><-</span> subtract c, <span class="Constant">97/a</span> @@ -353,23 +353,23 @@ if ('onhashchange' in window) { <span id="L293" class="LineNr">293 </span> <span class="Delimiter">{</span> <span id="L294" class="LineNr">294 </span> above-min:bool <span class="Special"><-</span> greater-or-equal file,<span class="Constant"> 0</span> <span id="L295" class="LineNr">295 </span> <span class="muControl">break-if</span> above-min -<span id="L296" class="LineNr">296 </span> print screen, <span class="Constant">[file too low: ]</span> -<span id="L297" class="LineNr">297 </span> print screen, c -<span id="L298" class="LineNr">298 </span> cursor-to-next-line screen +<span id="L296" class="LineNr">296 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[file too low: ]</span> +<span id="L297" class="LineNr">297 </span> print <a href='081print.mu.html#L4'>screen</a>, c +<span id="L298" class="LineNr">298 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</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> <span id="L300" class="LineNr">300 </span> <span class="Delimiter">}</span> <span id="L301" class="LineNr">301 </span> <span class="Delimiter">{</span> <span id="L302" class="LineNr">302 </span> below-max:bool <span class="Special"><-</span> lesser-than file,<span class="Constant"> 8</span> <span id="L303" class="LineNr">303 </span> <span class="muControl">break-if</span> below-max -<span id="L304" class="LineNr">304 </span> print screen, <span class="Constant">[file too high: ]</span> -<span id="L305" class="LineNr">305 </span> print screen, c +<span id="L304" class="LineNr">304 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[file too high: ]</span> +<span id="L305" class="LineNr">305 </span> print <a href='081print.mu.html#L4'>screen</a>, c <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> <span id="L307" class="LineNr">307 </span> <span class="Delimiter">}</span> <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> <span id="L309" class="LineNr">309 </span>] <span id="L310" class="LineNr">310 </span> <span id="L311" class="LineNr">311 </span><span class="Comment"># valid values for rank: 0-7</span> -<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> read-rank stdin:&:source:char, screen:&:screen<span class="muRecipe"> -> </span>rank:num, quit?:bool, error?:bool, stdin:&:source:char, screen:&:screen [ +<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> read-rank stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>rank:num, quit?:bool, error?:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L313" class="LineNr">313 </span> <span class="Constant">local-scope</span> <span id="L314" class="LineNr">314 </span> <span class="Constant">load-ingredients</span> <span id="L315" class="LineNr">315 </span> c:char, eof?:bool, stdin <span class="Special"><-</span> read stdin @@ -387,7 +387,7 @@ if ('onhashchange' in window) { <span id="L327" class="LineNr">327 </span> <span class="Delimiter">{</span> <span id="L328" class="LineNr">328 </span> newline?:bool <span class="Special"><-</span> equal c,<span class="Constant"> 10</span> <span class="Comment"># newline</span> <span id="L329" class="LineNr">329 </span> <span class="muControl">break-unless</span> newline? -<span id="L330" class="LineNr">330 </span> print screen, <span class="Constant">[that's not enough]</span> +<span id="L330" class="LineNr">330 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[that's not enough]</span> <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> <span id="L332" class="LineNr">332 </span> <span class="Delimiter">}</span> <span id="L333" class="LineNr">333 </span> rank:num <span class="Special"><-</span> subtract c, <span class="Constant">49/'1'</span> @@ -395,15 +395,15 @@ if ('onhashchange' in window) { <span id="L335" class="LineNr">335 </span> <span class="Delimiter">{</span> <span id="L336" class="LineNr">336 </span> above-min:bool <span class="Special"><-</span> greater-or-equal rank,<span class="Constant"> 0</span> <span id="L337" class="LineNr">337 </span> <span class="muControl">break-if</span> above-min -<span id="L338" class="LineNr">338 </span> print screen, <span class="Constant">[rank too low: ]</span> -<span id="L339" class="LineNr">339 </span> print screen, c +<span id="L338" class="LineNr">338 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[rank too low: ]</span> +<span id="L339" class="LineNr">339 </span> print <a href='081print.mu.html#L4'>screen</a>, c <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> <span id="L341" class="LineNr">341 </span> <span class="Delimiter">}</span> <span id="L342" class="LineNr">342 </span> <span class="Delimiter">{</span> <span id="L343" class="LineNr">343 </span> below-max:bool <span class="Special"><-</span> lesser-or-equal rank,<span class="Constant"> 7</span> <span id="L344" class="LineNr">344 </span> <span class="muControl">break-if</span> below-max -<span id="L345" class="LineNr">345 </span> print screen, <span class="Constant">[rank too high: ]</span> -<span id="L346" class="LineNr">346 </span> print screen, c +<span id="L345" class="LineNr">345 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[rank too high: ]</span> +<span id="L346" class="LineNr">346 </span> print <a href='081print.mu.html#L4'>screen</a>, c <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> <span id="L348" class="LineNr">348 </span> <span class="Delimiter">}</span> <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> @@ -411,7 +411,7 @@ if ('onhashchange' in window) { <span id="L351" class="LineNr">351 </span> <span id="L352" class="LineNr">352 </span><span class="Comment"># read a character from the given channel and check that it's what we expect</span> <span id="L353" class="LineNr">353 </span><span class="Comment"># return true on error</span> -<span id="L354" class="LineNr">354 </span><span class="muRecipe">def</span> expect-from-channel stdin:&:source:char, expected:char, screen:&:screen<span class="muRecipe"> -> </span>result:bool, stdin:&:source:char, screen:&:screen [ +<span id="L354" class="LineNr">354 </span><span class="muRecipe">def</span> expect-from-channel stdin:&:source:char, expected:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L355" class="LineNr">355 </span> <span class="Constant">local-scope</span> <span id="L356" class="LineNr">356 </span> <span class="Constant">load-ingredients</span> <span id="L357" class="LineNr">357 </span> c:char, eof?:bool, stdin <span class="Special"><-</span> read stdin @@ -419,7 +419,7 @@ if ('onhashchange' in window) { <span id="L359" class="LineNr">359 </span> <span class="Delimiter">{</span> <span id="L360" class="LineNr">360 </span> match?:bool <span class="Special"><-</span> equal c, expected <span id="L361" class="LineNr">361 </span> <span class="muControl">break-if</span> match? -<span id="L362" class="LineNr">362 </span> print screen, <span class="Constant">[expected character not found]</span> +<span id="L362" class="LineNr">362 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[expected character not found]</span> <span id="L363" class="LineNr">363 </span> <span class="Delimiter">}</span> <span id="L364" class="LineNr">364 </span> result <span class="Special"><-</span> not match? <span id="L365" class="LineNr">365 </span>] @@ -427,8 +427,8 @@ if ('onhashchange' in window) { <span id="L367" class="LineNr">367 </span><span class="muScenario">scenario</span> read-move-blocking [ <span id="L368" class="LineNr">368 </span> <span class="Constant">local-scope</span> <span id="L369" class="LineNr">369 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> -<span id="L370" class="LineNr">370 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">2/capacity</span> -<span id="L371" class="LineNr">371 </span> read-move-routine:num/routine <span class="Special"><-</span> start-running read-move, source, screen:&:screen +<span id="L370" class="LineNr">370 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> +<span id="L371" class="LineNr">371 </span> read-move-routine:num/routine <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L372" class="LineNr">372 </span> run [ <span id="L373" class="LineNr">373 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L374" class="LineNr">374 </span> wait-for-routine-to-block read-move-routine @@ -437,7 +437,7 @@ if ('onhashchange' in window) { <span id="L377" class="LineNr">377 </span> assert waiting?, <span class="Constant">[ </span> <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> <span id="L379" class="LineNr">379 </span> <span class="Comment"># press 'a'</span> -<span id="L380" class="LineNr">380 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">97/a</span> +<span id="L380" class="LineNr">380 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">97/a</span> <span id="L381" class="LineNr">381 </span> restart read-move-routine <span id="L382" class="LineNr">382 </span> <span class="Comment"># 'read-move' still waiting for input</span> <span id="L383" class="LineNr">383 </span> wait-for-routine-to-block read-move-routine @@ -446,7 +446,7 @@ if ('onhashchange' in window) { <span id="L386" class="LineNr">386 </span> assert waiting?, <span class="Constant">[ </span> <span id="L387" class="LineNr">387 </span><span class="Constant">F read-move-blocking: routine failed to pause after rank 'a']</span> <span id="L388" class="LineNr">388 </span> <span class="Comment"># press '2'</span> -<span id="L389" class="LineNr">389 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">50/'2'</span> +<span id="L389" class="LineNr">389 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">50/'2'</span> <span id="L390" class="LineNr">390 </span> restart read-move-routine <span id="L391" class="LineNr">391 </span> <span class="Comment"># 'read-move' still waiting for input</span> <span id="L392" class="LineNr">392 </span> wait-for-routine-to-block read-move-routine @@ -455,7 +455,7 @@ if ('onhashchange' in window) { <span id="L395" class="LineNr">395 </span> assert waiting?, <span class="Constant">[ </span> <span id="L396" class="LineNr">396 </span><span class="Constant">F read-move-blocking: routine failed to pause after file 'a2']</span> <span id="L397" class="LineNr">397 </span> <span class="Comment"># press '-'</span> -<span id="L398" class="LineNr">398 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">45/'-'</span> +<span id="L398" class="LineNr">398 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">45/'-'</span> <span id="L399" class="LineNr">399 </span> restart read-move-routine <span id="L400" class="LineNr">400 </span> <span class="Comment"># 'read-move' still waiting for input</span> <span id="L401" class="LineNr">401 </span> wait-for-routine-to-block read-move-routine @@ -464,7 +464,7 @@ if ('onhashchange' in window) { <span id="L404" class="LineNr">404 </span> assert waiting?, <span class="Constant">[ </span> <span id="L405" class="LineNr">405 </span><span class="Constant">F read-move-blocking: routine failed to pause after hyphen 'a2-']</span> <span id="L406" class="LineNr">406 </span> <span class="Comment"># press 'a'</span> -<span id="L407" class="LineNr">407 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">97/a</span> +<span id="L407" class="LineNr">407 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">97/a</span> <span id="L408" class="LineNr">408 </span> restart read-move-routine <span id="L409" class="LineNr">409 </span> <span class="Comment"># 'read-move' still waiting for input</span> <span id="L410" class="LineNr">410 </span> wait-for-routine-to-block read-move-routine @@ -473,7 +473,7 @@ if ('onhashchange' in window) { <span id="L413" class="LineNr">413 </span> assert waiting?, <span class="Constant">[ </span> <span id="L414" class="LineNr">414 </span><span class="Constant">F read-move-blocking: routine failed to pause after rank 'a2-a']</span> <span id="L415" class="LineNr">415 </span> <span class="Comment"># press '4'</span> -<span id="L416" class="LineNr">416 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">52/'4'</span> +<span id="L416" class="LineNr">416 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">52/'4'</span> <span id="L417" class="LineNr">417 </span> restart read-move-routine <span id="L418" class="LineNr">418 </span> <span class="Comment"># 'read-move' still waiting for input</span> <span id="L419" class="LineNr">419 </span> wait-for-routine-to-block read-move-routine @@ -482,7 +482,7 @@ if ('onhashchange' in window) { <span id="L422" class="LineNr">422 </span> assert waiting?, <span class="Constant">[ </span> <span id="L423" class="LineNr">423 </span><span class="Constant">F read-move-blocking: routine failed to pause after file 'a2-a4']</span> <span id="L424" class="LineNr">424 </span> <span class="Comment"># press 'newline'</span> -<span id="L425" class="LineNr">425 </span> sink <span class="Special"><-</span> write sink,<span class="Constant"> 10</span> <span class="Comment"># newline</span> +<span id="L425" class="LineNr">425 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink,<span class="Constant"> 10</span> <span class="Comment"># newline</span> <span id="L426" class="LineNr">426 </span> restart read-move-routine <span id="L427" class="LineNr">427 </span> <span class="Comment"># 'read-move' now completes</span> <span id="L428" class="LineNr">428 </span> wait-for-routine-to-block read-move-routine @@ -500,8 +500,8 @@ if ('onhashchange' in window) { <span id="L440" class="LineNr">440 </span><span class="muScenario">scenario</span> read-move-quit [ <span id="L441" class="LineNr">441 </span> <span class="Constant">local-scope</span> <span id="L442" class="LineNr">442 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> -<span id="L443" class="LineNr">443 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">2/capacity</span> -<span id="L444" class="LineNr">444 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, screen:&:screen +<span id="L443" class="LineNr">443 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> +<span id="L444" class="LineNr">444 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L445" class="LineNr">445 </span> run [ <span id="L446" class="LineNr">446 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L447" class="LineNr">447 </span> wait-for-routine-to-block read-move-routine @@ -510,7 +510,7 @@ if ('onhashchange' in window) { <span id="L450" class="LineNr">450 </span> assert waiting?, <span class="Constant">[ </span> <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> <span id="L452" class="LineNr">452 </span> <span class="Comment"># press 'q'</span> -<span id="L453" class="LineNr">453 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">113/q</span> +<span id="L453" class="LineNr">453 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">113/q</span> <span id="L454" class="LineNr">454 </span> restart read-move-routine <span id="L455" class="LineNr">455 </span> <span class="Comment"># 'read-move' completes</span> <span id="L456" class="LineNr">456 </span> wait-for-routine-to-block read-move-routine @@ -528,8 +528,8 @@ if ('onhashchange' in window) { <span id="L468" class="LineNr">468 </span><span class="muScenario">scenario</span> read-move-illegal-file [ <span id="L469" class="LineNr">469 </span> <span class="Constant">local-scope</span> <span id="L470" class="LineNr">470 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> -<span id="L471" class="LineNr">471 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">2/capacity</span> -<span id="L472" class="LineNr">472 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, screen:&:screen +<span id="L471" class="LineNr">471 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> +<span id="L472" class="LineNr">472 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L473" class="LineNr">473 </span> run [ <span id="L474" class="LineNr">474 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L475" class="LineNr">475 </span> wait-for-routine-to-block read-move-routine @@ -537,7 +537,7 @@ if ('onhashchange' in window) { <span id="L477" class="LineNr">477 </span> waiting?:bool <span class="Special"><-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span> <span id="L478" class="LineNr">478 </span> assert waiting?, <span class="Constant">[ </span> <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> -<span id="L480" class="LineNr">480 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">50/'2'</span> +<span id="L480" class="LineNr">480 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">50/'2'</span> <span id="L481" class="LineNr">481 </span> restart read-move-routine <span id="L482" class="LineNr">482 </span> wait-for-routine-to-block read-move-routine <span id="L483" class="LineNr">483 </span> ] @@ -550,8 +550,8 @@ if ('onhashchange' in window) { <span id="L490" class="LineNr">490 </span><span class="muScenario">scenario</span> read-move-illegal-rank [ <span id="L491" class="LineNr">491 </span> <span class="Constant">local-scope</span> <span id="L492" class="LineNr">492 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> -<span id="L493" class="LineNr">493 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">2/capacity</span> -<span id="L494" class="LineNr">494 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, screen:&:screen +<span id="L493" class="LineNr">493 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> +<span id="L494" class="LineNr">494 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L495" class="LineNr">495 </span> run [ <span id="L496" class="LineNr">496 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L497" class="LineNr">497 </span> wait-for-routine-to-block read-move-routine @@ -559,8 +559,8 @@ if ('onhashchange' in window) { <span id="L499" class="LineNr">499 </span> waiting?:bool <span class="Special"><-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span> <span id="L500" class="LineNr">500 </span> assert waiting?, <span class="Constant">[ </span> <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> -<span id="L502" class="LineNr">502 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">97/a</span> -<span id="L503" class="LineNr">503 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">97/a</span> +<span id="L502" class="LineNr">502 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">97/a</span> +<span id="L503" class="LineNr">503 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">97/a</span> <span id="L504" class="LineNr">504 </span> restart read-move-routine <span id="L505" class="LineNr">505 </span> wait-for-routine-to-block read-move-routine <span id="L506" class="LineNr">506 </span> ] @@ -573,8 +573,8 @@ if ('onhashchange' in window) { <span id="L513" class="LineNr">513 </span><span class="muScenario">scenario</span> read-move-empty [ <span id="L514" class="LineNr">514 </span> <span class="Constant">local-scope</span> <span id="L515" class="LineNr">515 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> -<span id="L516" class="LineNr">516 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel <span class="Constant">2/capacity</span> -<span id="L517" class="LineNr">517 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, screen:&:screen +<span id="L516" class="LineNr">516 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> +<span id="L517" class="LineNr">517 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L518" class="LineNr">518 </span> run [ <span id="L519" class="LineNr">519 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L520" class="LineNr">520 </span> wait-for-routine-to-block read-move-routine @@ -582,8 +582,8 @@ if ('onhashchange' in window) { <span id="L522" class="LineNr">522 </span> waiting?:bool <span class="Special"><-</span> not-equal read-move-state, <span class="Constant">2/discontinued</span> <span id="L523" class="LineNr">523 </span> assert waiting?, <span class="Constant">[ </span> <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> -<span id="L525" class="LineNr">525 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">10/newline</span> -<span id="L526" class="LineNr">526 </span> sink <span class="Special"><-</span> write sink, <span class="Constant">97/a</span> +<span id="L525" class="LineNr">525 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">10/newline</span> +<span id="L526" class="LineNr">526 </span> sink <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink, <span class="Constant">97/a</span> <span id="L527" class="LineNr">527 </span> restart read-move-routine <span id="L528" class="LineNr">528 </span> wait-for-routine-to-block read-move-routine <span id="L529" class="LineNr">529 </span> ] @@ -615,7 +615,7 @@ if ('onhashchange' in window) { <span id="L555" class="LineNr">555 </span> *move <span class="Special"><-</span> merge <span class="Constant">6/g</span>, <span class="Constant">1/'2'</span>, <span class="Constant">6/g</span>, <span class="Constant">3/'4'</span> <span id="L556" class="LineNr">556 </span> run [ <span id="L557" class="LineNr">557 </span> board <span class="Special"><-</span> make-move board, move -<span id="L558" class="LineNr">558 </span> screen:&:screen <span class="Special"><-</span> print-board screen:&:screen, board +<span id="L558" class="LineNr">558 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print-board <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board <span id="L559" class="LineNr">559 </span> ] <span id="L560" class="LineNr">560 </span> screen-should-contain [ <span id="L561" class="LineNr">561 </span> <span class="Comment"># 012345678901234567890123456789</span> diff --git a/html/console.mu.html b/html/console.mu.html index e0f22161..d7b98b0b 100644 --- a/html/console.mu.html +++ b/html/console.mu.html @@ -62,7 +62,7 @@ if ('onhashchange' in window) { <span id="L6" class="LineNr"> 6 </span> <span class="Constant">local-scope</span> <span id="L7" class="LineNr"> 7 </span> open-console <span id="L8" class="LineNr"> 8 </span> <span class="Delimiter">{</span> -<span id="L9" class="LineNr"> 9 </span> e:event, found?:bool <span class="Special"><-</span> check-for-interaction +<span id="L9" class="LineNr"> 9 </span> e:<a href='084console.mu.html#L4'>event</a>, found?:bool <span class="Special"><-</span> check-for-interaction <span id="L10" class="LineNr">10 </span> <span class="muControl">break-if</span> found? <span id="L11" class="LineNr">11 </span> print-character-to-display<span class="Constant"> 97</span>, <span class="Constant">7/white</span> <span id="L12" class="LineNr">12 </span> <span class="muControl">loop</span> diff --git a/html/edit/001-editor.mu.html b/html/edit/001-editor.mu.html index 7a05ea6d..3d19d408 100644 --- a/html/edit/001-editor.mu.html +++ b/html/edit/001-editor.mu.html @@ -65,10 +65,10 @@ if ('onhashchange' in window) { <span id="L6" class="LineNr"> 6 </span> <span class="Constant">local-scope</span> <span id="L7" class="LineNr"> 7 </span> <span class="Constant">load-ingredients</span> <span id="L8" class="LineNr"> 8 </span> open-console -<span id="L9" class="LineNr"> 9 </span> hide-screen <span class="Constant">0/screen</span> +<span id="L9" class="LineNr"> 9 </span> <a href='081print.mu.html#L623'>hide-screen</a> <span class="Constant">0/screen</span> <span id="L10" class="LineNr"> 10 </span> new-editor text, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L11" class="LineNr"> 11 </span> show-screen <span class="Constant">0/screen</span> -<span id="L12" class="LineNr"> 12 </span> wait-for-event <span class="Constant">0/console</span> +<span id="L11" class="LineNr"> 11 </span> <a href='081print.mu.html#L631'>show-screen</a> <span class="Constant">0/screen</span> +<span id="L12" class="LineNr"> 12 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> <span id="L13" class="LineNr"> 13 </span> close-console <span id="L14" class="LineNr"> 14 </span>] <span id="L15" class="LineNr"> 15 </span> @@ -77,7 +77,7 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr"> 18 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L19" class="LineNr"> 19 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> <span id="L20" class="LineNr"> 20 </span> run [ -<span id="L21" class="LineNr"> 21 </span> render screen, e +<span id="L21" class="LineNr"> 21 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L22" class="LineNr"> 22 </span> ] <span id="L23" class="LineNr"> 23 </span> screen-should-contain [ <span id="L24" class="LineNr"> 24 </span> <span class="Comment"># top line of screen reserved for menu</span> @@ -144,7 +144,7 @@ if ('onhashchange' in window) { <span id="L85" class="LineNr"> 85 </span> c:char <span class="Special"><-</span> index *text, idx <span id="L86" class="LineNr"> 86 </span> insert c, curr <span id="L87" class="LineNr"> 87 </span> <span class="Comment"># next iter</span> -<span id="L88" class="LineNr"> 88 </span> curr <span class="Special"><-</span> next curr +<span id="L88" class="LineNr"> 88 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L89" class="LineNr"> 89 </span> idx <span class="Special"><-</span> add idx,<span class="Constant"> 1</span> <span id="L90" class="LineNr"> 90 </span> <span class="muControl">loop</span> <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> @@ -178,17 +178,17 @@ if ('onhashchange' in window) { <span id="L119" class="LineNr">119 </span><span class="Comment"># Assumes cursor should be at coordinates (cursor-row, cursor-column) and</span> <span id="L120" class="LineNr">120 </span><span class="Comment"># updates before-cursor to match. Might also move coordinates if they're</span> <span id="L121" class="LineNr">121 </span><span class="Comment"># outside text.</span> -<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> render screen:&:screen, editor:&:editor<span class="muRecipe"> -> </span>last-row:num, last-column:num, screen:&:screen, editor:&:editor [ +<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> render <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor<span class="muRecipe"> -> </span>last-row:num, last-column:num, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor [ <span id="L123" class="LineNr">123 </span> <span class="Constant">local-scope</span> <span id="L124" class="LineNr">124 </span> <span class="Constant">load-ingredients</span> <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> <span id="L126" class="LineNr">126 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> -<span id="L127" class="LineNr">127 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L127" class="LineNr">127 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L128" class="LineNr">128 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> <span id="L129" class="LineNr">129 </span> <span class="Comment"># traversing editor</span> <span id="L130" class="LineNr">130 </span> curr:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> -<span id="L131" class="LineNr">131 </span> prev:&:duplex-list:char <span class="Special"><-</span> copy curr <span class="Comment"># just in case curr becomes null and we can't compute prev</span> -<span id="L132" class="LineNr">132 </span> curr <span class="Special"><-</span> next curr +<span id="L131" class="LineNr">131 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> copy curr <span class="Comment"># just in case curr becomes null and we can't compute prev</span> +<span id="L132" class="LineNr">132 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L133" class="LineNr">133 </span> <span class="Comment"># traversing screen</span> <span id="L134" class="LineNr">134 </span><span class="Constant"> +render-loop-initialization</span> <span id="L135" class="LineNr">135 </span> color:num <span class="Special"><-</span> copy <span class="Constant">7/white</span> @@ -197,11 +197,11 @@ if ('onhashchange' in window) { <span id="L138" class="LineNr">138 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L139" class="LineNr">139 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> <span id="L140" class="LineNr">140 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> -<span id="L141" class="LineNr">141 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L141" class="LineNr">141 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L142" class="LineNr">142 </span> <span class="Delimiter">{</span> <span id="L143" class="LineNr">143 </span><span class="Constant"> +next-character</span> <span id="L144" class="LineNr">144 </span> <span class="muControl">break-unless</span> curr -<span id="L145" class="LineNr">145 </span> off-screen?:bool <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L145" class="LineNr">145 </span> off-screen?:bool <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L146" class="LineNr">146 </span> <span class="muControl">break-if</span> off-screen? <span id="L147" class="LineNr">147 </span> <span class="Comment"># update editor.before-cursor</span> <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> @@ -211,7 +211,7 @@ if ('onhashchange' in window) { <span id="L152" class="LineNr">152 </span> <span class="muControl">break-unless</span> at-cursor-row? <span id="L153" class="LineNr">153 </span> at-cursor?:bool <span class="Special"><-</span> equal column, cursor-column <span id="L154" class="LineNr">154 </span> <span class="muControl">break-unless</span> at-cursor? -<span id="L155" class="LineNr">155 </span> before-cursor <span class="Special"><-</span> copy prev +<span id="L155" class="LineNr">155 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L156" class="LineNr">156 </span> <span class="Delimiter">}</span> <span id="L157" class="LineNr">157 </span> c:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L158" class="LineNr">158 </span><span class="Constant"> <character-c-received></span> @@ -226,16 +226,16 @@ if ('onhashchange' in window) { <span id="L167" class="LineNr">167 </span> left-of-cursor?:bool <span class="Special"><-</span> lesser-than column, cursor-column <span id="L168" class="LineNr">168 </span> <span class="muControl">break-unless</span> left-of-cursor? <span id="L169" class="LineNr">169 </span> cursor-column <span class="Special"><-</span> copy column -<span id="L170" class="LineNr">170 </span> before-cursor <span class="Special"><-</span> prev curr +<span id="L170" class="LineNr">170 </span> before-cursor <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> curr <span id="L171" class="LineNr">171 </span> <span class="Delimiter">}</span> <span id="L172" class="LineNr">172 </span> <span class="Comment"># clear rest of line in this window</span> -<span id="L173" class="LineNr">173 </span> clear-line-until screen, right +<span id="L173" class="LineNr">173 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L174" class="LineNr">174 </span> <span class="Comment"># skip to next line</span> <span id="L175" class="LineNr">175 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L176" class="LineNr">176 </span> column <span class="Special"><-</span> copy left -<span id="L177" class="LineNr">177 </span> screen <span class="Special"><-</span> move-cursor screen, row, column -<span id="L178" class="LineNr">178 </span> curr <span class="Special"><-</span> next curr -<span id="L179" class="LineNr">179 </span> prev <span class="Special"><-</span> next prev +<span id="L177" class="LineNr">177 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column +<span id="L178" class="LineNr">178 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr +<span id="L179" class="LineNr">179 </span> <a href='065duplex_list.mu.html#L36'>prev</a> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L180" class="LineNr">180 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L181" class="LineNr">181 </span> <span class="Delimiter">}</span> <span id="L182" class="LineNr">182 </span> <span class="Delimiter">{</span> @@ -245,16 +245,16 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr">186 </span> <span class="muControl">break-unless</span> at-right? <span id="L187" class="LineNr">187 </span> <span class="Comment"># print wrap icon</span> <span id="L188" class="LineNr">188 </span> wrap-icon:char <span class="Special"><-</span> copy <span class="Constant">8617/loop-back-to-left</span> -<span id="L189" class="LineNr">189 </span> print screen, wrap-icon, <span class="Constant">245/grey</span> +<span id="L189" class="LineNr">189 </span> print <a href='081print.mu.html#L4'>screen</a>, wrap-icon, <span class="Constant">245/grey</span> <span id="L190" class="LineNr">190 </span> column <span class="Special"><-</span> copy left <span id="L191" class="LineNr">191 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L192" class="LineNr">192 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L192" class="LineNr">192 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L193" class="LineNr">193 </span> <span class="Comment"># don't increment curr</span> <span id="L194" class="LineNr">194 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L195" class="LineNr">195 </span> <span class="Delimiter">}</span> -<span id="L196" class="LineNr">196 </span> print screen, c, color -<span id="L197" class="LineNr">197 </span> curr <span class="Special"><-</span> next curr -<span id="L198" class="LineNr">198 </span> prev <span class="Special"><-</span> next prev +<span id="L196" class="LineNr">196 </span> print <a href='081print.mu.html#L4'>screen</a>, c, color +<span id="L197" class="LineNr">197 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr +<span id="L198" class="LineNr">198 </span> <a href='065duplex_list.mu.html#L36'>prev</a> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L199" class="LineNr">199 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L200" class="LineNr">200 </span> <span class="muControl">loop</span> <span id="L201" class="LineNr">201 </span> <span class="Delimiter">}</span> @@ -270,7 +270,7 @@ if ('onhashchange' in window) { <span id="L211" class="LineNr">211 </span> <span class="muControl">break-unless</span> before-cursor? <span id="L212" class="LineNr">212 </span> cursor-row <span class="Special"><-</span> copy row <span id="L213" class="LineNr">213 </span> cursor-column <span class="Special"><-</span> copy column -<span id="L214" class="LineNr">214 </span> before-cursor <span class="Special"><-</span> copy prev +<span id="L214" class="LineNr">214 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L215" class="LineNr">215 </span> <span class="Delimiter">}</span> <span id="L216" class="LineNr">216 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">bottom:offset</span>, row <span id="L217" class="LineNr">217 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row @@ -279,32 +279,32 @@ if ('onhashchange' in window) { <span id="L220" class="LineNr">220 </span> <span class="muControl">return</span> row, column <span id="L221" class="LineNr">221 </span>] <span id="L222" class="LineNr">222 </span> -<span id="L223" class="LineNr">223 </span><span class="muRecipe">def</span> clear-screen-from screen:&:screen, row:num, column:num, left:num, right:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L223" class="LineNr">223 </span><span class="muRecipe">def</span> clear-screen-from <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, row:num, column:num, left:num, right:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L224" class="LineNr">224 </span> <span class="Constant">local-scope</span> <span id="L225" class="LineNr">225 </span> <span class="Constant">load-ingredients</span> <span id="L226" class="LineNr">226 </span> <span class="Comment"># if it's the real screen, use the optimized primitive</span> <span id="L227" class="LineNr">227 </span> <span class="Delimiter">{</span> -<span id="L228" class="LineNr">228 </span> <span class="muControl">break-if</span> screen +<span id="L228" class="LineNr">228 </span> <span class="muControl">break-if</span> <a href='081print.mu.html#L4'>screen</a> <span id="L229" class="LineNr">229 </span> clear-display-from row, column, left, right <span id="L230" class="LineNr">230 </span> <span class="muControl">return</span> <span id="L231" class="LineNr">231 </span> <span class="Delimiter">}</span> <span id="L232" class="LineNr">232 </span> <span class="Comment"># if not, go the slower route</span> -<span id="L233" class="LineNr">233 </span> screen <span class="Special"><-</span> move-cursor screen, row, column -<span id="L234" class="LineNr">234 </span> clear-line-until screen, right -<span id="L235" class="LineNr">235 </span> clear-rest-of-screen screen, row, left, right +<span id="L233" class="LineNr">233 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column +<span id="L234" class="LineNr">234 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right +<span id="L235" class="LineNr">235 </span> clear-rest-of-screen <a href='081print.mu.html#L4'>screen</a>, row, left, right <span id="L236" class="LineNr">236 </span>] <span id="L237" class="LineNr">237 </span> -<span id="L238" class="LineNr">238 </span><span class="muRecipe">def</span> clear-rest-of-screen screen:&:screen, row:num, left:num, right:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L238" class="LineNr">238 </span><span class="muRecipe">def</span> clear-rest-of-screen <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, row:num, left:num, right:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L239" class="LineNr">239 </span> <span class="Constant">local-scope</span> <span id="L240" class="LineNr">240 </span> <span class="Constant">load-ingredients</span> <span id="L241" class="LineNr">241 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L242" class="LineNr">242 </span> screen <span class="Special"><-</span> move-cursor screen, row, left -<span id="L243" class="LineNr">243 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L242" class="LineNr">242 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, left +<span id="L243" class="LineNr">243 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L244" class="LineNr">244 </span> <span class="Delimiter">{</span> -<span id="L245" class="LineNr">245 </span> at-bottom-of-screen?:bool <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L245" class="LineNr">245 </span> at-bottom-of-screen?:bool <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L246" class="LineNr">246 </span> <span class="muControl">break-if</span> at-bottom-of-screen? -<span id="L247" class="LineNr">247 </span> screen <span class="Special"><-</span> move-cursor screen, row, left -<span id="L248" class="LineNr">248 </span> clear-line-until screen, right +<span id="L247" class="LineNr">247 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, left +<span id="L248" class="LineNr">248 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L249" class="LineNr">249 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L250" class="LineNr">250 </span> <span class="muControl">loop</span> <span id="L251" class="LineNr">251 </span> <span class="Delimiter">}</span> @@ -317,7 +317,7 @@ if ('onhashchange' in window) { <span id="L258" class="LineNr">258 </span><span class="Constant">def]</span> <span id="L259" class="LineNr">259 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L260" class="LineNr">260 </span> run [ -<span id="L261" class="LineNr">261 </span> render screen, e +<span id="L261" class="LineNr">261 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L262" class="LineNr">262 </span> ] <span id="L263" class="LineNr">263 </span> screen-should-contain [ <span id="L264" class="LineNr">264 </span> <span class="Constant"> . .</span> @@ -332,7 +332,7 @@ if ('onhashchange' in window) { <span id="L273" class="LineNr">273 </span> assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span> <span id="L274" class="LineNr">274 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">1/left</span>, <span class="Constant">5/right</span> <span id="L275" class="LineNr">275 </span> run [ -<span id="L276" class="LineNr">276 </span> render screen, e +<span id="L276" class="LineNr">276 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L277" class="LineNr">277 </span> ] <span id="L278" class="LineNr">278 </span> screen-should-contain [ <span id="L279" class="LineNr">279 </span> <span class="Constant"> . .</span> @@ -348,7 +348,7 @@ if ('onhashchange' in window) { <span id="L289" class="LineNr">289 </span><span class="Constant">def]</span> <span id="L290" class="LineNr">290 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">1/left</span>, <span class="Constant">5/right</span> <span id="L291" class="LineNr">291 </span> run [ -<span id="L292" class="LineNr">292 </span> render screen, e +<span id="L292" class="LineNr">292 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L293" class="LineNr">293 </span> ] <span id="L294" class="LineNr">294 </span> screen-should-contain [ <span id="L295" class="LineNr">295 </span> <span class="Constant"> . .</span> @@ -363,7 +363,7 @@ if ('onhashchange' in window) { <span id="L304" class="LineNr">304 </span> assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span> <span id="L305" class="LineNr">305 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc def]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L306" class="LineNr">306 </span> run [ -<span id="L307" class="LineNr">307 </span> render screen, e +<span id="L307" class="LineNr">307 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L308" class="LineNr">308 </span> ] <span id="L309" class="LineNr">309 </span> screen-should-contain [ <span id="L310" class="LineNr">310 </span> <span class="Constant"> . .</span> @@ -384,7 +384,7 @@ if ('onhashchange' in window) { <span id="L325" class="LineNr">325 </span> assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span> <span id="L326" class="LineNr">326 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L327" class="LineNr">327 </span> run [ -<span id="L328" class="LineNr">328 </span> render screen, e +<span id="L328" class="LineNr">328 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L329" class="LineNr">329 </span> ] <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> <span id="L331" class="LineNr">331 </span> <span class="Comment"># end of the line</span> @@ -407,7 +407,7 @@ if ('onhashchange' in window) { <span id="L348" class="LineNr">348 </span> assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span> <span id="L349" class="LineNr">349 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L350" class="LineNr">350 </span> run [ -<span id="L351" class="LineNr">351 </span> render screen, e +<span id="L351" class="LineNr">351 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L352" class="LineNr">352 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L353" class="LineNr">353 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L354" class="LineNr">354 </span> ] @@ -432,7 +432,7 @@ if ('onhashchange' in window) { <span id="L373" class="LineNr">373 </span><span class="Constant">f]</span> <span id="L374" class="LineNr">374 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> <span id="L375" class="LineNr">375 </span> run [ -<span id="L376" class="LineNr">376 </span> render screen, e +<span id="L376" class="LineNr">376 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L377" class="LineNr">377 </span> ] <span id="L378" class="LineNr">378 </span> screen-should-contain [ <span id="L379" class="LineNr">379 </span> <span class="Constant"> . .</span> @@ -515,7 +515,7 @@ if ('onhashchange' in window) { <span id="L456" class="LineNr">456 </span><span class="Constant">f]</span> <span id="L457" class="LineNr">457 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">8/right</span> <span id="L458" class="LineNr">458 </span> run [ -<span id="L459" class="LineNr">459 </span> render screen, e +<span id="L459" class="LineNr">459 </span> render <a href='081print.mu.html#L4'>screen</a>, e <span id="L460" class="LineNr">460 </span> ] <span id="L461" class="LineNr">461 </span> screen-should-contain [ <span id="L462" class="LineNr">462 </span> <span class="Constant"> . .</span> diff --git a/html/edit/002-typing.mu.html b/html/edit/002-typing.mu.html index ad215a8f..e6d55bfc 100644 --- a/html/edit/002-typing.mu.html +++ b/html/edit/002-typing.mu.html @@ -70,7 +70,7 @@ if ('onhashchange' in window) { <span id="L11" class="LineNr"> 11 </span> close-console <span id="L12" class="LineNr"> 12 </span>] <span id="L13" class="LineNr"> 13 </span> -<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> editor-event-loop screen:&:screen, console:&:console, editor:&:editor<span class="muRecipe"> -> </span>screen:&:screen, console:&:console, editor:&:editor [ +<span id="L14" class="LineNr"> 14 </span><span class="muRecipe">def</span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a>, editor:&:editor<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a>, editor:&:editor [ <span id="L15" class="LineNr"> 15 </span> <span class="Constant">local-scope</span> <span id="L16" class="LineNr"> 16 </span> <span class="Constant">load-ingredients</span> <span id="L17" class="LineNr"> 17 </span> <span class="Delimiter">{</span> @@ -78,25 +78,25 @@ if ('onhashchange' in window) { <span id="L19" class="LineNr"> 19 </span><span class="Constant"> +next-event</span> <span id="L20" class="LineNr"> 20 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L21" class="LineNr"> 21 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> -<span id="L22" class="LineNr"> 22 </span> screen <span class="Special"><-</span> move-cursor screen, cursor-row, cursor-column -<span id="L23" class="LineNr"> 23 </span> e:event, found?:bool, quit?:bool, console <span class="Special"><-</span> read-event console +<span id="L22" class="LineNr"> 22 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, cursor-row, cursor-column +<span id="L23" class="LineNr"> 23 </span> e:<a href='084console.mu.html#L4'>event</a>, found?:bool, quit?:bool, <a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> <a href='084console.mu.html#L35'>read-event</a> <a href='084console.mu.html#L23'>console</a> <span id="L24" class="LineNr"> 24 </span> <span class="muControl">loop-unless</span> found? <span id="L25" class="LineNr"> 25 </span> <span class="muControl">break-if</span> quit? <span class="Comment"># only in tests</span> <span id="L26" class="LineNr"> 26 </span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span> <span id="L27" class="LineNr"> 27 </span> <span class="Comment"># 'touch' event</span> -<span id="L28" class="LineNr"> 28 </span> t:touch-event, is-touch?:bool <span class="Special"><-</span> maybe-convert e, <span class="Constant">touch:variant</span> +<span id="L28" class="LineNr"> 28 </span> t:<a href='084console.mu.html#L12'>touch-event</a>, is-touch?:bool <span class="Special"><-</span> maybe-convert e, <span class="Constant">touch:variant</span> <span id="L29" class="LineNr"> 29 </span> <span class="Delimiter">{</span> <span id="L30" class="LineNr"> 30 </span> <span class="muControl">break-unless</span> is-touch? -<span id="L31" class="LineNr"> 31 </span> move-cursor-in-editor screen, editor, t +<span id="L31" class="LineNr"> 31 </span> move-cursor-in-editor <a href='081print.mu.html#L4'>screen</a>, editor, t <span id="L32" class="LineNr"> 32 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L33" class="LineNr"> 33 </span> <span class="Delimiter">}</span> <span id="L34" class="LineNr"> 34 </span> <span class="Comment"># keyboard events</span> <span id="L35" class="LineNr"> 35 </span> <span class="Delimiter">{</span> <span id="L36" class="LineNr"> 36 </span> <span class="muControl">break-if</span> is-touch? -<span id="L37" class="LineNr"> 37 </span> go-render?:bool <span class="Special"><-</span> handle-keyboard-event screen, editor, e +<span id="L37" class="LineNr"> 37 </span> go-render?:bool <span class="Special"><-</span> handle-keyboard-event <a href='081print.mu.html#L4'>screen</a>, editor, e <span id="L38" class="LineNr"> 38 </span> <span class="Delimiter">{</span> <span id="L39" class="LineNr"> 39 </span> <span class="muControl">break-unless</span> go-render? -<span id="L40" class="LineNr"> 40 </span> screen <span class="Special"><-</span> editor-render screen, editor +<span id="L40" class="LineNr"> 40 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> editor-render <a href='081print.mu.html#L4'>screen</a>, editor <span id="L41" class="LineNr"> 41 </span> <span class="Delimiter">}</span> <span id="L42" class="LineNr"> 42 </span> <span class="Delimiter">}</span> <span id="L43" class="LineNr"> 43 </span> <span class="muControl">loop</span> @@ -104,7 +104,7 @@ if ('onhashchange' in window) { <span id="L45" class="LineNr"> 45 </span>] <span id="L46" class="LineNr"> 46 </span> <span id="L47" class="LineNr"> 47 </span><span class="Comment"># process click, return if it was on current editor</span> -<span id="L48" class="LineNr"> 48 </span><span class="muRecipe">def</span> move-cursor-in-editor screen:&:screen, editor:&:editor, t:touch-event<span class="muRecipe"> -> </span>in-focus?:bool, editor:&:editor [ +<span id="L48" class="LineNr"> 48 </span><span class="muRecipe">def</span> move-cursor-in-editor <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor, t:<a href='084console.mu.html#L12'>touch-event</a><span class="muRecipe"> -> </span>in-focus?:bool, editor:&:editor [ <span id="L49" class="LineNr"> 49 </span> <span class="Constant">local-scope</span> <span id="L50" class="LineNr"> 50 </span> <span class="Constant">load-ingredients</span> <span id="L51" class="LineNr"> 51 </span> <span class="muControl">return-unless</span> editor, <span class="Constant">0/false</span> @@ -119,7 +119,7 @@ if ('onhashchange' in window) { <span id="L60" class="LineNr"> 60 </span> <span class="muControl">return-if</span> too-far-right?, <span class="Constant">0/false</span> <span id="L61" class="LineNr"> 61 </span> <span class="Comment"># position cursor</span> <span id="L62" class="LineNr"> 62 </span><span class="Constant"> <move-cursor-begin></span> -<span id="L63" class="LineNr"> 63 </span> editor <span class="Special"><-</span> snap-cursor screen, editor, click-row, click-column +<span id="L63" class="LineNr"> 63 </span> editor <span class="Special"><-</span> snap-cursor <a href='081print.mu.html#L4'>screen</a>, editor, click-row, click-column <span id="L64" class="LineNr"> 64 </span> undo-coalesce-tag:num <span class="Special"><-</span> copy <span class="Constant">0/never</span> <span id="L65" class="LineNr"> 65 </span><span class="Constant"> <move-cursor-end></span> <span id="L66" class="LineNr"> 66 </span> <span class="Comment"># gain focus</span> @@ -129,17 +129,17 @@ if ('onhashchange' in window) { <span id="L70" class="LineNr"> 70 </span><span class="Comment"># Variant of 'render' that only moves the cursor (coordinates and</span> <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> <span id="L72" class="LineNr"> 72 </span><span class="Comment"># past the last line it positions at end of last line.</span> -<span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> snap-cursor screen:&:screen, editor:&:editor, target-row:num, target-column:num<span class="muRecipe"> -> </span>editor:&:editor [ +<span id="L73" class="LineNr"> 73 </span><span class="muRecipe">def</span> snap-cursor <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor, target-row:num, target-column:num<span class="muRecipe"> -> </span>editor:&:editor [ <span id="L74" class="LineNr"> 74 </span> <span class="Constant">local-scope</span> <span id="L75" class="LineNr"> 75 </span> <span class="Constant">load-ingredients</span> <span id="L76" class="LineNr"> 76 </span> <span class="muControl">return-unless</span> editor <span id="L77" class="LineNr"> 77 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> <span id="L78" class="LineNr"> 78 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> -<span id="L79" class="LineNr"> 79 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L79" class="LineNr"> 79 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L80" class="LineNr"> 80 </span> <span class="Comment"># count newlines until screen row</span> <span id="L81" class="LineNr"> 81 </span> curr:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> -<span id="L82" class="LineNr"> 82 </span> prev:&:duplex-list:char <span class="Special"><-</span> copy curr <span class="Comment"># just in case curr becomes null and we can't compute prev</span> -<span id="L83" class="LineNr"> 83 </span> curr <span class="Special"><-</span> next curr +<span id="L82" class="LineNr"> 82 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> copy curr <span class="Comment"># just in case curr becomes null and we can't compute prev</span> +<span id="L83" class="LineNr"> 83 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L84" class="LineNr"> 84 </span> row:num <span class="Special"><-</span> copy <span class="Constant">1/top</span> <span id="L85" class="LineNr"> 85 </span> column:num <span class="Special"><-</span> copy left <span id="L86" class="LineNr"> 86 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, target-row @@ -150,7 +150,7 @@ if ('onhashchange' in window) { <span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">{</span> <span id="L92" class="LineNr"> 92 </span><span class="Constant"> +next-character</span> <span id="L93" class="LineNr"> 93 </span> <span class="muControl">break-unless</span> curr -<span id="L94" class="LineNr"> 94 </span> off-screen?:bool <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L94" class="LineNr"> 94 </span> off-screen?:bool <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L95" class="LineNr"> 95 </span> <span class="muControl">break-if</span> off-screen? <span id="L96" class="LineNr"> 96 </span> <span class="Comment"># update editor.before-cursor</span> <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> @@ -160,7 +160,7 @@ if ('onhashchange' in window) { <span id="L101" class="LineNr"> 101 </span> <span class="muControl">break-unless</span> at-cursor-row? <span id="L102" class="LineNr"> 102 </span> at-cursor?:bool <span class="Special"><-</span> equal column, cursor-column <span id="L103" class="LineNr"> 103 </span> <span class="muControl">break-unless</span> at-cursor? -<span id="L104" class="LineNr"> 104 </span> before-cursor <span class="Special"><-</span> copy prev +<span id="L104" class="LineNr"> 104 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L105" class="LineNr"> 105 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L106" class="LineNr"> 106 </span> <span class="Delimiter">}</span> <span id="L107" class="LineNr"> 107 </span> c:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> @@ -176,14 +176,14 @@ if ('onhashchange' in window) { <span id="L117" class="LineNr"> 117 </span> <span class="muControl">break-unless</span> left-of-cursor? <span id="L118" class="LineNr"> 118 </span> cursor-column <span class="Special"><-</span> copy column <span id="L119" class="LineNr"> 119 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column -<span id="L120" class="LineNr"> 120 </span> before-cursor <span class="Special"><-</span> copy prev +<span id="L120" class="LineNr"> 120 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L121" class="LineNr"> 121 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L122" class="LineNr"> 122 </span> <span class="Delimiter">}</span> <span id="L123" class="LineNr"> 123 </span> <span class="Comment"># skip to next line</span> <span id="L124" class="LineNr"> 124 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L125" class="LineNr"> 125 </span> column <span class="Special"><-</span> copy left -<span id="L126" class="LineNr"> 126 </span> curr <span class="Special"><-</span> next curr -<span id="L127" class="LineNr"> 127 </span> prev <span class="Special"><-</span> next prev +<span id="L126" class="LineNr"> 126 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr +<span id="L127" class="LineNr"> 127 </span> <a href='065duplex_list.mu.html#L36'>prev</a> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L128" class="LineNr"> 128 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L129" class="LineNr"> 129 </span> <span class="Delimiter">}</span> <span id="L130" class="LineNr"> 130 </span> <span class="Delimiter">{</span> @@ -196,8 +196,8 @@ if ('onhashchange' in window) { <span id="L137" class="LineNr"> 137 </span> <span class="Comment"># don't increment curr/prev</span> <span id="L138" class="LineNr"> 138 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L139" class="LineNr"> 139 </span> <span class="Delimiter">}</span> -<span id="L140" class="LineNr"> 140 </span> curr <span class="Special"><-</span> next curr -<span id="L141" class="LineNr"> 141 </span> prev <span class="Special"><-</span> next prev +<span id="L140" class="LineNr"> 140 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr +<span id="L141" class="LineNr"> 141 </span> <a href='065duplex_list.mu.html#L36'>prev</a> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L142" class="LineNr"> 142 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L143" class="LineNr"> 143 </span> <span class="muControl">loop</span> <span id="L144" class="LineNr"> 144 </span> <span class="Delimiter">}</span> @@ -213,19 +213,19 @@ if ('onhashchange' in window) { <span id="L154" class="LineNr"> 154 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L155" class="LineNr"> 155 </span> cursor-column <span class="Special"><-</span> copy column <span id="L156" class="LineNr"> 156 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column -<span id="L157" class="LineNr"> 157 </span> before-cursor <span class="Special"><-</span> copy prev +<span id="L157" class="LineNr"> 157 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L158" class="LineNr"> 158 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L159" class="LineNr"> 159 </span> <span class="Delimiter">}</span> <span id="L160" class="LineNr"> 160 </span>] <span id="L161" class="LineNr"> 161 </span> <span id="L162" class="LineNr"> 162 </span><span class="Comment"># Process an event 'e' and try to minimally update the screen.</span> <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> -<span id="L164" class="LineNr"> 164 </span><span class="muRecipe">def</span> handle-keyboard-event screen:&:screen, editor:&:editor, e:event<span class="muRecipe"> -> </span>go-render?:bool, screen:&:screen, editor:&:editor [ +<span id="L164" class="LineNr"> 164 </span><span class="muRecipe">def</span> handle-keyboard-event <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor, e:<a href='084console.mu.html#L4'>event</a><span class="muRecipe"> -> </span>go-render?:bool, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor [ <span id="L165" class="LineNr"> 165 </span> <span class="Constant">local-scope</span> <span id="L166" class="LineNr"> 166 </span> <span class="Constant">load-ingredients</span> <span id="L167" class="LineNr"> 167 </span> <span class="muControl">return-unless</span> editor, <span class="Constant">0/don't-render</span> -<span id="L168" class="LineNr"> 168 </span> screen-width:num <span class="Special"><-</span> screen-width screen -<span id="L169" class="LineNr"> 169 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L168" class="LineNr"> 168 </span> <a href='081print.mu.html#L581'>screen-width</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L169" class="LineNr"> 169 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L170" class="LineNr"> 170 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> <span id="L171" class="LineNr"> 171 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> <span id="L172" class="LineNr"> 172 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> @@ -245,24 +245,24 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr"> 186 </span> <span class="muControl">return-unless</span> regular-character?, <span class="Constant">0/don't-render</span> <span id="L187" class="LineNr"> 187 </span> <span class="Comment"># otherwise type it in</span> <span id="L188" class="LineNr"> 188 </span><span class="Constant"> <insert-character-begin></span> -<span id="L189" class="LineNr"> 189 </span> go-render? <span class="Special"><-</span> insert-at-cursor editor, c, screen +<span id="L189" class="LineNr"> 189 </span> go-render? <span class="Special"><-</span> insert-at-cursor editor, c, <a href='081print.mu.html#L4'>screen</a> <span id="L190" class="LineNr"> 190 </span><span class="Constant"> <insert-character-end></span> <span id="L191" class="LineNr"> 191 </span> <span class="muControl">return</span> <span id="L192" class="LineNr"> 192 </span> <span class="Delimiter">}</span> <span id="L193" class="LineNr"> 193 </span> <span class="Comment"># special key to modify the text or move the cursor</span> -<span id="L194" class="LineNr"> 194 </span> k:num, is-keycode?:bool <span class="Special"><-</span> maybe-convert e:event, <span class="Constant">keycode:variant</span> +<span id="L194" class="LineNr"> 194 </span> k:num, is-keycode?:bool <span class="Special"><-</span> maybe-convert e:<a href='084console.mu.html#L4'>event</a>, <span class="Constant">keycode:variant</span> <span id="L195" class="LineNr"> 195 </span> assert is-keycode?, <span class="Constant">[event was of unknown type; neither keyboard nor mouse]</span> <span id="L196" class="LineNr"> 196 </span> <span class="Comment"># handlers for each special key will go here</span> <span id="L197" class="LineNr"> 197 </span><span class="Constant"> <handle-special-key></span> <span id="L198" class="LineNr"> 198 </span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L199" class="LineNr"> 199 </span>] <span id="L200" class="LineNr"> 200 </span> -<span id="L201" class="LineNr"> 201 </span><span class="muRecipe">def</span> insert-at-cursor editor:&:editor, c:char, screen:&:screen<span class="muRecipe"> -> </span>go-render?:bool, editor:&:editor, screen:&:screen [ +<span id="L201" class="LineNr"> 201 </span><span class="muRecipe">def</span> insert-at-cursor editor:&:editor, c:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>go-render?:bool, editor:&:editor, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L202" class="LineNr"> 202 </span> <span class="Constant">local-scope</span> <span id="L203" class="LineNr"> 203 </span> <span class="Constant">load-ingredients</span> <span id="L204" class="LineNr"> 204 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L205" class="LineNr"> 205 </span> insert c, before-cursor -<span id="L206" class="LineNr"> 206 </span> before-cursor <span class="Special"><-</span> next before-cursor +<span id="L206" class="LineNr"> 206 </span> before-cursor <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L207" class="LineNr"> 207 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L208" class="LineNr"> 208 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L209" class="LineNr"> 209 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> @@ -270,34 +270,34 @@ if ('onhashchange' in window) { <span id="L211" class="LineNr"> 211 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> <span id="L212" class="LineNr"> 212 </span> save-row:num <span class="Special"><-</span> copy cursor-row <span id="L213" class="LineNr"> 213 </span> save-column:num <span class="Special"><-</span> copy cursor-column -<span id="L214" class="LineNr"> 214 </span> screen-width:num <span class="Special"><-</span> screen-width screen -<span id="L215" class="LineNr"> 215 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L214" class="LineNr"> 214 </span> <a href='081print.mu.html#L581'>screen-width</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L215" class="LineNr"> 215 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L216" class="LineNr"> 216 </span> <span class="Comment"># occasionally we'll need to mess with the cursor</span> <span id="L217" class="LineNr"> 217 </span><span class="Constant"> <insert-character-special-case></span> <span id="L218" class="LineNr"> 218 </span> <span class="Comment"># but mostly we'll just move the cursor right</span> <span id="L219" class="LineNr"> 219 </span> cursor-column <span class="Special"><-</span> add cursor-column,<span class="Constant"> 1</span> <span id="L220" class="LineNr"> 220 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column -<span id="L221" class="LineNr"> 221 </span> next:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L221" class="LineNr"> 221 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L222" class="LineNr"> 222 </span> <span class="Delimiter">{</span> <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> -<span id="L224" class="LineNr"> 224 </span> at-end?:bool <span class="Special"><-</span> equal next, <span class="Constant">0/null</span> +<span id="L224" class="LineNr"> 224 </span> at-end?:bool <span class="Special"><-</span> equal <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/null</span> <span id="L225" class="LineNr"> 225 </span> <span class="muControl">break-unless</span> at-end? -<span id="L226" class="LineNr"> 226 </span> bottom:num <span class="Special"><-</span> subtract screen-height,<span class="Constant"> 1</span> +<span id="L226" class="LineNr"> 226 </span> bottom:num <span class="Special"><-</span> subtract <a href='081print.mu.html#L594'>screen-height</a>,<span class="Constant"> 1</span> <span id="L227" class="LineNr"> 227 </span> at-bottom?:bool <span class="Special"><-</span> equal save-row, bottom <span id="L228" class="LineNr"> 228 </span> at-right?:bool <span class="Special"><-</span> equal save-column, right <span id="L229" class="LineNr"> 229 </span> overflow?:bool <span class="Special"><-</span> and at-bottom?, at-right? <span id="L230" class="LineNr"> 230 </span> <span class="muControl">break-if</span> overflow? -<span id="L231" class="LineNr"> 231 </span> move-cursor screen, save-row, save-column -<span id="L232" class="LineNr"> 232 </span> print screen, c +<span id="L231" class="LineNr"> 231 </span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, save-row, save-column +<span id="L232" class="LineNr"> 232 </span> print <a href='081print.mu.html#L4'>screen</a>, c <span id="L233" class="LineNr"> 233 </span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span> <span id="L234" class="LineNr"> 234 </span> <span class="Delimiter">}</span> <span id="L235" class="LineNr"> 235 </span> <span class="Delimiter">{</span> <span id="L236" class="LineNr"> 236 </span> <span class="Comment"># not at right margin? print the character and rest of line</span> -<span id="L237" class="LineNr"> 237 </span> <span class="muControl">break-unless</span> next -<span id="L238" class="LineNr"> 238 </span> at-right?:bool <span class="Special"><-</span> greater-or-equal cursor-column, screen-width +<span id="L237" class="LineNr"> 237 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L29'>next</a> +<span id="L238" class="LineNr"> 238 </span> at-right?:bool <span class="Special"><-</span> greater-or-equal cursor-column, <a href='081print.mu.html#L581'>screen-width</a> <span id="L239" class="LineNr"> 239 </span> <span class="muControl">break-if</span> at-right? <span id="L240" class="LineNr"> 240 </span> curr:&:duplex-list:char <span class="Special"><-</span> copy before-cursor -<span id="L241" class="LineNr"> 241 </span> move-cursor screen, save-row, save-column +<span id="L241" class="LineNr"> 241 </span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, save-row, save-column <span id="L242" class="LineNr"> 242 </span> curr-column:num <span class="Special"><-</span> copy save-column <span id="L243" class="LineNr"> 243 </span> <span class="Delimiter">{</span> <span id="L244" class="LineNr"> 244 </span> <span class="Comment"># hit right margin? give up and let caller render</span> @@ -308,9 +308,9 @@ if ('onhashchange' in window) { <span id="L249" class="LineNr"> 249 </span> currc:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L250" class="LineNr"> 250 </span> at-newline?:bool <span class="Special"><-</span> equal currc, <span class="Constant">10/newline</span> <span id="L251" class="LineNr"> 251 </span> <span class="muControl">break-if</span> at-newline? -<span id="L252" class="LineNr"> 252 </span> print screen, currc +<span id="L252" class="LineNr"> 252 </span> print <a href='081print.mu.html#L4'>screen</a>, currc <span id="L253" class="LineNr"> 253 </span> curr-column <span class="Special"><-</span> add curr-column,<span class="Constant"> 1</span> -<span id="L254" class="LineNr"> 254 </span> curr <span class="Special"><-</span> next curr +<span id="L254" class="LineNr"> 254 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L255" class="LineNr"> 255 </span> <span class="muControl">loop</span> <span id="L256" class="LineNr"> 256 </span> <span class="Delimiter">}</span> <span id="L257" class="LineNr"> 257 </span> <span class="muControl">return</span> <span class="Constant">0/don't-render</span> @@ -319,27 +319,27 @@ if ('onhashchange' in window) { <span id="L260" class="LineNr"> 260 </span>] <span id="L261" class="LineNr"> 261 </span> <span id="L262" class="LineNr"> 262 </span><span class="Comment"># helper for tests</span> -<span id="L263" class="LineNr"> 263 </span><span class="muRecipe">def</span> editor-render screen:&:screen, editor:&:editor<span class="muRecipe"> -> </span>screen:&:screen, editor:&:editor [ +<span id="L263" class="LineNr"> 263 </span><span class="muRecipe">def</span> editor-render <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor [ <span id="L264" class="LineNr"> 264 </span> <span class="Constant">local-scope</span> <span id="L265" class="LineNr"> 265 </span> <span class="Constant">load-ingredients</span> <span id="L266" class="LineNr"> 266 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> <span id="L267" class="LineNr"> 267 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> -<span id="L268" class="LineNr"> 268 </span> row:num, column:num <span class="Special"><-</span> render screen, editor -<span id="L269" class="LineNr"> 269 </span> clear-line-until screen, right +<span id="L268" class="LineNr"> 268 </span> row:num, column:num <span class="Special"><-</span> render <a href='081print.mu.html#L4'>screen</a>, editor +<span id="L269" class="LineNr"> 269 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L270" class="LineNr"> 270 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L271" class="LineNr"> 271 </span> draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span> +<span id="L271" class="LineNr"> 271 </span> draw-horizontal <a href='081print.mu.html#L4'>screen</a>, row, left, right, <span class="Constant">9480/horizontal-dotted</span> <span id="L272" class="LineNr"> 272 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L273" class="LineNr"> 273 </span> clear-screen-from screen, row, left, left, right +<span id="L273" class="LineNr"> 273 </span> clear-screen-from <a href='081print.mu.html#L4'>screen</a>, row, left, left, right <span id="L274" class="LineNr"> 274 </span>] <span id="L275" class="LineNr"> 275 </span> <span id="L276" class="LineNr"> 276 </span><span class="muScenario">scenario</span> editor-handles-empty-event-queue [ <span id="L277" class="LineNr"> 277 </span> <span class="Constant">local-scope</span> <span id="L278" class="LineNr"> 278 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L279" class="LineNr"> 279 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L280" class="LineNr"> 280 </span> editor-render screen, e +<span id="L280" class="LineNr"> 280 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L281" class="LineNr"> 281 </span> assume-console <span class="Constant">[]</span> <span id="L282" class="LineNr"> 282 </span> run [ -<span id="L283" class="LineNr"> 283 </span> editor-event-loop screen, console, e +<span id="L283" class="LineNr"> 283 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L284" class="LineNr"> 284 </span> ] <span id="L285" class="LineNr"> 285 </span> screen-should-contain [ <span id="L286" class="LineNr"> 286 </span> <span class="Constant"> . .</span> @@ -353,13 +353,13 @@ if ('onhashchange' in window) { <span id="L294" class="LineNr"> 294 </span> <span class="Constant">local-scope</span> <span id="L295" class="LineNr"> 295 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L296" class="LineNr"> 296 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L297" class="LineNr"> 297 </span> editor-render screen, e +<span id="L297" class="LineNr"> 297 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L298" class="LineNr"> 298 </span> $clear-trace <span id="L299" class="LineNr"> 299 </span> assume-console [ <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> <span id="L301" class="LineNr"> 301 </span> ] <span id="L302" class="LineNr"> 302 </span> run [ -<span id="L303" class="LineNr"> 303 </span> editor-event-loop screen, console, e +<span id="L303" class="LineNr"> 303 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L304" class="LineNr"> 304 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L305" class="LineNr"> 305 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L306" class="LineNr"> 306 </span> ] @@ -385,7 +385,7 @@ if ('onhashchange' in window) { <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> <span id="L327" class="LineNr"> 327 </span> ] <span id="L328" class="LineNr"> 328 </span> run [ -<span id="L329" class="LineNr"> 329 </span> editor-event-loop screen, console, e +<span id="L329" class="LineNr"> 329 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L330" class="LineNr"> 330 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L331" class="LineNr"> 331 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L332" class="LineNr"> 332 </span> ] @@ -407,7 +407,7 @@ if ('onhashchange' in window) { <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> <span id="L349" class="LineNr"> 349 </span> ] <span id="L350" class="LineNr"> 350 </span> run [ -<span id="L351" class="LineNr"> 351 </span> editor-event-loop screen, console, e +<span id="L351" class="LineNr"> 351 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L352" class="LineNr"> 352 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L353" class="LineNr"> 353 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L354" class="LineNr"> 354 </span> ] @@ -429,7 +429,7 @@ if ('onhashchange' in window) { <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> <span id="L371" class="LineNr"> 371 </span> ] <span id="L372" class="LineNr"> 372 </span> run [ -<span id="L373" class="LineNr"> 373 </span> editor-event-loop screen, console, e +<span id="L373" class="LineNr"> 373 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L374" class="LineNr"> 374 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L375" class="LineNr"> 375 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L376" class="LineNr"> 376 </span> ] @@ -445,14 +445,14 @@ if ('onhashchange' in window) { <span id="L386" class="LineNr"> 386 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L387" class="LineNr"> 387 </span> <span class="Comment"># editor occupies only left half of screen</span> <span id="L388" class="LineNr"> 388 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L389" class="LineNr"> 389 </span> editor-render screen, e +<span id="L389" class="LineNr"> 389 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L390" class="LineNr"> 390 </span> $clear-trace <span id="L391" class="LineNr"> 391 </span> assume-console [ <span id="L392" class="LineNr"> 392 </span> <span class="Comment"># click on right half of screen</span> <span id="L393" class="LineNr"> 393 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 8</span> <span id="L394" class="LineNr"> 394 </span> ] <span id="L395" class="LineNr"> 395 </span> run [ -<span id="L396" class="LineNr"> 396 </span> editor-event-loop screen, console, e +<span id="L396" class="LineNr"> 396 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L397" class="LineNr"> 397 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L398" class="LineNr"> 398 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L399" class="LineNr"> 399 </span> ] @@ -473,14 +473,14 @@ if ('onhashchange' in window) { <span id="L414" class="LineNr"> 414 </span> <span class="Constant">local-scope</span> <span id="L415" class="LineNr"> 415 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L416" class="LineNr"> 416 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L417" class="LineNr"> 417 </span> editor-render screen, e +<span id="L417" class="LineNr"> 417 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L418" class="LineNr"> 418 </span> $clear-trace <span id="L419" class="LineNr"> 419 </span> assume-console [ <span id="L420" class="LineNr"> 420 </span> <span class="Comment"># click on first, 'menu' row</span> <span id="L421" class="LineNr"> 421 </span> left-click<span class="Constant"> 0</span>,<span class="Constant"> 3</span> <span id="L422" class="LineNr"> 422 </span> ] <span id="L423" class="LineNr"> 423 </span> run [ -<span id="L424" class="LineNr"> 424 </span> editor-event-loop screen, console, e +<span id="L424" class="LineNr"> 424 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L425" class="LineNr"> 425 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L426" class="LineNr"> 426 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L427" class="LineNr"> 427 </span> ] @@ -495,13 +495,13 @@ if ('onhashchange' in window) { <span id="L436" class="LineNr"> 436 </span> <span class="Constant">local-scope</span> <span id="L437" class="LineNr"> 437 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L438" class="LineNr"> 438 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L439" class="LineNr"> 439 </span> editor-render screen, e +<span id="L439" class="LineNr"> 439 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L440" class="LineNr"> 440 </span> $clear-trace <span id="L441" class="LineNr"> 441 </span> assume-console [ <span id="L442" class="LineNr"> 442 </span> type <span class="Constant">[abc]</span> <span id="L443" class="LineNr"> 443 </span> ] <span id="L444" class="LineNr"> 444 </span> run [ -<span id="L445" class="LineNr"> 445 </span> editor-event-loop screen, console, e +<span id="L445" class="LineNr"> 445 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L446" class="LineNr"> 446 </span> ] <span id="L447" class="LineNr"> 447 </span> screen-should-contain [ <span id="L448" class="LineNr"> 448 </span> <span class="Constant"> . .</span> @@ -516,7 +516,7 @@ if ('onhashchange' in window) { <span id="L457" class="LineNr"> 457 </span> <span class="Constant">local-scope</span> <span id="L458" class="LineNr"> 458 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L459" class="LineNr"> 459 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L460" class="LineNr"> 460 </span> editor-render screen, e +<span id="L460" class="LineNr"> 460 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L461" class="LineNr"> 461 </span> $clear-trace <span id="L462" class="LineNr"> 462 </span> <span class="Comment"># type two letters at different places</span> <span id="L463" class="LineNr"> 463 </span> assume-console [ @@ -525,7 +525,7 @@ if ('onhashchange' in window) { <span id="L466" class="LineNr"> 466 </span> type <span class="Constant">[d]</span> <span id="L467" class="LineNr"> 467 </span> ] <span id="L468" class="LineNr"> 468 </span> run [ -<span id="L469" class="LineNr"> 469 </span> editor-event-loop screen, console, e +<span id="L469" class="LineNr"> 469 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L470" class="LineNr"> 470 </span> ] <span id="L471" class="LineNr"> 471 </span> screen-should-contain [ <span id="L472" class="LineNr"> 472 </span> <span class="Constant"> . .</span> @@ -540,14 +540,14 @@ if ('onhashchange' in window) { <span id="L481" class="LineNr"> 481 </span> <span class="Constant">local-scope</span> <span id="L482" class="LineNr"> 482 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L483" class="LineNr"> 483 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L484" class="LineNr"> 484 </span> editor-render screen, e +<span id="L484" class="LineNr"> 484 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L485" class="LineNr"> 485 </span> $clear-trace <span id="L486" class="LineNr"> 486 </span> assume-console [ <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> <span id="L488" class="LineNr"> 488 </span> type <span class="Constant">[d]</span> <span id="L489" class="LineNr"> 489 </span> ] <span id="L490" class="LineNr"> 490 </span> run [ -<span id="L491" class="LineNr"> 491 </span> editor-event-loop screen, console, e +<span id="L491" class="LineNr"> 491 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L492" class="LineNr"> 492 </span> ] <span id="L493" class="LineNr"> 493 </span> screen-should-contain [ <span id="L494" class="LineNr"> 494 </span> <span class="Constant"> . .</span> @@ -564,14 +564,14 @@ if ('onhashchange' in window) { <span id="L505" class="LineNr"> 505 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L506" class="LineNr"> 506 </span><span class="Constant">d]</span> <span id="L507" class="LineNr"> 507 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L508" class="LineNr"> 508 </span> editor-render screen, e +<span id="L508" class="LineNr"> 508 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L509" class="LineNr"> 509 </span> $clear-trace <span id="L510" class="LineNr"> 510 </span> assume-console [ <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> <span id="L512" class="LineNr"> 512 </span> type <span class="Constant">[e]</span> <span id="L513" class="LineNr"> 513 </span> ] <span id="L514" class="LineNr"> 514 </span> run [ -<span id="L515" class="LineNr"> 515 </span> editor-event-loop screen, console, e +<span id="L515" class="LineNr"> 515 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L516" class="LineNr"> 516 </span> ] <span id="L517" class="LineNr"> 517 </span> screen-should-contain [ <span id="L518" class="LineNr"> 518 </span> <span class="Constant"> . .</span> @@ -587,14 +587,14 @@ if ('onhashchange' in window) { <span id="L528" class="LineNr"> 528 </span> <span class="Constant">local-scope</span> <span id="L529" class="LineNr"> 529 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L530" class="LineNr"> 530 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L531" class="LineNr"> 531 </span> editor-render screen, e +<span id="L531" class="LineNr"> 531 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L532" class="LineNr"> 532 </span> $clear-trace <span id="L533" class="LineNr"> 533 </span> assume-console [ <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> <span id="L535" class="LineNr"> 535 </span> type <span class="Constant">[d]</span> <span id="L536" class="LineNr"> 536 </span> ] <span id="L537" class="LineNr"> 537 </span> run [ -<span id="L538" class="LineNr"> 538 </span> editor-event-loop screen, console, e +<span id="L538" class="LineNr"> 538 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L539" class="LineNr"> 539 </span> ] <span id="L540" class="LineNr"> 540 </span> screen-should-contain [ <span id="L541" class="LineNr"> 541 </span> <span class="Constant"> . .</span> @@ -611,14 +611,14 @@ if ('onhashchange' in window) { <span id="L552" class="LineNr"> 552 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L553" class="LineNr"> 553 </span><span class="Constant">d]</span> <span id="L554" class="LineNr"> 554 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L555" class="LineNr"> 555 </span> editor-render screen, e +<span id="L555" class="LineNr"> 555 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L556" class="LineNr"> 556 </span> $clear-trace <span id="L557" class="LineNr"> 557 </span> assume-console [ <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> <span id="L559" class="LineNr"> 559 </span> type <span class="Constant">[e]</span> <span id="L560" class="LineNr"> 560 </span> ] <span id="L561" class="LineNr"> 561 </span> run [ -<span id="L562" class="LineNr"> 562 </span> editor-event-loop screen, console, e +<span id="L562" class="LineNr"> 562 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L563" class="LineNr"> 563 </span> ] <span id="L564" class="LineNr"> 564 </span> screen-should-contain [ <span id="L565" class="LineNr"> 565 </span> <span class="Constant"> . .</span> @@ -636,14 +636,14 @@ if ('onhashchange' in window) { <span id="L577" class="LineNr"> 577 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L578" class="LineNr"> 578 </span><span class="Constant">d]</span> <span id="L579" class="LineNr"> 579 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L580" class="LineNr"> 580 </span> editor-render screen, e +<span id="L580" class="LineNr"> 580 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L581" class="LineNr"> 581 </span> $clear-trace <span id="L582" class="LineNr"> 582 </span> assume-console [ <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> <span id="L584" class="LineNr"> 584 </span> type <span class="Constant">[ef]</span> <span id="L585" class="LineNr"> 585 </span> ] <span id="L586" class="LineNr"> 586 </span> run [ -<span id="L587" class="LineNr"> 587 </span> editor-event-loop screen, console, e +<span id="L587" class="LineNr"> 587 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L588" class="LineNr"> 588 </span> ] <span id="L589" class="LineNr"> 589 </span> screen-should-contain [ <span id="L590" class="LineNr"> 590 </span> <span class="Constant"> . .</span> @@ -659,12 +659,12 @@ if ('onhashchange' in window) { <span id="L600" class="LineNr"> 600 </span> <span class="Constant">local-scope</span> <span id="L601" class="LineNr"> 601 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L602" class="LineNr"> 602 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[ab]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L603" class="LineNr"> 603 </span> editor-render screen, e +<span id="L603" class="LineNr"> 603 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L604" class="LineNr"> 604 </span> assume-console [ <span id="L605" class="LineNr"> 605 </span> type <span class="Constant">[01]</span> <span id="L606" class="LineNr"> 606 </span> ] <span id="L607" class="LineNr"> 607 </span> run [ -<span id="L608" class="LineNr"> 608 </span> editor-event-loop screen, console, e +<span id="L608" class="LineNr"> 608 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L609" class="LineNr"> 609 </span> ] <span id="L610" class="LineNr"> 610 </span> screen-should-contain [ <span id="L611" class="LineNr"> 611 </span> <span class="Constant"> . .</span> @@ -680,13 +680,13 @@ if ('onhashchange' in window) { <span id="L621" class="LineNr"> 621 </span> <span class="Constant">local-scope</span> <span id="L622" class="LineNr"> 622 </span> assume-screen <span class="Constant">5/width</span>, <span class="Constant">5/height</span> <span id="L623" class="LineNr"> 623 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L624" class="LineNr"> 624 </span> editor-render screen, e +<span id="L624" class="LineNr"> 624 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L625" class="LineNr"> 625 </span> <span class="Comment"># type a letter</span> <span id="L626" class="LineNr"> 626 </span> assume-console [ <span id="L627" class="LineNr"> 627 </span> type <span class="Constant">[e]</span> <span id="L628" class="LineNr"> 628 </span> ] <span id="L629" class="LineNr"> 629 </span> run [ -<span id="L630" class="LineNr"> 630 </span> editor-event-loop screen, console, e +<span id="L630" class="LineNr"> 630 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L631" class="LineNr"> 631 </span> ] <span id="L632" class="LineNr"> 632 </span> <span class="Comment"># no wrap yet</span> <span id="L633" class="LineNr"> 633 </span> screen-should-contain [ @@ -701,7 +701,7 @@ if ('onhashchange' in window) { <span id="L642" class="LineNr"> 642 </span> type <span class="Constant">[f]</span> <span id="L643" class="LineNr"> 643 </span> ] <span id="L644" class="LineNr"> 644 </span> run [ -<span id="L645" class="LineNr"> 645 </span> editor-event-loop screen, console, e +<span id="L645" class="LineNr"> 645 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L646" class="LineNr"> 646 </span> ] <span id="L647" class="LineNr"> 647 </span> <span class="Comment"># now wrap</span> <span id="L648" class="LineNr"> 648 </span> screen-should-contain [ @@ -720,14 +720,14 @@ if ('onhashchange' in window) { <span id="L661" class="LineNr"> 661 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abcdefg</span> <span id="L662" class="LineNr"> 662 </span><span class="Constant">defg]</span> <span id="L663" class="LineNr"> 663 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L664" class="LineNr"> 664 </span> editor-render screen, e +<span id="L664" class="LineNr"> 664 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L665" class="LineNr"> 665 </span> <span class="Comment"># type more text at the start</span> <span id="L666" class="LineNr"> 666 </span> assume-console [ <span id="L667" class="LineNr"> 667 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 0</span> <span id="L668" class="LineNr"> 668 </span> type <span class="Constant">[abc]</span> <span id="L669" class="LineNr"> 669 </span> ] <span id="L670" class="LineNr"> 670 </span> run [ -<span id="L671" class="LineNr"> 671 </span> editor-event-loop screen, console, e +<span id="L671" class="LineNr"> 671 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L672" class="LineNr"> 672 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L673" class="LineNr"> 673 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L674" class="LineNr"> 674 </span> ] @@ -756,9 +756,9 @@ if ('onhashchange' in window) { <span id="L697" class="LineNr"> 697 </span> before-wrap-column:num <span class="Special"><-</span> subtract wrap-column,<span class="Constant"> 1</span> <span id="L698" class="LineNr"> 698 </span> at-wrap?:bool <span class="Special"><-</span> greater-or-equal cursor-column, wrap-column <span id="L699" class="LineNr"> 699 </span> just-before-wrap?:bool <span class="Special"><-</span> greater-or-equal cursor-column, before-wrap-column -<span id="L700" class="LineNr"> 700 </span> next:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L700" class="LineNr"> 700 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L701" class="LineNr"> 701 </span> <span class="Comment"># at end of line? next == 0 || next.value == 10/newline</span> -<span id="L702" class="LineNr"> 702 </span> at-end-of-line?:bool <span class="Special"><-</span> equal next,<span class="Constant"> 0</span> +<span id="L702" class="LineNr"> 702 </span> at-end-of-line?:bool <span class="Special"><-</span> equal <a href='065duplex_list.mu.html#L29'>next</a>,<span class="Constant"> 0</span> <span id="L703" class="LineNr"> 703 </span> <span class="Delimiter">{</span> <span id="L704" class="LineNr"> 704 </span> <span class="muControl">break-if</span> at-end-of-line? <span id="L705" class="LineNr"> 705 </span> next-character:char <span class="Special"><-</span> get *next, <span class="Constant">value:offset</span> @@ -788,7 +788,7 @@ if ('onhashchange' in window) { <span id="L729" class="LineNr"> 729 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L730" class="LineNr"> 730 </span> <span class="Comment"># if we're out of the screen, scroll down</span> <span id="L731" class="LineNr"> 731 </span> <span class="Delimiter">{</span> -<span id="L732" class="LineNr"> 732 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, screen-height +<span id="L732" class="LineNr"> 732 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L733" class="LineNr"> 733 </span> <span class="muControl">break-unless</span> below-screen? <span id="L734" class="LineNr"> 734 </span><span class="Constant"> <scroll-down></span> <span id="L735" class="LineNr"> 735 </span> <span class="Delimiter">}</span> @@ -805,7 +805,7 @@ if ('onhashchange' in window) { <span id="L746" class="LineNr"> 746 </span> type <span class="Constant">[f]</span> <span id="L747" class="LineNr"> 747 </span> ] <span id="L748" class="LineNr"> 748 </span> run [ -<span id="L749" class="LineNr"> 749 </span> editor-event-loop screen, console, e +<span id="L749" class="LineNr"> 749 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L750" class="LineNr"> 750 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L751" class="LineNr"> 751 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L752" class="LineNr"> 752 </span> ] @@ -829,7 +829,7 @@ if ('onhashchange' in window) { <span id="L770" class="LineNr"> 770 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L771" class="LineNr"> 771 </span><span class="Constant">xyz]</span> <span id="L772" class="LineNr"> 772 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L773" class="LineNr"> 773 </span> editor-render screen, e +<span id="L773" class="LineNr"> 773 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L774" class="LineNr"> 774 </span> screen-should-contain [ <span id="L775" class="LineNr"> 775 </span> <span class="Constant"> . .</span> <span id="L776" class="LineNr"> 776 </span> <span class="Constant"> .abc .</span> @@ -842,7 +842,7 @@ if ('onhashchange' in window) { <span id="L783" class="LineNr"> 783 </span> type <span class="Constant">[de]</span> <span class="Comment"># trigger wrap</span> <span id="L784" class="LineNr"> 784 </span> ] <span id="L785" class="LineNr"> 785 </span> run [ -<span id="L786" class="LineNr"> 786 </span> editor-event-loop screen, console, e +<span id="L786" class="LineNr"> 786 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L787" class="LineNr"> 787 </span> ] <span id="L788" class="LineNr"> 788 </span> screen-should-contain [ <span id="L789" class="LineNr"> 789 </span> <span class="Constant"> . .</span> @@ -862,7 +862,7 @@ if ('onhashchange' in window) { <span id="L803" class="LineNr"> 803 </span> type <span class="Constant">[01]</span> <span id="L804" class="LineNr"> 804 </span> ] <span id="L805" class="LineNr"> 805 </span> run [ -<span id="L806" class="LineNr"> 806 </span> editor-event-loop screen, console, e +<span id="L806" class="LineNr"> 806 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L807" class="LineNr"> 807 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L808" class="LineNr"> 808 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L809" class="LineNr"> 809 </span> ] @@ -898,7 +898,7 @@ if ('onhashchange' in window) { <span id="L839" class="LineNr"> 839 </span><span class="Constant">1]</span> <span id="L840" class="LineNr"> 840 </span> ] <span id="L841" class="LineNr"> 841 </span> run [ -<span id="L842" class="LineNr"> 842 </span> editor-event-loop screen, console, e +<span id="L842" class="LineNr"> 842 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L843" class="LineNr"> 843 </span> ] <span id="L844" class="LineNr"> 844 </span> screen-should-contain [ <span id="L845" class="LineNr"> 845 </span> <span class="Constant"> . .</span> @@ -914,13 +914,13 @@ if ('onhashchange' in window) { <span id="L855" class="LineNr"> 855 </span> newline?:bool <span class="Special"><-</span> equal c, <span class="Constant">10/newline</span> <span id="L856" class="LineNr"> 856 </span> <span class="muControl">break-unless</span> newline? <span id="L857" class="LineNr"> 857 </span><span class="Constant"> <insert-enter-begin></span> -<span id="L858" class="LineNr"> 858 </span> insert-new-line-and-indent editor, screen +<span id="L858" class="LineNr"> 858 </span> insert-new-line-and-indent editor, <a href='081print.mu.html#L4'>screen</a> <span id="L859" class="LineNr"> 859 </span><span class="Constant"> <insert-enter-end></span> <span id="L860" class="LineNr"> 860 </span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L861" class="LineNr"> 861 </span> <span class="Delimiter">}</span> <span id="L862" class="LineNr"> 862 </span>] <span id="L863" class="LineNr"> 863 </span> -<span id="L864" class="LineNr"> 864 </span><span class="muRecipe">def</span> insert-new-line-and-indent editor:&:editor, screen:&:screen<span class="muRecipe"> -> </span>editor:&:editor, screen:&:screen [ +<span id="L864" class="LineNr"> 864 </span><span class="muRecipe">def</span> insert-new-line-and-indent editor:&:editor, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>editor:&:editor, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L865" class="LineNr"> 865 </span> <span class="Constant">local-scope</span> <span id="L866" class="LineNr"> 866 </span> <span class="Constant">load-ingredients</span> <span id="L867" class="LineNr"> 867 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> @@ -928,10 +928,10 @@ if ('onhashchange' in window) { <span id="L869" class="LineNr"> 869 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L870" class="LineNr"> 870 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> <span id="L871" class="LineNr"> 871 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> -<span id="L872" class="LineNr"> 872 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L872" class="LineNr"> 872 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L873" class="LineNr"> 873 </span> <span class="Comment"># insert newline</span> <span id="L874" class="LineNr"> 874 </span> insert <span class="Constant">10/newline</span>, before-cursor -<span id="L875" class="LineNr"> 875 </span> before-cursor <span class="Special"><-</span> next before-cursor +<span id="L875" class="LineNr"> 875 </span> before-cursor <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L876" class="LineNr"> 876 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L877" class="LineNr"> 877 </span> cursor-row <span class="Special"><-</span> add cursor-row,<span class="Constant"> 1</span> <span id="L878" class="LineNr"> 878 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row @@ -939,7 +939,7 @@ if ('onhashchange' in window) { <span id="L880" class="LineNr"> 880 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column <span id="L881" class="LineNr"> 881 </span> <span class="Comment"># maybe scroll</span> <span id="L882" class="LineNr"> 882 </span> <span class="Delimiter">{</span> -<span id="L883" class="LineNr"> 883 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, screen-height <span class="Comment"># must be equal, never greater</span> +<span id="L883" class="LineNr"> 883 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, <a href='081print.mu.html#L594'>screen-height</a> <span class="Comment"># must be equal, never greater</span> <span id="L884" class="LineNr"> 884 </span> <span class="muControl">break-unless</span> below-screen? <span id="L885" class="LineNr"> 885 </span><span class="Constant"> <scroll-down></span> <span id="L886" class="LineNr"> 886 </span> cursor-row <span class="Special"><-</span> subtract cursor-row,<span class="Constant"> 1</span> <span class="Comment"># bring back into screen range</span> @@ -949,13 +949,13 @@ if ('onhashchange' in window) { <span id="L890" class="LineNr"> 890 </span> indent?:bool <span class="Special"><-</span> get *editor, <span class="Constant">indent?:offset</span> <span id="L891" class="LineNr"> 891 </span> <span class="muControl">return-unless</span> indent? <span id="L892" class="LineNr"> 892 </span> d:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">data:offset</span> -<span id="L893" class="LineNr"> 893 </span> end-of-previous-line:&:duplex-list:char <span class="Special"><-</span> prev before-cursor +<span id="L893" class="LineNr"> 893 </span> end-of-previous-line:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> before-cursor <span id="L894" class="LineNr"> 894 </span> indent:num <span class="Special"><-</span> line-indent end-of-previous-line, d <span id="L895" class="LineNr"> 895 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L896" class="LineNr"> 896 </span> <span class="Delimiter">{</span> <span id="L897" class="LineNr"> 897 </span> indent-done?:bool <span class="Special"><-</span> greater-or-equal i, indent <span id="L898" class="LineNr"> 898 </span> <span class="muControl">break-if</span> indent-done? -<span id="L899" class="LineNr"> 899 </span> insert-at-cursor editor, <span class="Constant">32/space</span>, screen +<span id="L899" class="LineNr"> 899 </span> insert-at-cursor editor, <span class="Constant">32/space</span>, <a href='081print.mu.html#L4'>screen</a> <span id="L900" class="LineNr"> 900 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L901" class="LineNr"> 901 </span> <span class="muControl">loop</span> <span id="L902" class="LineNr"> 902 </span> <span class="Delimiter">}</span> @@ -971,7 +971,7 @@ if ('onhashchange' in window) { <span id="L912" class="LineNr"> 912 </span> at-start?:bool <span class="Special"><-</span> equal curr, start <span id="L913" class="LineNr"> 913 </span> <span class="muControl">return-if</span> at-start? <span id="L914" class="LineNr"> 914 </span> <span class="Delimiter">{</span> -<span id="L915" class="LineNr"> 915 </span> curr <span class="Special"><-</span> prev curr +<span id="L915" class="LineNr"> 915 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> curr <span id="L916" class="LineNr"> 916 </span> <span class="muControl">break-unless</span> curr <span id="L917" class="LineNr"> 917 </span> at-start?:bool <span class="Special"><-</span> equal curr, start <span id="L918" class="LineNr"> 918 </span> <span class="muControl">break-if</span> at-start? @@ -1002,7 +1002,7 @@ if ('onhashchange' in window) { <span id="L943" class="LineNr"> 943 </span><span class="Constant">1]</span> <span id="L944" class="LineNr"> 944 </span> ] <span id="L945" class="LineNr"> 945 </span> run [ -<span id="L946" class="LineNr"> 946 </span> editor-event-loop screen, console, e +<span id="L946" class="LineNr"> 946 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L947" class="LineNr"> 947 </span> ] <span id="L948" class="LineNr"> 948 </span> screen-should-contain [ <span id="L949" class="LineNr"> 949 </span> <span class="Constant"> . .</span> @@ -1017,7 +1017,7 @@ if ('onhashchange' in window) { <span id="L958" class="LineNr"> 958 </span> <span class="Constant">local-scope</span> <span id="L959" class="LineNr"> 959 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L960" class="LineNr"> 960 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L961" class="LineNr"> 961 </span> editor-render screen, e +<span id="L961" class="LineNr"> 961 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L962" class="LineNr"> 962 </span> screen-should-contain [ <span id="L963" class="LineNr"> 963 </span> <span class="Constant"> . .</span> <span id="L964" class="LineNr"> 964 </span> <span class="Constant"> .abcd↩ .</span> @@ -1029,7 +1029,7 @@ if ('onhashchange' in window) { <span id="L970" class="LineNr"> 970 </span> press enter <span id="L971" class="LineNr"> 971 </span> ] <span id="L972" class="LineNr"> 972 </span> run [ -<span id="L973" class="LineNr"> 973 </span> editor-event-loop screen, console, e +<span id="L973" class="LineNr"> 973 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L974" class="LineNr"> 974 </span> ] <span id="L975" class="LineNr"> 975 </span> <span class="Comment"># line should be fully cleared</span> <span id="L976" class="LineNr"> 976 </span> screen-should-contain [ @@ -1055,7 +1055,7 @@ if ('onhashchange' in window) { <span id="L996" class="LineNr"> 996 </span>] <span id="L997" class="LineNr"> 997 </span> ] <span id="L998" class="LineNr"> 998 </span> run [ -<span id="L999" class="LineNr"> 999 </span> editor-event-loop screen, console, e +<span id="L999" class="LineNr"> 999 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1000" class="LineNr">1000 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1001" class="LineNr">1001 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1002" class="LineNr">1002 </span> ] @@ -1081,7 +1081,7 @@ if ('onhashchange' in window) { <span id="L1022" class="LineNr">1022 </span> press<span class="Constant"> 65506</span> <span class="Comment"># end paste</span> <span id="L1023" class="LineNr">1023 </span> ] <span id="L1024" class="LineNr">1024 </span> run [ -<span id="L1025" class="LineNr">1025 </span> editor-event-loop screen, console, e +<span id="L1025" class="LineNr">1025 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1026" class="LineNr">1026 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1027" class="LineNr">1027 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1028" class="LineNr">1028 </span> ] @@ -1112,7 +1112,7 @@ if ('onhashchange' in window) { <span id="L1053" class="LineNr">1053 </span> <span id="L1054" class="LineNr">1054 </span><span class="SalientComment">## helpers</span> <span id="L1055" class="LineNr">1055 </span> -<span id="L1056" class="LineNr">1056 </span><span class="muRecipe">def</span> draw-horizontal screen:&:screen, row:num, x:num, right:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L1056" class="LineNr">1056 </span><span class="muRecipe">def</span> draw-horizontal <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, row:num, x:num, right:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L1057" class="LineNr">1057 </span> <span class="Constant">local-scope</span> <span id="L1058" class="LineNr">1058 </span> <span class="Constant">load-ingredients</span> <span id="L1059" class="LineNr">1059 </span> style:char, style-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> @@ -1131,11 +1131,11 @@ if ('onhashchange' in window) { <span id="L1072" class="LineNr">1072 </span> <span class="muControl">break-if</span> bg-color-found? <span id="L1073" class="LineNr">1073 </span> bg-color <span class="Special"><-</span> copy <span class="Constant">0/black</span> <span id="L1074" class="LineNr">1074 </span> <span class="Delimiter">}</span> -<span id="L1075" class="LineNr">1075 </span> screen <span class="Special"><-</span> move-cursor screen, row, x +<span id="L1075" class="LineNr">1075 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, x <span id="L1076" class="LineNr">1076 </span> <span class="Delimiter">{</span> <span id="L1077" class="LineNr">1077 </span> continue?:bool <span class="Special"><-</span> lesser-or-equal x, right <span class="Comment"># right is inclusive, to match editor semantics</span> <span id="L1078" class="LineNr">1078 </span> <span class="muControl">break-unless</span> continue? -<span id="L1079" class="LineNr">1079 </span> print screen, style, color, bg-color +<span id="L1079" class="LineNr">1079 </span> print <a href='081print.mu.html#L4'>screen</a>, style, color, bg-color <span id="L1080" class="LineNr">1080 </span> x <span class="Special"><-</span> add x,<span class="Constant"> 1</span> <span id="L1081" class="LineNr">1081 </span> <span class="muControl">loop</span> <span id="L1082" class="LineNr">1082 </span> <span class="Delimiter">}</span> diff --git a/html/edit/003-shortcuts.mu.html b/html/edit/003-shortcuts.mu.html index 4f616c07..1a19ad63 100644 --- a/html/edit/003-shortcuts.mu.html +++ b/html/edit/003-shortcuts.mu.html @@ -73,7 +73,7 @@ if ('onhashchange' in window) { <span id="L15" class="LineNr"> 15 </span> press tab <span id="L16" class="LineNr"> 16 </span> ] <span id="L17" class="LineNr"> 17 </span> run [ -<span id="L18" class="LineNr"> 18 </span> editor-event-loop screen, console, e +<span id="L18" class="LineNr"> 18 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L19" class="LineNr"> 19 </span> ] <span id="L20" class="LineNr"> 20 </span> screen-should-contain [ <span id="L21" class="LineNr"> 21 </span> <span class="Constant"> . .</span> @@ -87,8 +87,8 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr"> 29 </span> tab?:bool <span class="Special"><-</span> equal c, <span class="Constant">9/tab</span> <span id="L30" class="LineNr"> 30 </span> <span class="muControl">break-unless</span> tab? <span id="L31" class="LineNr"> 31 </span><span class="Constant"> <insert-character-begin></span> -<span id="L32" class="LineNr"> 32 </span> insert-at-cursor editor, <span class="Constant">32/space</span>, screen -<span id="L33" class="LineNr"> 33 </span> insert-at-cursor editor, <span class="Constant">32/space</span>, screen +<span id="L32" class="LineNr"> 32 </span> insert-at-cursor editor, <span class="Constant">32/space</span>, <a href='081print.mu.html#L4'>screen</a> +<span id="L33" class="LineNr"> 33 </span> insert-at-cursor editor, <span class="Constant">32/space</span>, <a href='081print.mu.html#L4'>screen</a> <span id="L34" class="LineNr"> 34 </span><span class="Constant"> <insert-character-end></span> <span id="L35" class="LineNr"> 35 </span> <span class="muControl">return</span> <span class="Constant">1/go-render</span> <span id="L36" class="LineNr"> 36 </span> <span class="Delimiter">}</span> @@ -100,14 +100,14 @@ if ('onhashchange' in window) { <span id="L42" class="LineNr"> 42 </span> <span class="Constant">local-scope</span> <span id="L43" class="LineNr"> 43 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L44" class="LineNr"> 44 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L45" class="LineNr"> 45 </span> editor-render screen, e +<span id="L45" class="LineNr"> 45 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L46" class="LineNr"> 46 </span> $clear-trace <span id="L47" class="LineNr"> 47 </span> assume-console [ <span id="L48" class="LineNr"> 48 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span> <span id="L49" class="LineNr"> 49 </span> press backspace <span id="L50" class="LineNr"> 50 </span> ] <span id="L51" class="LineNr"> 51 </span> run [ -<span id="L52" class="LineNr"> 52 </span> editor-event-loop screen, console, e +<span id="L52" class="LineNr"> 52 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L53" class="LineNr"> 53 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L54" class="LineNr"> 54 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L55" class="LineNr"> 55 </span> ] @@ -129,7 +129,7 @@ if ('onhashchange' in window) { <span id="L71" class="LineNr"> 71 </span> delete-previous-character?:bool <span class="Special"><-</span> equal c, <span class="Constant">8/backspace</span> <span id="L72" class="LineNr"> 72 </span> <span class="muControl">break-unless</span> delete-previous-character? <span id="L73" class="LineNr"> 73 </span><span class="Constant"> <backspace-character-begin></span> -<span id="L74" class="LineNr"> 74 </span> go-render?:bool, backspaced-cell:&:duplex-list:char <span class="Special"><-</span> delete-before-cursor editor, screen +<span id="L74" class="LineNr"> 74 </span> go-render?:bool, backspaced-cell:&:duplex-list:char <span class="Special"><-</span> delete-before-cursor editor, <a href='081print.mu.html#L4'>screen</a> <span id="L75" class="LineNr"> 75 </span><span class="Constant"> <backspace-character-end></span> <span id="L76" class="LineNr"> 76 </span> <span class="muControl">return</span> <span id="L77" class="LineNr"> 77 </span> <span class="Delimiter">}</span> @@ -138,23 +138,23 @@ if ('onhashchange' in window) { <span id="L80" class="LineNr"> 80 </span><span class="Comment"># return values:</span> <span id="L81" class="LineNr"> 81 </span><span class="Comment"># go-render? - whether caller needs to update the screen</span> <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> -<span id="L83" class="LineNr"> 83 </span><span class="muRecipe">def</span> delete-before-cursor editor:&:editor, screen:&:screen<span class="muRecipe"> -> </span>go-render?:bool, backspaced-cell:&:duplex-list:char, editor:&:editor, screen:&:screen [ +<span id="L83" class="LineNr"> 83 </span><span class="muRecipe">def</span> delete-before-cursor editor:&:editor, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>go-render?:bool, backspaced-cell:&:duplex-list:char, editor:&:editor, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L84" class="LineNr"> 84 </span> <span class="Constant">local-scope</span> <span id="L85" class="LineNr"> 85 </span> <span class="Constant">load-ingredients</span> <span id="L86" class="LineNr"> 86 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L87" class="LineNr"> 87 </span> data:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">data:offset</span> <span id="L88" class="LineNr"> 88 </span> <span class="Comment"># if at start of text (before-cursor at § sentinel), return</span> -<span id="L89" class="LineNr"> 89 </span> prev:&:duplex-list:char <span class="Special"><-</span> prev before-cursor -<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> +<span id="L89" class="LineNr"> 89 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> before-cursor +<span id="L90" class="LineNr"> 90 </span> <span class="muControl">return-unless</span> <a href='065duplex_list.mu.html#L36'>prev</a>, <span class="Constant">0/no-more-render</span>, <span class="Constant">0/nothing-deleted</span> <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> <span id="L92" class="LineNr"> 92 </span> original-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L93" class="LineNr"> 93 </span> scroll?:bool <span class="Special"><-</span> move-cursor-coordinates-left editor <span id="L94" class="LineNr"> 94 </span> backspaced-cell:&:duplex-list:char <span class="Special"><-</span> copy before-cursor <span id="L95" class="LineNr"> 95 </span> data <span class="Special"><-</span> remove before-cursor, data <span class="Comment"># will also neatly trim next/prev pointers in backspaced-cell/before-cursor</span> -<span id="L96" class="LineNr"> 96 </span> before-cursor <span class="Special"><-</span> copy prev +<span id="L96" class="LineNr"> 96 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L97" class="LineNr"> 97 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L98" class="LineNr"> 98 </span> <span class="muControl">return-if</span> scroll?, <span class="Constant">1/go-render</span> -<span id="L99" class="LineNr"> 99 </span> screen-width:num <span class="Special"><-</span> screen-width screen +<span id="L99" class="LineNr"> 99 </span> <a href='081print.mu.html#L581'>screen-width</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a> <span id="L100" class="LineNr"> 100 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L101" class="LineNr"> 101 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> <span id="L102" class="LineNr"> 102 </span> <span class="Comment"># did we just backspace over a newline?</span> @@ -162,8 +162,8 @@ if ('onhashchange' in window) { <span id="L104" class="LineNr"> 104 </span> <span class="muControl">return-unless</span> same-row?, <span class="Constant">1/go-render</span> <span id="L105" class="LineNr"> 105 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> <span id="L106" class="LineNr"> 106 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> -<span id="L107" class="LineNr"> 107 </span> curr:&:duplex-list:char <span class="Special"><-</span> next before-cursor -<span id="L108" class="LineNr"> 108 </span> screen <span class="Special"><-</span> move-cursor screen, cursor-row, cursor-column +<span id="L107" class="LineNr"> 107 </span> curr:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor +<span id="L108" class="LineNr"> 108 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, cursor-row, cursor-column <span id="L109" class="LineNr"> 109 </span> curr-column:num <span class="Special"><-</span> copy cursor-column <span id="L110" class="LineNr"> 110 </span> <span class="Delimiter">{</span> <span id="L111" class="LineNr"> 111 </span> <span class="Comment"># hit right margin? give up and let caller render</span> @@ -174,14 +174,14 @@ if ('onhashchange' in window) { <span id="L116" class="LineNr"> 116 </span> currc:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L117" class="LineNr"> 117 </span> at-newline?:bool <span class="Special"><-</span> equal currc, <span class="Constant">10/newline</span> <span id="L118" class="LineNr"> 118 </span> <span class="muControl">break-if</span> at-newline? -<span id="L119" class="LineNr"> 119 </span> screen <span class="Special"><-</span> print screen, currc +<span id="L119" class="LineNr"> 119 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, currc <span id="L120" class="LineNr"> 120 </span> curr-column <span class="Special"><-</span> add curr-column,<span class="Constant"> 1</span> -<span id="L121" class="LineNr"> 121 </span> curr <span class="Special"><-</span> next curr +<span id="L121" class="LineNr"> 121 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L122" class="LineNr"> 122 </span> <span class="muControl">loop</span> <span id="L123" class="LineNr"> 123 </span> <span class="Delimiter">}</span> <span id="L124" class="LineNr"> 124 </span> <span class="Comment"># we're guaranteed not to be at the right margin</span> <span id="L125" class="LineNr"> 125 </span> space:char <span class="Special"><-</span> copy <span class="Constant">32/space</span> -<span id="L126" class="LineNr"> 126 </span> screen <span class="Special"><-</span> print screen, space +<span id="L126" class="LineNr"> 126 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, space <span id="L127" class="LineNr"> 127 </span> go-render? <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span id="L128" class="LineNr"> 128 </span>] <span id="L129" class="LineNr"> 129 </span> @@ -256,7 +256,7 @@ if ('onhashchange' in window) { <span id="L198" class="LineNr"> 198 </span> at-start?:bool <span class="Special"><-</span> equal curr, start <span id="L199" class="LineNr"> 199 </span> <span class="muControl">return-if</span> at-start? <span id="L200" class="LineNr"> 200 </span> <span class="Delimiter">{</span> -<span id="L201" class="LineNr"> 201 </span> curr <span class="Special"><-</span> prev curr +<span id="L201" class="LineNr"> 201 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> curr <span id="L202" class="LineNr"> 202 </span> <span class="muControl">break-unless</span> curr <span id="L203" class="LineNr"> 203 </span> at-start?:bool <span class="Special"><-</span> equal curr, start <span id="L204" class="LineNr"> 204 </span> <span class="muControl">break-if</span> at-start? @@ -280,7 +280,7 @@ if ('onhashchange' in window) { <span id="L222" class="LineNr"> 222 </span> press backspace <span id="L223" class="LineNr"> 223 </span> ] <span id="L224" class="LineNr"> 224 </span> run [ -<span id="L225" class="LineNr"> 225 </span> editor-event-loop screen, console, e +<span id="L225" class="LineNr"> 225 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L226" class="LineNr"> 226 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L227" class="LineNr"> 227 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L228" class="LineNr"> 228 </span> ] @@ -303,7 +303,7 @@ if ('onhashchange' in window) { <span id="L245" class="LineNr"> 245 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc def</span> <span id="L246" class="LineNr"> 246 </span><span class="Constant">ghi jkl]</span> <span id="L247" class="LineNr"> 247 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L248" class="LineNr"> 248 </span> editor-render screen, e +<span id="L248" class="LineNr"> 248 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L249" class="LineNr"> 249 </span> $clear-trace <span id="L250" class="LineNr"> 250 </span> <span class="Comment"># position the cursor at the start of the second and hit backspace</span> <span id="L251" class="LineNr"> 251 </span> assume-console [ @@ -311,7 +311,7 @@ if ('onhashchange' in window) { <span id="L253" class="LineNr"> 253 </span> press backspace <span id="L254" class="LineNr"> 254 </span> ] <span id="L255" class="LineNr"> 255 </span> run [ -<span id="L256" class="LineNr"> 256 </span> editor-event-loop screen, console, e +<span id="L256" class="LineNr"> 256 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L257" class="LineNr"> 257 </span> ] <span id="L258" class="LineNr"> 258 </span> <span class="Comment"># resulting single line should wrap correctly</span> <span id="L259" class="LineNr"> 259 </span> screen-should-contain [ @@ -328,7 +328,7 @@ if ('onhashchange' in window) { <span id="L270" class="LineNr"> 270 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L271" class="LineNr"> 271 </span> <span class="Comment"># initialize editor in part of the screen with a long line</span> <span id="L272" class="LineNr"> 272 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc def ghij]</span>, <span class="Constant">0/left</span>, <span class="Constant">8/right</span> -<span id="L273" class="LineNr"> 273 </span> editor-render screen, e +<span id="L273" class="LineNr"> 273 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L274" class="LineNr"> 274 </span> <span class="Comment"># confirm that it wraps</span> <span id="L275" class="LineNr"> 275 </span> screen-should-contain [ <span id="L276" class="LineNr"> 276 </span> <span class="Constant"> . .</span> @@ -343,7 +343,7 @@ if ('onhashchange' in window) { <span id="L285" class="LineNr"> 285 </span> press backspace <span id="L286" class="LineNr"> 286 </span> ] <span id="L287" class="LineNr"> 287 </span> run [ -<span id="L288" class="LineNr"> 288 </span> editor-event-loop screen, console, e +<span id="L288" class="LineNr"> 288 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L289" class="LineNr"> 289 </span> ] <span id="L290" class="LineNr"> 290 </span> <span class="Comment"># resulting single line should wrap correctly and not overflow its bounds</span> <span id="L291" class="LineNr"> 291 </span> screen-should-contain [ @@ -361,13 +361,13 @@ if ('onhashchange' in window) { <span id="L303" class="LineNr"> 303 </span> <span class="Constant">local-scope</span> <span id="L304" class="LineNr"> 304 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L305" class="LineNr"> 305 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L306" class="LineNr"> 306 </span> editor-render screen, e +<span id="L306" class="LineNr"> 306 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L307" class="LineNr"> 307 </span> $clear-trace <span id="L308" class="LineNr"> 308 </span> assume-console [ <span id="L309" class="LineNr"> 309 </span> press delete <span id="L310" class="LineNr"> 310 </span> ] <span id="L311" class="LineNr"> 311 </span> run [ -<span id="L312" class="LineNr"> 312 </span> editor-event-loop screen, console, e +<span id="L312" class="LineNr"> 312 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L313" class="LineNr"> 313 </span> ] <span id="L314" class="LineNr"> 314 </span> screen-should-contain [ <span id="L315" class="LineNr"> 315 </span> <span class="Constant"> . .</span> @@ -381,7 +381,7 @@ if ('onhashchange' in window) { <span id="L323" class="LineNr"> 323 </span> press delete <span id="L324" class="LineNr"> 324 </span> ] <span id="L325" class="LineNr"> 325 </span> run [ -<span id="L326" class="LineNr"> 326 </span> editor-event-loop screen, console, e +<span id="L326" class="LineNr"> 326 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L327" class="LineNr"> 327 </span> ] <span id="L328" class="LineNr"> 328 </span> screen-should-contain [ <span id="L329" class="LineNr"> 329 </span> <span class="Constant"> . .</span> @@ -397,47 +397,47 @@ if ('onhashchange' in window) { <span id="L339" class="LineNr"> 339 </span> delete-next-character?:bool <span class="Special"><-</span> equal k, <span class="Constant">65522/delete</span> <span id="L340" class="LineNr"> 340 </span> <span class="muControl">break-unless</span> delete-next-character? <span id="L341" class="LineNr"> 341 </span><span class="Constant"> <delete-character-begin></span> -<span id="L342" class="LineNr"> 342 </span> go-render?:bool, deleted-cell:&:duplex-list:char <span class="Special"><-</span> delete-at-cursor editor, screen +<span id="L342" class="LineNr"> 342 </span> go-render?:bool, deleted-cell:&:duplex-list:char <span class="Special"><-</span> delete-at-cursor editor, <a href='081print.mu.html#L4'>screen</a> <span id="L343" class="LineNr"> 343 </span><span class="Constant"> <delete-character-end></span> <span id="L344" class="LineNr"> 344 </span> <span class="muControl">return</span> <span id="L345" class="LineNr"> 345 </span> <span class="Delimiter">}</span> <span id="L346" class="LineNr"> 346 </span>] <span id="L347" class="LineNr"> 347 </span> -<span id="L348" class="LineNr"> 348 </span><span class="muRecipe">def</span> delete-at-cursor editor:&:editor, screen:&:screen<span class="muRecipe"> -> </span>go-render?:bool, deleted-cell:&:duplex-list:char, editor:&:editor, screen:&:screen [ +<span id="L348" class="LineNr"> 348 </span><span class="muRecipe">def</span> delete-at-cursor editor:&:editor, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>go-render?:bool, deleted-cell:&:duplex-list:char, editor:&:editor, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L349" class="LineNr"> 349 </span> <span class="Constant">local-scope</span> <span id="L350" class="LineNr"> 350 </span> <span class="Constant">load-ingredients</span> <span id="L351" class="LineNr"> 351 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L352" class="LineNr"> 352 </span> data:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">data:offset</span> -<span id="L353" class="LineNr"> 353 </span> deleted-cell:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L353" class="LineNr"> 353 </span> deleted-cell:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L354" class="LineNr"> 354 </span> <span class="muControl">return-unless</span> deleted-cell, <span class="Constant">0/don't-render</span> <span id="L355" class="LineNr"> 355 </span> currc:char <span class="Special"><-</span> get *deleted-cell, <span class="Constant">value:offset</span> <span id="L356" class="LineNr"> 356 </span> data <span class="Special"><-</span> remove deleted-cell, data <span id="L357" class="LineNr"> 357 </span> deleted-newline?:bool <span class="Special"><-</span> equal currc, <span class="Constant">10/newline</span> <span id="L358" class="LineNr"> 358 </span> <span class="muControl">return-if</span> deleted-newline?, <span class="Constant">1/go-render</span> <span id="L359" class="LineNr"> 359 </span> <span class="Comment"># wasn't a newline? render rest of line</span> -<span id="L360" class="LineNr"> 360 </span> curr:&:duplex-list:char <span class="Special"><-</span> next before-cursor <span class="Comment"># refresh after remove above</span> +<span id="L360" class="LineNr"> 360 </span> curr:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span class="Comment"># refresh after remove above</span> <span id="L361" class="LineNr"> 361 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L362" class="LineNr"> 362 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> -<span id="L363" class="LineNr"> 363 </span> screen <span class="Special"><-</span> move-cursor screen, cursor-row, cursor-column +<span id="L363" class="LineNr"> 363 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, cursor-row, cursor-column <span id="L364" class="LineNr"> 364 </span> curr-column:num <span class="Special"><-</span> copy cursor-column -<span id="L365" class="LineNr"> 365 </span> screen-width:num <span class="Special"><-</span> screen-width screen +<span id="L365" class="LineNr"> 365 </span> <a href='081print.mu.html#L581'>screen-width</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a> <span id="L366" class="LineNr"> 366 </span> <span class="Delimiter">{</span> <span id="L367" class="LineNr"> 367 </span> <span class="Comment"># hit right margin? give up and let caller render</span> -<span id="L368" class="LineNr"> 368 </span> at-right?:bool <span class="Special"><-</span> greater-or-equal curr-column, screen-width +<span id="L368" class="LineNr"> 368 </span> at-right?:bool <span class="Special"><-</span> greater-or-equal curr-column, <a href='081print.mu.html#L581'>screen-width</a> <span id="L369" class="LineNr"> 369 </span> <span class="muControl">return-if</span> at-right?, <span class="Constant">1/go-render</span> <span id="L370" class="LineNr"> 370 </span> <span class="muControl">break-unless</span> curr <span id="L371" class="LineNr"> 371 </span> <span class="Comment"># newline? done.</span> <span id="L372" class="LineNr"> 372 </span> currc:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L373" class="LineNr"> 373 </span> at-newline?:bool <span class="Special"><-</span> equal currc, <span class="Constant">10/newline</span> <span id="L374" class="LineNr"> 374 </span> <span class="muControl">break-if</span> at-newline? -<span id="L375" class="LineNr"> 375 </span> screen <span class="Special"><-</span> print screen, currc +<span id="L375" class="LineNr"> 375 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, currc <span id="L376" class="LineNr"> 376 </span> curr-column <span class="Special"><-</span> add curr-column,<span class="Constant"> 1</span> -<span id="L377" class="LineNr"> 377 </span> curr <span class="Special"><-</span> next curr +<span id="L377" class="LineNr"> 377 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L378" class="LineNr"> 378 </span> <span class="muControl">loop</span> <span id="L379" class="LineNr"> 379 </span> <span class="Delimiter">}</span> <span id="L380" class="LineNr"> 380 </span> <span class="Comment"># we're guaranteed not to be at the right margin</span> <span id="L381" class="LineNr"> 381 </span> space:char <span class="Special"><-</span> copy <span class="Constant">32/space</span> -<span id="L382" class="LineNr"> 382 </span> screen <span class="Special"><-</span> print screen, space +<span id="L382" class="LineNr"> 382 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, space <span id="L383" class="LineNr"> 383 </span> go-render? <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span id="L384" class="LineNr"> 384 </span>] <span id="L385" class="LineNr"> 385 </span> @@ -447,14 +447,14 @@ if ('onhashchange' in window) { <span id="L389" class="LineNr"> 389 </span> <span class="Constant">local-scope</span> <span id="L390" class="LineNr"> 390 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L391" class="LineNr"> 391 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L392" class="LineNr"> 392 </span> editor-render screen, e +<span id="L392" class="LineNr"> 392 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L393" class="LineNr"> 393 </span> $clear-trace <span id="L394" class="LineNr"> 394 </span> assume-console [ <span id="L395" class="LineNr"> 395 </span> press right-arrow <span id="L396" class="LineNr"> 396 </span> type <span class="Constant">[0]</span> <span id="L397" class="LineNr"> 397 </span> ] <span id="L398" class="LineNr"> 398 </span> run [ -<span id="L399" class="LineNr"> 399 </span> editor-event-loop screen, console, e +<span id="L399" class="LineNr"> 399 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L400" class="LineNr"> 400 </span> ] <span id="L401" class="LineNr"> 401 </span> screen-should-contain [ <span id="L402" class="LineNr"> 402 </span> <span class="Constant"> . .</span> @@ -470,21 +470,21 @@ if ('onhashchange' in window) { <span id="L412" class="LineNr"> 412 </span> move-to-next-character?:bool <span class="Special"><-</span> equal k, <span class="Constant">65514/right-arrow</span> <span id="L413" class="LineNr"> 413 </span> <span class="muControl">break-unless</span> move-to-next-character? <span id="L414" class="LineNr"> 414 </span> <span class="Comment"># if not at end of text</span> -<span id="L415" class="LineNr"> 415 </span> next-cursor:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L415" class="LineNr"> 415 </span> next-cursor:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L416" class="LineNr"> 416 </span> <span class="muControl">break-unless</span> next-cursor <span id="L417" class="LineNr"> 417 </span> <span class="Comment"># scan to next character</span> <span id="L418" class="LineNr"> 418 </span><span class="Constant"> <move-cursor-begin></span> <span id="L419" class="LineNr"> 419 </span> before-cursor <span class="Special"><-</span> copy next-cursor <span id="L420" class="LineNr"> 420 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor -<span id="L421" class="LineNr"> 421 </span> go-render?:bool <span class="Special"><-</span> move-cursor-coordinates-right editor, screen-height -<span id="L422" class="LineNr"> 422 </span> screen <span class="Special"><-</span> move-cursor screen, cursor-row, cursor-column +<span id="L421" class="LineNr"> 421 </span> go-render?:bool <span class="Special"><-</span> move-cursor-coordinates-right editor, <a href='081print.mu.html#L594'>screen-height</a> +<span id="L422" class="LineNr"> 422 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, cursor-row, cursor-column <span id="L423" class="LineNr"> 423 </span> undo-coalesce-tag:num <span class="Special"><-</span> copy <span class="Constant">2/right-arrow</span> <span id="L424" class="LineNr"> 424 </span><span class="Constant"> <move-cursor-end></span> <span id="L425" class="LineNr"> 425 </span> <span class="muControl">return</span> <span id="L426" class="LineNr"> 426 </span> <span class="Delimiter">}</span> <span id="L427" class="LineNr"> 427 </span>] <span id="L428" class="LineNr"> 428 </span> -<span id="L429" class="LineNr"> 429 </span><span class="muRecipe">def</span> move-cursor-coordinates-right editor:&:editor, screen-height:num<span class="muRecipe"> -> </span>go-render?:bool, editor:&:editor [ +<span id="L429" class="LineNr"> 429 </span><span class="muRecipe">def</span> move-cursor-coordinates-right editor:&:editor, <a href='081print.mu.html#L594'>screen-height</a>:num<span class="muRecipe"> -> </span>go-render?:bool, editor:&:editor [ <span id="L430" class="LineNr"> 430 </span> <span class="Constant">local-scope</span> <span id="L431" class="LineNr"> 431 </span> <span class="Constant">load-ingredients</span> <span id="L432" class="LineNr"> 432 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor <span class="Constant">before-cursor:offset</span> @@ -501,7 +501,7 @@ if ('onhashchange' in window) { <span id="L443" class="LineNr"> 443 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L444" class="LineNr"> 444 </span> cursor-column <span class="Special"><-</span> copy left <span id="L445" class="LineNr"> 445 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column -<span id="L446" class="LineNr"> 446 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, screen-height <span class="Comment"># must be equal</span> +<span id="L446" class="LineNr"> 446 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, <a href='081print.mu.html#L594'>screen-height</a> <span class="Comment"># must be equal</span> <span id="L447" class="LineNr"> 447 </span> <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/don't-render</span> <span id="L448" class="LineNr"> 448 </span><span class="Constant"> <scroll-down></span> <span id="L449" class="LineNr"> 449 </span> cursor-row <span class="Special"><-</span> subtract cursor-row,<span class="Constant"> 1</span> <span class="Comment"># bring back into screen range</span> @@ -515,8 +515,8 @@ if ('onhashchange' in window) { <span id="L457" class="LineNr"> 457 </span> at-wrap?:bool <span class="Special"><-</span> equal cursor-column, wrap-column <span id="L458" class="LineNr"> 458 </span> <span class="muControl">break-unless</span> at-wrap? <span id="L459" class="LineNr"> 459 </span> <span class="Comment"># and if next character isn't newline</span> -<span id="L460" class="LineNr"> 460 </span> next:&:duplex-list:char <span class="Special"><-</span> next before-cursor -<span id="L461" class="LineNr"> 461 </span> <span class="muControl">break-unless</span> next +<span id="L460" class="LineNr"> 460 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor +<span id="L461" class="LineNr"> 461 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L29'>next</a> <span id="L462" class="LineNr"> 462 </span> next-character:char <span class="Special"><-</span> get *next, <span class="Constant">value:offset</span> <span id="L463" class="LineNr"> 463 </span> newline?:bool <span class="Special"><-</span> equal next-character, <span class="Constant">10/newline</span> <span id="L464" class="LineNr"> 464 </span> <span class="muControl">break-if</span> newline? @@ -524,7 +524,7 @@ if ('onhashchange' in window) { <span id="L466" class="LineNr"> 466 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L467" class="LineNr"> 467 </span> cursor-column <span class="Special"><-</span> copy left <span id="L468" class="LineNr"> 468 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column -<span id="L469" class="LineNr"> 469 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, screen-height <span class="Comment"># must be equal</span> +<span id="L469" class="LineNr"> 469 </span> below-screen?:bool <span class="Special"><-</span> greater-or-equal cursor-row, <a href='081print.mu.html#L594'>screen-height</a> <span class="Comment"># must be equal</span> <span id="L470" class="LineNr"> 470 </span> <span class="muControl">return-unless</span> below-screen?, <span class="Constant">0/no-more-render</span> <span id="L471" class="LineNr"> 471 </span><span class="Constant"> <scroll-down></span> <span id="L472" class="LineNr"> 472 </span> cursor-row <span class="Special"><-</span> subtract cursor-row,<span class="Constant"> 1</span> <span class="Comment"># bring back into screen range</span> @@ -543,7 +543,7 @@ if ('onhashchange' in window) { <span id="L485" class="LineNr"> 485 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L486" class="LineNr"> 486 </span><span class="Constant">d]</span> <span id="L487" class="LineNr"> 487 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L488" class="LineNr"> 488 </span> editor-render screen, e +<span id="L488" class="LineNr"> 488 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L489" class="LineNr"> 489 </span> $clear-trace <span id="L490" class="LineNr"> 490 </span> <span class="Comment"># type right-arrow a few times to get to start of second line</span> <span id="L491" class="LineNr"> 491 </span> assume-console [ @@ -553,7 +553,7 @@ if ('onhashchange' in window) { <span id="L495" class="LineNr"> 495 </span> press right-arrow <span class="Comment"># next line</span> <span id="L496" class="LineNr"> 496 </span> ] <span id="L497" class="LineNr"> 497 </span> run [ -<span id="L498" class="LineNr"> 498 </span> editor-event-loop screen, console, e +<span id="L498" class="LineNr"> 498 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L499" class="LineNr"> 499 </span> ] <span id="L500" class="LineNr"> 500 </span> check-trace-count-for-label<span class="Constant"> 0</span>, <span class="Constant">[print-character]</span> <span id="L501" class="LineNr"> 501 </span> <span class="Comment"># type something and ensure it goes where it should</span> @@ -561,7 +561,7 @@ if ('onhashchange' in window) { <span id="L503" class="LineNr"> 503 </span> type <span class="Constant">[0]</span> <span id="L504" class="LineNr"> 504 </span> ] <span id="L505" class="LineNr"> 505 </span> run [ -<span id="L506" class="LineNr"> 506 </span> editor-event-loop screen, console, e +<span id="L506" class="LineNr"> 506 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L507" class="LineNr"> 507 </span> ] <span id="L508" class="LineNr"> 508 </span> screen-should-contain [ <span id="L509" class="LineNr"> 509 </span> <span class="Constant"> . .</span> @@ -579,7 +579,7 @@ if ('onhashchange' in window) { <span id="L521" class="LineNr"> 521 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L522" class="LineNr"> 522 </span><span class="Constant">d]</span> <span id="L523" class="LineNr"> 523 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">1/left</span>, <span class="Constant">10/right</span> -<span id="L524" class="LineNr"> 524 </span> editor-render screen, e +<span id="L524" class="LineNr"> 524 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L525" class="LineNr"> 525 </span> assume-console [ <span id="L526" class="LineNr"> 526 </span> press right-arrow <span id="L527" class="LineNr"> 527 </span> press right-arrow @@ -588,7 +588,7 @@ if ('onhashchange' in window) { <span id="L530" class="LineNr"> 530 </span> type <span class="Constant">[0]</span> <span id="L531" class="LineNr"> 531 </span> ] <span id="L532" class="LineNr"> 532 </span> run [ -<span id="L533" class="LineNr"> 533 </span> editor-event-loop screen, console, e +<span id="L533" class="LineNr"> 533 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L534" class="LineNr"> 534 </span> ] <span id="L535" class="LineNr"> 535 </span> screen-should-contain [ <span id="L536" class="LineNr"> 536 </span> <span class="Constant"> . .</span> @@ -603,14 +603,14 @@ if ('onhashchange' in window) { <span id="L545" class="LineNr"> 545 </span> <span class="Constant">local-scope</span> <span id="L546" class="LineNr"> 546 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L547" class="LineNr"> 547 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L548" class="LineNr"> 548 </span> editor-render screen, e +<span id="L548" class="LineNr"> 548 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L549" class="LineNr"> 549 </span> $clear-trace <span id="L550" class="LineNr"> 550 </span> assume-console [ <span id="L551" class="LineNr"> 551 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span> <span id="L552" class="LineNr"> 552 </span> press right-arrow <span id="L553" class="LineNr"> 553 </span> ] <span id="L554" class="LineNr"> 554 </span> run [ -<span id="L555" class="LineNr"> 555 </span> editor-event-loop screen, console, e +<span id="L555" class="LineNr"> 555 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L556" class="LineNr"> 556 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L557" class="LineNr"> 557 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L558" class="LineNr"> 558 </span> ] @@ -633,7 +633,7 @@ if ('onhashchange' in window) { <span id="L575" class="LineNr"> 575 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L576" class="LineNr"> 576 </span> <span class="Comment"># line just barely wrapping</span> <span id="L577" class="LineNr"> 577 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abcde]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L578" class="LineNr"> 578 </span> editor-render screen, e +<span id="L578" class="LineNr"> 578 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L579" class="LineNr"> 579 </span> $clear-trace <span id="L580" class="LineNr"> 580 </span> <span class="Comment"># position cursor at last character before wrap and hit right-arrow</span> <span id="L581" class="LineNr"> 581 </span> assume-console [ @@ -641,7 +641,7 @@ if ('onhashchange' in window) { <span id="L583" class="LineNr"> 583 </span> press right-arrow <span id="L584" class="LineNr"> 584 </span> ] <span id="L585" class="LineNr"> 585 </span> run [ -<span id="L586" class="LineNr"> 586 </span> editor-event-loop screen, console, e +<span id="L586" class="LineNr"> 586 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L587" class="LineNr"> 587 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L588" class="LineNr"> 588 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L589" class="LineNr"> 589 </span> ] @@ -654,7 +654,7 @@ if ('onhashchange' in window) { <span id="L596" class="LineNr"> 596 </span> press right-arrow <span id="L597" class="LineNr"> 597 </span> ] <span id="L598" class="LineNr"> 598 </span> run [ -<span id="L599" class="LineNr"> 599 </span> editor-event-loop screen, console, e +<span id="L599" class="LineNr"> 599 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L600" class="LineNr"> 600 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L601" class="LineNr"> 601 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L602" class="LineNr"> 602 </span> ] @@ -669,14 +669,14 @@ if ('onhashchange' in window) { <span id="L611" class="LineNr"> 611 </span> <span class="Constant">local-scope</span> <span id="L612" class="LineNr"> 612 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L613" class="LineNr"> 613 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">1/left</span>, <span class="Constant">6/right</span> -<span id="L614" class="LineNr"> 614 </span> editor-render screen, e +<span id="L614" class="LineNr"> 614 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L615" class="LineNr"> 615 </span> $clear-trace <span id="L616" class="LineNr"> 616 </span> assume-console [ <span id="L617" class="LineNr"> 617 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 4</span> <span id="L618" class="LineNr"> 618 </span> press right-arrow <span id="L619" class="LineNr"> 619 </span> ] <span id="L620" class="LineNr"> 620 </span> run [ -<span id="L621" class="LineNr"> 621 </span> editor-event-loop screen, console, e +<span id="L621" class="LineNr"> 621 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L622" class="LineNr"> 622 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L623" class="LineNr"> 623 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L624" class="LineNr"> 624 </span> ] @@ -700,7 +700,7 @@ if ('onhashchange' in window) { <span id="L642" class="LineNr"> 642 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L643" class="LineNr"> 643 </span><span class="Constant">d]</span> <span id="L644" class="LineNr"> 644 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L645" class="LineNr"> 645 </span> editor-render screen, e +<span id="L645" class="LineNr"> 645 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L646" class="LineNr"> 646 </span> $clear-trace <span id="L647" class="LineNr"> 647 </span> <span class="Comment"># move to end of line, press right-arrow, type a character</span> <span id="L648" class="LineNr"> 648 </span> assume-console [ @@ -709,7 +709,7 @@ if ('onhashchange' in window) { <span id="L651" class="LineNr"> 651 </span> type <span class="Constant">[0]</span> <span id="L652" class="LineNr"> 652 </span> ] <span id="L653" class="LineNr"> 653 </span> run [ -<span id="L654" class="LineNr"> 654 </span> editor-event-loop screen, console, e +<span id="L654" class="LineNr"> 654 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L655" class="LineNr"> 655 </span> ] <span id="L656" class="LineNr"> 656 </span> <span class="Comment"># new character should be in next line</span> <span id="L657" class="LineNr"> 657 </span> screen-should-contain [ @@ -730,7 +730,7 @@ if ('onhashchange' in window) { <span id="L672" class="LineNr"> 672 </span> <span class="Constant">local-scope</span> <span id="L673" class="LineNr"> 673 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L674" class="LineNr"> 674 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L675" class="LineNr"> 675 </span> editor-render screen, e +<span id="L675" class="LineNr"> 675 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L676" class="LineNr"> 676 </span> $clear-trace <span id="L677" class="LineNr"> 677 </span> assume-console [ <span id="L678" class="LineNr"> 678 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span> @@ -738,7 +738,7 @@ if ('onhashchange' in window) { <span id="L680" class="LineNr"> 680 </span> type <span class="Constant">[0]</span> <span id="L681" class="LineNr"> 681 </span> ] <span id="L682" class="LineNr"> 682 </span> run [ -<span id="L683" class="LineNr"> 683 </span> editor-event-loop screen, console, e +<span id="L683" class="LineNr"> 683 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L684" class="LineNr"> 684 </span> ] <span id="L685" class="LineNr"> 685 </span> screen-should-contain [ <span id="L686" class="LineNr"> 686 </span> <span class="Constant"> . .</span> @@ -755,11 +755,11 @@ if ('onhashchange' in window) { <span id="L697" class="LineNr"> 697 </span> <span class="muControl">break-unless</span> move-to-previous-character? <span id="L698" class="LineNr"> 698 </span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[left arrow]</span> <span id="L699" class="LineNr"> 699 </span> <span class="Comment"># if not at start of text (before-cursor at § sentinel)</span> -<span id="L700" class="LineNr"> 700 </span> prev:&:duplex-list:char <span class="Special"><-</span> prev before-cursor -<span id="L701" class="LineNr"> 701 </span> <span class="muControl">return-unless</span> prev, <span class="Constant">0/don't-render</span> +<span id="L700" class="LineNr"> 700 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> before-cursor +<span id="L701" class="LineNr"> 701 </span> <span class="muControl">return-unless</span> <a href='065duplex_list.mu.html#L36'>prev</a>, <span class="Constant">0/don't-render</span> <span id="L702" class="LineNr"> 702 </span><span class="Constant"> <move-cursor-begin></span> <span id="L703" class="LineNr"> 703 </span> go-render? <span class="Special"><-</span> move-cursor-coordinates-left editor -<span id="L704" class="LineNr"> 704 </span> before-cursor <span class="Special"><-</span> copy prev +<span id="L704" class="LineNr"> 704 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L705" class="LineNr"> 705 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L706" class="LineNr"> 706 </span> undo-coalesce-tag:num <span class="Special"><-</span> copy <span class="Constant">1/left-arrow</span> <span id="L707" class="LineNr"> 707 </span><span class="Constant"> <move-cursor-end></span> @@ -774,7 +774,7 @@ if ('onhashchange' in window) { <span id="L716" class="LineNr"> 716 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L717" class="LineNr"> 717 </span><span class="Constant">d]</span> <span id="L718" class="LineNr"> 718 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L719" class="LineNr"> 719 </span> editor-render screen, e +<span id="L719" class="LineNr"> 719 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L720" class="LineNr"> 720 </span> $clear-trace <span id="L721" class="LineNr"> 721 </span> <span class="Comment"># position cursor at start of second line (so there's no previous newline)</span> <span id="L722" class="LineNr"> 722 </span> assume-console [ @@ -782,7 +782,7 @@ if ('onhashchange' in window) { <span id="L724" class="LineNr"> 724 </span> press left-arrow <span id="L725" class="LineNr"> 725 </span> ] <span id="L726" class="LineNr"> 726 </span> run [ -<span id="L727" class="LineNr"> 727 </span> editor-event-loop screen, console, e +<span id="L727" class="LineNr"> 727 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L728" class="LineNr"> 728 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L729" class="LineNr"> 729 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L730" class="LineNr"> 730 </span> ] @@ -801,7 +801,7 @@ if ('onhashchange' in window) { <span id="L743" class="LineNr"> 743 </span><span class="Constant">def</span> <span id="L744" class="LineNr"> 744 </span><span class="Constant">g]</span> <span id="L745" class="LineNr"> 745 </span> e:&:editor <span class="Special"><-</span> new-editor s:text, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L746" class="LineNr"> 746 </span> editor-render screen, e +<span id="L746" class="LineNr"> 746 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L747" class="LineNr"> 747 </span> $clear-trace <span id="L748" class="LineNr"> 748 </span> <span class="Comment"># position cursor further down (so there's a newline before the character at</span> <span id="L749" class="LineNr"> 749 </span> <span class="Comment"># the cursor)</span> @@ -811,7 +811,7 @@ if ('onhashchange' in window) { <span id="L753" class="LineNr"> 753 </span> type <span class="Constant">[0]</span> <span id="L754" class="LineNr"> 754 </span> ] <span id="L755" class="LineNr"> 755 </span> run [ -<span id="L756" class="LineNr"> 756 </span> editor-event-loop screen, console, e +<span id="L756" class="LineNr"> 756 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L757" class="LineNr"> 757 </span> ] <span id="L758" class="LineNr"> 758 </span> screen-should-contain [ <span id="L759" class="LineNr"> 759 </span> <span class="Constant"> . .</span> @@ -830,7 +830,7 @@ if ('onhashchange' in window) { <span id="L772" class="LineNr"> 772 </span><span class="Constant">def</span> <span id="L773" class="LineNr"> 773 </span><span class="Constant">g]</span> <span id="L774" class="LineNr"> 774 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L775" class="LineNr"> 775 </span> editor-render screen, e +<span id="L775" class="LineNr"> 775 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L776" class="LineNr"> 776 </span> $clear-trace <span id="L777" class="LineNr"> 777 </span> <span class="Comment"># position cursor at start of text, press left-arrow, then type a character</span> <span id="L778" class="LineNr"> 778 </span> assume-console [ @@ -839,7 +839,7 @@ if ('onhashchange' in window) { <span id="L781" class="LineNr"> 781 </span> type <span class="Constant">[0]</span> <span id="L782" class="LineNr"> 782 </span> ] <span id="L783" class="LineNr"> 783 </span> run [ -<span id="L784" class="LineNr"> 784 </span> editor-event-loop screen, console, e +<span id="L784" class="LineNr"> 784 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L785" class="LineNr"> 785 </span> ] <span id="L786" class="LineNr"> 786 </span> <span class="Comment"># left-arrow should have had no effect</span> <span id="L787" class="LineNr"> 787 </span> screen-should-contain [ @@ -860,7 +860,7 @@ if ('onhashchange' in window) { <span id="L802" class="LineNr"> 802 </span> <span id="L803" class="LineNr"> 803 </span>d] <span id="L804" class="LineNr"> 804 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L805" class="LineNr"> 805 </span> editor-render screen, e:&:editor +<span id="L805" class="LineNr"> 805 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e:&:editor <span id="L806" class="LineNr"> 806 </span> $clear-trace <span id="L807" class="LineNr"> 807 </span> <span class="Comment"># position cursor right after empty line</span> <span id="L808" class="LineNr"> 808 </span> assume-console [ @@ -869,7 +869,7 @@ if ('onhashchange' in window) { <span id="L811" class="LineNr"> 811 </span> type <span class="Constant">[0]</span> <span id="L812" class="LineNr"> 812 </span> ] <span id="L813" class="LineNr"> 813 </span> run [ -<span id="L814" class="LineNr"> 814 </span> editor-event-loop screen, console, e +<span id="L814" class="LineNr"> 814 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L815" class="LineNr"> 815 </span> ] <span id="L816" class="LineNr"> 816 </span> screen-should-contain [ <span id="L817" class="LineNr"> 817 </span> <span class="Constant"> . .</span> @@ -886,7 +886,7 @@ if ('onhashchange' in window) { <span id="L828" class="LineNr"> 828 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L829" class="LineNr"> 829 </span> <span class="Comment"># initialize editor with a wrapping line</span> <span id="L830" class="LineNr"> 830 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[abcdef]</span>, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L831" class="LineNr"> 831 </span> editor-render screen, e +<span id="L831" class="LineNr"> 831 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L832" class="LineNr"> 832 </span> $clear-trace <span id="L833" class="LineNr"> 833 </span> screen-should-contain [ <span id="L834" class="LineNr"> 834 </span> <span class="Constant"> . .</span> @@ -901,7 +901,7 @@ if ('onhashchange' in window) { <span id="L843" class="LineNr"> 843 </span> press left-arrow <span id="L844" class="LineNr"> 844 </span> ] <span id="L845" class="LineNr"> 845 </span> run [ -<span id="L846" class="LineNr"> 846 </span> editor-event-loop screen, console, e +<span id="L846" class="LineNr"> 846 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L847" class="LineNr"> 847 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L848" class="LineNr"> 848 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L849" class="LineNr"> 849 </span> ] @@ -919,7 +919,7 @@ if ('onhashchange' in window) { <span id="L861" class="LineNr"> 861 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abcdef</span> <span id="L862" class="LineNr"> 862 </span><span class="Constant">g]</span> <span id="L863" class="LineNr"> 863 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L864" class="LineNr"> 864 </span> editor-render screen, e +<span id="L864" class="LineNr"> 864 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L865" class="LineNr"> 865 </span> $clear-trace <span id="L866" class="LineNr"> 866 </span> screen-should-contain [ <span id="L867" class="LineNr"> 867 </span> <span class="Constant"> . .</span> @@ -934,7 +934,7 @@ if ('onhashchange' in window) { <span id="L876" class="LineNr"> 876 </span> press left-arrow <span id="L877" class="LineNr"> 877 </span> ] <span id="L878" class="LineNr"> 878 </span> run [ -<span id="L879" class="LineNr"> 879 </span> editor-event-loop screen, console, e +<span id="L879" class="LineNr"> 879 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L880" class="LineNr"> 880 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L881" class="LineNr"> 881 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L882" class="LineNr"> 882 </span> ] @@ -952,7 +952,7 @@ if ('onhashchange' in window) { <span id="L894" class="LineNr"> 894 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abcd</span> <span id="L895" class="LineNr"> 895 </span><span class="Constant">e]</span> <span id="L896" class="LineNr"> 896 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L897" class="LineNr"> 897 </span> editor-render screen, e +<span id="L897" class="LineNr"> 897 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L898" class="LineNr"> 898 </span> $clear-trace <span id="L899" class="LineNr"> 899 </span> screen-should-contain [ <span id="L900" class="LineNr"> 900 </span> <span class="Constant"> . .</span> @@ -967,7 +967,7 @@ if ('onhashchange' in window) { <span id="L909" class="LineNr"> 909 </span> press left-arrow <span id="L910" class="LineNr"> 910 </span> ] <span id="L911" class="LineNr"> 911 </span> run [ -<span id="L912" class="LineNr"> 912 </span> editor-event-loop screen, console, e +<span id="L912" class="LineNr"> 912 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L913" class="LineNr"> 913 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L914" class="LineNr"> 914 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L915" class="LineNr"> 915 </span> ] @@ -988,14 +988,14 @@ if ('onhashchange' in window) { <span id="L930" class="LineNr"> 930 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L931" class="LineNr"> 931 </span><span class="Constant">def]</span> <span id="L932" class="LineNr"> 932 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L933" class="LineNr"> 933 </span> editor-render screen, e +<span id="L933" class="LineNr"> 933 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L934" class="LineNr"> 934 </span> $clear-trace <span id="L935" class="LineNr"> 935 </span> assume-console [ <span id="L936" class="LineNr"> 936 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span> <span id="L937" class="LineNr"> 937 </span> press up-arrow <span id="L938" class="LineNr"> 938 </span> ] <span id="L939" class="LineNr"> 939 </span> run [ -<span id="L940" class="LineNr"> 940 </span> editor-event-loop screen, console, e +<span id="L940" class="LineNr"> 940 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L941" class="LineNr"> 941 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L942" class="LineNr"> 942 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L943" class="LineNr"> 943 </span> ] @@ -1008,7 +1008,7 @@ if ('onhashchange' in window) { <span id="L950" class="LineNr"> 950 </span> type <span class="Constant">[0]</span> <span id="L951" class="LineNr"> 951 </span> ] <span id="L952" class="LineNr"> 952 </span> run [ -<span id="L953" class="LineNr"> 953 </span> editor-event-loop screen, console, e +<span id="L953" class="LineNr"> 953 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L954" class="LineNr"> 954 </span> ] <span id="L955" class="LineNr"> 955 </span> screen-should-contain [ <span id="L956" class="LineNr"> 956 </span> <span class="Constant"> . .</span> @@ -1074,7 +1074,7 @@ if ('onhashchange' in window) { <span id="L1016" class="LineNr">1016 </span> <span class="Delimiter">{</span> <span id="L1017" class="LineNr">1017 </span> done?:bool <span class="Special"><-</span> greater-or-equal cursor-column, target-column <span id="L1018" class="LineNr">1018 </span> <span class="muControl">break-if</span> done? -<span id="L1019" class="LineNr">1019 </span> curr:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L1019" class="LineNr">1019 </span> curr:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L1020" class="LineNr">1020 </span> <span class="muControl">break-unless</span> curr <span id="L1021" class="LineNr">1021 </span> currc:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L1022" class="LineNr">1022 </span> at-newline?:bool <span class="Special"><-</span> equal currc, <span class="Constant">10/newline</span> @@ -1102,14 +1102,14 @@ if ('onhashchange' in window) { <span id="L1044" class="LineNr">1044 </span> s:text <span class="Special"><-</span> new <span class="Constant">[ab</span> <span id="L1045" class="LineNr">1045 </span><span class="Constant">def]</span> <span id="L1046" class="LineNr">1046 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1047" class="LineNr">1047 </span> editor-render screen, e +<span id="L1047" class="LineNr">1047 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1048" class="LineNr">1048 </span> $clear-trace <span id="L1049" class="LineNr">1049 </span> assume-console [ <span id="L1050" class="LineNr">1050 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span> <span id="L1051" class="LineNr">1051 </span> press up-arrow <span id="L1052" class="LineNr">1052 </span> ] <span id="L1053" class="LineNr">1053 </span> run [ -<span id="L1054" class="LineNr">1054 </span> editor-event-loop screen, console, e +<span id="L1054" class="LineNr">1054 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1055" class="LineNr">1055 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1056" class="LineNr">1056 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1057" class="LineNr">1057 </span> ] @@ -1122,7 +1122,7 @@ if ('onhashchange' in window) { <span id="L1064" class="LineNr">1064 </span> type <span class="Constant">[0]</span> <span id="L1065" class="LineNr">1065 </span> ] <span id="L1066" class="LineNr">1066 </span> run [ -<span id="L1067" class="LineNr">1067 </span> editor-event-loop screen, console, e +<span id="L1067" class="LineNr">1067 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1068" class="LineNr">1068 </span> ] <span id="L1069" class="LineNr">1069 </span> screen-should-contain [ <span id="L1070" class="LineNr">1070 </span> <span class="Constant"> . .</span> @@ -1139,14 +1139,14 @@ if ('onhashchange' in window) { <span id="L1081" class="LineNr">1081 </span> s:text <span class="Special"><-</span> new [ <span id="L1082" class="LineNr">1082 </span><span class="muRecipe">def</span>] <span id="L1083" class="LineNr">1083 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1084" class="LineNr">1084 </span> editor-render screen, e +<span id="L1084" class="LineNr">1084 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1085" class="LineNr">1085 </span> $clear-trace <span id="L1086" class="LineNr">1086 </span> assume-console [ <span id="L1087" class="LineNr">1087 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 3</span> <span id="L1088" class="LineNr">1088 </span> press up-arrow <span id="L1089" class="LineNr">1089 </span> ] <span id="L1090" class="LineNr">1090 </span> run [ -<span id="L1091" class="LineNr">1091 </span> editor-event-loop screen, console, e +<span id="L1091" class="LineNr">1091 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1092" class="LineNr">1092 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1093" class="LineNr">1093 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1094" class="LineNr">1094 </span> ] @@ -1159,7 +1159,7 @@ if ('onhashchange' in window) { <span id="L1101" class="LineNr">1101 </span> type <span class="Constant">[0]</span> <span id="L1102" class="LineNr">1102 </span> ] <span id="L1103" class="LineNr">1103 </span> run [ -<span id="L1104" class="LineNr">1104 </span> editor-event-loop screen, console, e +<span id="L1104" class="LineNr">1104 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1105" class="LineNr">1105 </span> ] <span id="L1106" class="LineNr">1106 </span> screen-should-contain [ <span id="L1107" class="LineNr">1107 </span> <span class="Constant"> . .</span> @@ -1178,7 +1178,7 @@ if ('onhashchange' in window) { <span id="L1120" class="LineNr">1120 </span><span class="Constant">def</span> <span id="L1121" class="LineNr">1121 </span><span class="Constant">ghi]</span> <span id="L1122" class="LineNr">1122 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1123" class="LineNr">1123 </span> editor-render screen, e +<span id="L1123" class="LineNr">1123 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1124" class="LineNr">1124 </span> $clear-trace <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> <span id="L1126" class="LineNr">1126 </span> assume-console [ @@ -1186,7 +1186,7 @@ if ('onhashchange' in window) { <span id="L1128" class="LineNr">1128 </span> press up-arrow <span id="L1129" class="LineNr">1129 </span> ] <span id="L1130" class="LineNr">1130 </span> run [ -<span id="L1131" class="LineNr">1131 </span> editor-event-loop screen, console, e +<span id="L1131" class="LineNr">1131 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1132" class="LineNr">1132 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1133" class="LineNr">1133 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1134" class="LineNr">1134 </span> ] @@ -1199,7 +1199,7 @@ if ('onhashchange' in window) { <span id="L1141" class="LineNr">1141 </span> type <span class="Constant">[0]</span> <span id="L1142" class="LineNr">1142 </span> ] <span id="L1143" class="LineNr">1143 </span> run [ -<span id="L1144" class="LineNr">1144 </span> editor-event-loop screen, console, e +<span id="L1144" class="LineNr">1144 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1145" class="LineNr">1145 </span> ] <span id="L1146" class="LineNr">1146 </span> screen-should-contain [ <span id="L1147" class="LineNr">1147 </span> <span class="Constant"> . .</span> @@ -1218,14 +1218,14 @@ if ('onhashchange' in window) { <span id="L1160" class="LineNr">1160 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L1161" class="LineNr">1161 </span><span class="Constant">def]</span> <span id="L1162" class="LineNr">1162 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1163" class="LineNr">1163 </span> editor-render screen, e +<span id="L1163" class="LineNr">1163 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1164" class="LineNr">1164 </span> $clear-trace <span id="L1165" class="LineNr">1165 </span> <span class="Comment"># cursor starts out at (1, 0)</span> <span id="L1166" class="LineNr">1166 </span> assume-console [ <span id="L1167" class="LineNr">1167 </span> press down-arrow <span id="L1168" class="LineNr">1168 </span> ] <span id="L1169" class="LineNr">1169 </span> run [ -<span id="L1170" class="LineNr">1170 </span> editor-event-loop screen, console, e +<span id="L1170" class="LineNr">1170 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1171" class="LineNr">1171 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1172" class="LineNr">1172 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1173" class="LineNr">1173 </span> ] @@ -1239,7 +1239,7 @@ if ('onhashchange' in window) { <span id="L1181" class="LineNr">1181 </span> type <span class="Constant">[0]</span> <span id="L1182" class="LineNr">1182 </span> ] <span id="L1183" class="LineNr">1183 </span> run [ -<span id="L1184" class="LineNr">1184 </span> editor-event-loop screen, console, e +<span id="L1184" class="LineNr">1184 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1185" class="LineNr">1185 </span> ] <span id="L1186" class="LineNr">1186 </span> screen-should-contain [ <span id="L1187" class="LineNr">1187 </span> <span class="Constant"> . .</span> @@ -1255,14 +1255,14 @@ if ('onhashchange' in window) { <span id="L1197" class="LineNr">1197 </span> move-to-next-line?:bool <span class="Special"><-</span> equal k, <span class="Constant">65516/down-arrow</span> <span id="L1198" class="LineNr">1198 </span> <span class="muControl">break-unless</span> move-to-next-line? <span id="L1199" class="LineNr">1199 </span><span class="Constant"> <move-cursor-begin></span> -<span id="L1200" class="LineNr">1200 </span> go-render? <span class="Special"><-</span> move-to-next-line editor, screen-height +<span id="L1200" class="LineNr">1200 </span> go-render? <span class="Special"><-</span> move-to-next-line editor, <a href='081print.mu.html#L594'>screen-height</a> <span id="L1201" class="LineNr">1201 </span> undo-coalesce-tag:num <span class="Special"><-</span> copy <span class="Constant">4/down-arrow</span> <span id="L1202" class="LineNr">1202 </span><span class="Constant"> <move-cursor-end></span> <span id="L1203" class="LineNr">1203 </span> <span class="muControl">return</span> <span id="L1204" class="LineNr">1204 </span> <span class="Delimiter">}</span> <span id="L1205" class="LineNr">1205 </span>] <span id="L1206" class="LineNr">1206 </span> -<span id="L1207" class="LineNr">1207 </span><span class="muRecipe">def</span> move-to-next-line editor:&:editor, screen-height:num<span class="muRecipe"> -> </span>go-render?:bool, editor:&:editor [ +<span id="L1207" class="LineNr">1207 </span><span class="muRecipe">def</span> move-to-next-line editor:&:editor, <a href='081print.mu.html#L594'>screen-height</a>:num<span class="muRecipe"> -> </span>go-render?:bool, editor:&:editor [ <span id="L1208" class="LineNr">1208 </span> <span class="Constant">local-scope</span> <span id="L1209" class="LineNr">1209 </span> <span class="Constant">load-ingredients</span> <span id="L1210" class="LineNr">1210 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> @@ -1270,7 +1270,7 @@ if ('onhashchange' in window) { <span id="L1212" class="LineNr">1212 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L1213" class="LineNr">1213 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> <span id="L1214" class="LineNr">1214 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> -<span id="L1215" class="LineNr">1215 </span> last-line:num <span class="Special"><-</span> subtract screen-height,<span class="Constant"> 1</span> +<span id="L1215" class="LineNr">1215 </span> last-line:num <span class="Special"><-</span> subtract <a href='081print.mu.html#L594'>screen-height</a>,<span class="Constant"> 1</span> <span id="L1216" class="LineNr">1216 </span> already-at-bottom?:bool <span class="Special"><-</span> greater-or-equal cursor-row, last-line <span id="L1217" class="LineNr">1217 </span> <span class="Delimiter">{</span> <span id="L1218" class="LineNr">1218 </span> <span class="Comment"># if cursor not at bottom, move it</span> @@ -1297,7 +1297,7 @@ if ('onhashchange' in window) { <span id="L1239" class="LineNr">1239 </span> <span class="Delimiter">{</span> <span id="L1240" class="LineNr">1240 </span> done?:bool <span class="Special"><-</span> greater-or-equal cursor-column, target-column <span id="L1241" class="LineNr">1241 </span> <span class="muControl">break-if</span> done? -<span id="L1242" class="LineNr">1242 </span> curr:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L1242" class="LineNr">1242 </span> curr:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L1243" class="LineNr">1243 </span> <span class="muControl">break-unless</span> curr <span id="L1244" class="LineNr">1244 </span> currc:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L1245" class="LineNr">1245 </span> at-newline?:bool <span class="Special"><-</span> equal currc, <span class="Constant">10/newline</span> @@ -1322,14 +1322,14 @@ if ('onhashchange' in window) { <span id="L1264" class="LineNr">1264 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L1265" class="LineNr">1265 </span><span class="Constant">de]</span> <span id="L1266" class="LineNr">1266 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1267" class="LineNr">1267 </span> editor-render screen, e +<span id="L1267" class="LineNr">1267 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1268" class="LineNr">1268 </span> $clear-trace <span id="L1269" class="LineNr">1269 </span> assume-console [ <span id="L1270" class="LineNr">1270 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 3</span> <span id="L1271" class="LineNr">1271 </span> press down-arrow <span id="L1272" class="LineNr">1272 </span> ] <span id="L1273" class="LineNr">1273 </span> run [ -<span id="L1274" class="LineNr">1274 </span> editor-event-loop screen, console, e +<span id="L1274" class="LineNr">1274 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1275" class="LineNr">1275 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1276" class="LineNr">1276 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1277" class="LineNr">1277 </span> ] @@ -1342,7 +1342,7 @@ if ('onhashchange' in window) { <span id="L1284" class="LineNr">1284 </span> type <span class="Constant">[0]</span> <span id="L1285" class="LineNr">1285 </span> ] <span id="L1286" class="LineNr">1286 </span> run [ -<span id="L1287" class="LineNr">1287 </span> editor-event-loop screen, console, e +<span id="L1287" class="LineNr">1287 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1288" class="LineNr">1288 </span> ] <span id="L1289" class="LineNr">1289 </span> screen-should-contain [ <span id="L1290" class="LineNr">1290 </span> <span class="Constant"> . .</span> @@ -1361,7 +1361,7 @@ if ('onhashchange' in window) { <span id="L1303" class="LineNr">1303 </span> s:text <span class="Special"><-</span> new <span class="Constant">[123</span> <span id="L1304" class="LineNr">1304 </span><span class="Constant">456]</span> <span id="L1305" class="LineNr">1305 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1306" class="LineNr">1306 </span> editor-render screen, e +<span id="L1306" class="LineNr">1306 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1307" class="LineNr">1307 </span> $clear-trace <span id="L1308" class="LineNr">1308 </span> <span class="Comment"># start on second line, press ctrl-a</span> <span id="L1309" class="LineNr">1309 </span> assume-console [ @@ -1369,7 +1369,7 @@ if ('onhashchange' in window) { <span id="L1311" class="LineNr">1311 </span> press ctrl-a <span id="L1312" class="LineNr">1312 </span> ] <span id="L1313" class="LineNr">1313 </span> run [ -<span id="L1314" class="LineNr">1314 </span> editor-event-loop screen, console, e +<span id="L1314" class="LineNr">1314 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1315" class="LineNr">1315 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1316" class="LineNr">1316 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1317" class="LineNr">1317 </span> ] @@ -1419,10 +1419,10 @@ if ('onhashchange' in window) { <span id="L1361" class="LineNr">1361 </span> <span class="Delimiter">{</span> <span id="L1362" class="LineNr">1362 </span> at-start-of-text?:bool <span class="Special"><-</span> equal before-cursor, init <span id="L1363" class="LineNr">1363 </span> <span class="muControl">break-if</span> at-start-of-text? -<span id="L1364" class="LineNr">1364 </span> prev:char <span class="Special"><-</span> get *before-cursor, <span class="Constant">value:offset</span> -<span id="L1365" class="LineNr">1365 </span> at-start-of-line?:bool <span class="Special"><-</span> equal prev, <span class="Constant">10/newline</span> +<span id="L1364" class="LineNr">1364 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:char <span class="Special"><-</span> get *before-cursor, <span class="Constant">value:offset</span> +<span id="L1365" class="LineNr">1365 </span> at-start-of-line?:bool <span class="Special"><-</span> equal <a href='065duplex_list.mu.html#L36'>prev</a>, <span class="Constant">10/newline</span> <span id="L1366" class="LineNr">1366 </span> <span class="muControl">break-if</span> at-start-of-line? -<span id="L1367" class="LineNr">1367 </span> before-cursor <span class="Special"><-</span> prev before-cursor +<span id="L1367" class="LineNr">1367 </span> before-cursor <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> before-cursor <span id="L1368" class="LineNr">1368 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <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> <span id="L1370" class="LineNr">1370 </span> <span class="muControl">loop</span> @@ -1435,7 +1435,7 @@ if ('onhashchange' in window) { <span id="L1377" class="LineNr">1377 </span> s:text <span class="Special"><-</span> new <span class="Constant">[123</span> <span id="L1378" class="LineNr">1378 </span><span class="Constant">456]</span> <span id="L1379" class="LineNr">1379 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1380" class="LineNr">1380 </span> editor-render screen, e +<span id="L1380" class="LineNr">1380 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1381" class="LineNr">1381 </span> $clear-trace <span id="L1382" class="LineNr">1382 </span> <span class="Comment"># start on first line (no newline before), press ctrl-a</span> <span id="L1383" class="LineNr">1383 </span> assume-console [ @@ -1443,7 +1443,7 @@ if ('onhashchange' in window) { <span id="L1385" class="LineNr">1385 </span> press ctrl-a <span id="L1386" class="LineNr">1386 </span> ] <span id="L1387" class="LineNr">1387 </span> run [ -<span id="L1388" class="LineNr">1388 </span> editor-event-loop screen, console, e +<span id="L1388" class="LineNr">1388 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1389" class="LineNr">1389 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1390" class="LineNr">1390 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1391" class="LineNr">1391 </span> ] @@ -1468,7 +1468,7 @@ if ('onhashchange' in window) { <span id="L1410" class="LineNr">1410 </span> press home <span id="L1411" class="LineNr">1411 </span> ] <span id="L1412" class="LineNr">1412 </span> run [ -<span id="L1413" class="LineNr">1413 </span> editor-event-loop screen, console, e +<span id="L1413" class="LineNr">1413 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1414" class="LineNr">1414 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1415" class="LineNr">1415 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1416" class="LineNr">1416 </span> ] @@ -1486,7 +1486,7 @@ if ('onhashchange' in window) { <span id="L1428" class="LineNr">1428 </span> s:text <span class="Special"><-</span> new <span class="Constant">[123</span> <span id="L1429" class="LineNr">1429 </span><span class="Constant">456]</span> <span id="L1430" class="LineNr">1430 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1431" class="LineNr">1431 </span> editor-render screen, e +<span id="L1431" class="LineNr">1431 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1432" class="LineNr">1432 </span> $clear-trace <span id="L1433" class="LineNr">1433 </span> <span class="Comment"># start on first line (no newline before), press 'home'</span> <span id="L1434" class="LineNr">1434 </span> assume-console [ @@ -1494,7 +1494,7 @@ if ('onhashchange' in window) { <span id="L1436" class="LineNr">1436 </span> press home <span id="L1437" class="LineNr">1437 </span> ] <span id="L1438" class="LineNr">1438 </span> run [ -<span id="L1439" class="LineNr">1439 </span> editor-event-loop screen, console, e +<span id="L1439" class="LineNr">1439 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1440" class="LineNr">1440 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1441" class="LineNr">1441 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1442" class="LineNr">1442 </span> ] @@ -1514,7 +1514,7 @@ if ('onhashchange' in window) { <span id="L1456" class="LineNr">1456 </span> s:text <span class="Special"><-</span> new <span class="Constant">[123</span> <span id="L1457" class="LineNr">1457 </span><span class="Constant">456]</span> <span id="L1458" class="LineNr">1458 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1459" class="LineNr">1459 </span> editor-render screen, e +<span id="L1459" class="LineNr">1459 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1460" class="LineNr">1460 </span> $clear-trace <span id="L1461" class="LineNr">1461 </span> <span class="Comment"># start on first line, press ctrl-e</span> <span id="L1462" class="LineNr">1462 </span> assume-console [ @@ -1522,7 +1522,7 @@ if ('onhashchange' in window) { <span id="L1464" class="LineNr">1464 </span> press ctrl-e <span id="L1465" class="LineNr">1465 </span> ] <span id="L1466" class="LineNr">1466 </span> run [ -<span id="L1467" class="LineNr">1467 </span> editor-event-loop screen, console, e +<span id="L1467" class="LineNr">1467 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1468" class="LineNr">1468 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1469" class="LineNr">1469 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1470" class="LineNr">1470 </span> ] @@ -1537,7 +1537,7 @@ if ('onhashchange' in window) { <span id="L1479" class="LineNr">1479 </span> type <span class="Constant">[z]</span> <span id="L1480" class="LineNr">1480 </span> ] <span id="L1481" class="LineNr">1481 </span> run [ -<span id="L1482" class="LineNr">1482 </span> editor-event-loop screen, console, e +<span id="L1482" class="LineNr">1482 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1483" class="LineNr">1483 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1484" class="LineNr">1484 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1485" class="LineNr">1485 </span> ] @@ -1586,12 +1586,12 @@ if ('onhashchange' in window) { <span id="L1528" class="LineNr">1528 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> <span id="L1529" class="LineNr">1529 </span> <span class="Comment"># while not at start of line, move</span> <span id="L1530" class="LineNr">1530 </span> <span class="Delimiter">{</span> -<span id="L1531" class="LineNr">1531 </span> next:&:duplex-list:char <span class="Special"><-</span> next before-cursor -<span id="L1532" class="LineNr">1532 </span> <span class="muControl">break-unless</span> next <span class="Comment"># end of text</span> +<span id="L1531" class="LineNr">1531 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor +<span id="L1532" class="LineNr">1532 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L29'>next</a> <span class="Comment"># end of text</span> <span id="L1533" class="LineNr">1533 </span> nextc:char <span class="Special"><-</span> get *next, <span class="Constant">value:offset</span> <span id="L1534" class="LineNr">1534 </span> at-end-of-line?:bool <span class="Special"><-</span> equal nextc, <span class="Constant">10/newline</span> <span id="L1535" class="LineNr">1535 </span> <span class="muControl">break-if</span> at-end-of-line? -<span id="L1536" class="LineNr">1536 </span> before-cursor <span class="Special"><-</span> copy next +<span id="L1536" class="LineNr">1536 </span> before-cursor <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L29'>next</a> <span id="L1537" class="LineNr">1537 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L1538" class="LineNr">1538 </span> cursor-column <span class="Special"><-</span> add cursor-column,<span class="Constant"> 1</span> <span id="L1539" class="LineNr">1539 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, cursor-column @@ -1605,7 +1605,7 @@ if ('onhashchange' in window) { <span id="L1547" class="LineNr">1547 </span> s:text <span class="Special"><-</span> new <span class="Constant">[123</span> <span id="L1548" class="LineNr">1548 </span><span class="Constant">456]</span> <span id="L1549" class="LineNr">1549 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1550" class="LineNr">1550 </span> editor-render screen, e +<span id="L1550" class="LineNr">1550 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1551" class="LineNr">1551 </span> $clear-trace <span id="L1552" class="LineNr">1552 </span> <span class="Comment"># start on second line (no newline after), press ctrl-e</span> <span id="L1553" class="LineNr">1553 </span> assume-console [ @@ -1613,7 +1613,7 @@ if ('onhashchange' in window) { <span id="L1555" class="LineNr">1555 </span> press ctrl-e <span id="L1556" class="LineNr">1556 </span> ] <span id="L1557" class="LineNr">1557 </span> run [ -<span id="L1558" class="LineNr">1558 </span> editor-event-loop screen, console, e +<span id="L1558" class="LineNr">1558 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1559" class="LineNr">1559 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1560" class="LineNr">1560 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1561" class="LineNr">1561 </span> ] @@ -1631,7 +1631,7 @@ if ('onhashchange' in window) { <span id="L1573" class="LineNr">1573 </span> s:text <span class="Special"><-</span> new <span class="Constant">[123</span> <span id="L1574" class="LineNr">1574 </span><span class="Constant">456]</span> <span id="L1575" class="LineNr">1575 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1576" class="LineNr">1576 </span> editor-render screen, e +<span id="L1576" class="LineNr">1576 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1577" class="LineNr">1577 </span> $clear-trace <span id="L1578" class="LineNr">1578 </span> <span class="Comment"># start on first line, press 'end'</span> <span id="L1579" class="LineNr">1579 </span> assume-console [ @@ -1639,7 +1639,7 @@ if ('onhashchange' in window) { <span id="L1581" class="LineNr">1581 </span> press end <span id="L1582" class="LineNr">1582 </span> ] <span id="L1583" class="LineNr">1583 </span> run [ -<span id="L1584" class="LineNr">1584 </span> editor-event-loop screen, console, e +<span id="L1584" class="LineNr">1584 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1585" class="LineNr">1585 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1586" class="LineNr">1586 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1587" class="LineNr">1587 </span> ] @@ -1657,7 +1657,7 @@ if ('onhashchange' in window) { <span id="L1599" class="LineNr">1599 </span> s:text <span class="Special"><-</span> new <span class="Constant">[123</span> <span id="L1600" class="LineNr">1600 </span><span class="Constant">456]</span> <span id="L1601" class="LineNr">1601 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1602" class="LineNr">1602 </span> editor-render screen, e +<span id="L1602" class="LineNr">1602 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1603" class="LineNr">1603 </span> $clear-trace <span id="L1604" class="LineNr">1604 </span> <span class="Comment"># start on second line (no newline after), press 'end'</span> <span id="L1605" class="LineNr">1605 </span> assume-console [ @@ -1665,7 +1665,7 @@ if ('onhashchange' in window) { <span id="L1607" class="LineNr">1607 </span> press end <span id="L1608" class="LineNr">1608 </span> ] <span id="L1609" class="LineNr">1609 </span> run [ -<span id="L1610" class="LineNr">1610 </span> editor-event-loop screen, console, e +<span id="L1610" class="LineNr">1610 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1611" class="LineNr">1611 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1612" class="LineNr">1612 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1613" class="LineNr">1613 </span> ] @@ -1691,7 +1691,7 @@ if ('onhashchange' in window) { <span id="L1633" class="LineNr">1633 </span> press ctrl-u <span id="L1634" class="LineNr">1634 </span> ] <span id="L1635" class="LineNr">1635 </span> run [ -<span id="L1636" class="LineNr">1636 </span> editor-event-loop screen, console, e +<span id="L1636" class="LineNr">1636 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1637" class="LineNr">1637 </span> ] <span id="L1638" class="LineNr">1638 </span> <span class="Comment"># cursor deletes to start of line</span> <span id="L1639" class="LineNr">1639 </span> screen-should-contain [ @@ -1721,20 +1721,20 @@ if ('onhashchange' in window) { <span id="L1663" class="LineNr">1663 </span> init:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">data:offset</span> <span id="L1664" class="LineNr">1664 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L1665" class="LineNr">1665 </span> start:&:duplex-list:char <span class="Special"><-</span> copy before-cursor -<span id="L1666" class="LineNr">1666 </span> end:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L1666" class="LineNr">1666 </span> end:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L1667" class="LineNr">1667 </span> <span class="Delimiter">{</span> <span id="L1668" class="LineNr">1668 </span> at-start-of-text?:bool <span class="Special"><-</span> equal start, init <span id="L1669" class="LineNr">1669 </span> <span class="muControl">break-if</span> at-start-of-text? <span id="L1670" class="LineNr">1670 </span> curr:char <span class="Special"><-</span> get *start, <span class="Constant">value:offset</span> <span id="L1671" class="LineNr">1671 </span> at-start-of-line?:bool <span class="Special"><-</span> equal curr, <span class="Constant">10/newline</span> <span id="L1672" class="LineNr">1672 </span> <span class="muControl">break-if</span> at-start-of-line? -<span id="L1673" class="LineNr">1673 </span> start <span class="Special"><-</span> prev start +<span id="L1673" class="LineNr">1673 </span> start <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> start <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> <span id="L1675" class="LineNr">1675 </span> <span class="muControl">loop</span> <span id="L1676" class="LineNr">1676 </span> <span class="Delimiter">}</span> <span id="L1677" class="LineNr">1677 </span> <span class="Comment"># snip it out</span> -<span id="L1678" class="LineNr">1678 </span> result:&:duplex-list:char <span class="Special"><-</span> next start -<span id="L1679" class="LineNr">1679 </span> remove-between start, end +<span id="L1678" class="LineNr">1678 </span> result:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> start +<span id="L1679" class="LineNr">1679 </span> <a href='065duplex_list.mu.html#L345'>remove-between</a> start, end <span id="L1680" class="LineNr">1680 </span> <span class="Comment"># adjust cursor</span> <span id="L1681" class="LineNr">1681 </span> before-cursor <span class="Special"><-</span> copy start <span id="L1682" class="LineNr">1682 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor @@ -1754,7 +1754,7 @@ if ('onhashchange' in window) { <span id="L1696" class="LineNr">1696 </span> press ctrl-u <span id="L1697" class="LineNr">1697 </span> ] <span id="L1698" class="LineNr">1698 </span> run [ -<span id="L1699" class="LineNr">1699 </span> editor-event-loop screen, console, e +<span id="L1699" class="LineNr">1699 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1700" class="LineNr">1700 </span> ] <span id="L1701" class="LineNr">1701 </span> <span class="Comment"># cursor deletes to start of line</span> <span id="L1702" class="LineNr">1702 </span> screen-should-contain [ @@ -1778,7 +1778,7 @@ if ('onhashchange' in window) { <span id="L1720" class="LineNr">1720 </span> press ctrl-u <span id="L1721" class="LineNr">1721 </span> ] <span id="L1722" class="LineNr">1722 </span> run [ -<span id="L1723" class="LineNr">1723 </span> editor-event-loop screen, console, e +<span id="L1723" class="LineNr">1723 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1724" class="LineNr">1724 </span> ] <span id="L1725" class="LineNr">1725 </span> <span class="Comment"># cursor deletes to start of line</span> <span id="L1726" class="LineNr">1726 </span> screen-should-contain [ @@ -1802,7 +1802,7 @@ if ('onhashchange' in window) { <span id="L1744" class="LineNr">1744 </span> press ctrl-u <span id="L1745" class="LineNr">1745 </span> ] <span id="L1746" class="LineNr">1746 </span> run [ -<span id="L1747" class="LineNr">1747 </span> editor-event-loop screen, console, e +<span id="L1747" class="LineNr">1747 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1748" class="LineNr">1748 </span> ] <span id="L1749" class="LineNr">1749 </span> <span class="Comment"># cursor deletes to start of line</span> <span id="L1750" class="LineNr">1750 </span> screen-should-contain [ @@ -1828,7 +1828,7 @@ if ('onhashchange' in window) { <span id="L1770" class="LineNr">1770 </span> press ctrl-k <span id="L1771" class="LineNr">1771 </span> ] <span id="L1772" class="LineNr">1772 </span> run [ -<span id="L1773" class="LineNr">1773 </span> editor-event-loop screen, console, e +<span id="L1773" class="LineNr">1773 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1774" class="LineNr">1774 </span> ] <span id="L1775" class="LineNr">1775 </span> <span class="Comment"># cursor deletes to end of line</span> <span id="L1776" class="LineNr">1776 </span> screen-should-contain [ @@ -1856,19 +1856,19 @@ if ('onhashchange' in window) { <span id="L1798" class="LineNr">1798 </span> <span class="Constant">load-ingredients</span> <span id="L1799" class="LineNr">1799 </span> <span class="Comment"># compute range to delete</span> <span id="L1800" class="LineNr">1800 </span> start:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> -<span id="L1801" class="LineNr">1801 </span> end:&:duplex-list:char <span class="Special"><-</span> next start +<span id="L1801" class="LineNr">1801 </span> end:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> start <span id="L1802" class="LineNr">1802 </span> <span class="Delimiter">{</span> <span id="L1803" class="LineNr">1803 </span> at-end-of-text?:bool <span class="Special"><-</span> equal end, <span class="Constant">0/null</span> <span id="L1804" class="LineNr">1804 </span> <span class="muControl">break-if</span> at-end-of-text? <span id="L1805" class="LineNr">1805 </span> curr:char <span class="Special"><-</span> get *end, <span class="Constant">value:offset</span> <span id="L1806" class="LineNr">1806 </span> at-end-of-line?:bool <span class="Special"><-</span> equal curr, <span class="Constant">10/newline</span> <span id="L1807" class="LineNr">1807 </span> <span class="muControl">break-if</span> at-end-of-line? -<span id="L1808" class="LineNr">1808 </span> end <span class="Special"><-</span> next end +<span id="L1808" class="LineNr">1808 </span> end <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> end <span id="L1809" class="LineNr">1809 </span> <span class="muControl">loop</span> <span id="L1810" class="LineNr">1810 </span> <span class="Delimiter">}</span> <span id="L1811" class="LineNr">1811 </span> <span class="Comment"># snip it out</span> -<span id="L1812" class="LineNr">1812 </span> result <span class="Special"><-</span> next start -<span id="L1813" class="LineNr">1813 </span> remove-between start, end +<span id="L1812" class="LineNr">1812 </span> result <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> start +<span id="L1813" class="LineNr">1813 </span> <a href='065duplex_list.mu.html#L345'>remove-between</a> start, end <span id="L1814" class="LineNr">1814 </span>] <span id="L1815" class="LineNr">1815 </span> <span id="L1816" class="LineNr">1816 </span><span class="muScenario">scenario</span> editor-deletes-to-end-of-line-with-ctrl-k-2 [ @@ -1883,7 +1883,7 @@ if ('onhashchange' in window) { <span id="L1825" class="LineNr">1825 </span> press ctrl-k <span id="L1826" class="LineNr">1826 </span> ] <span id="L1827" class="LineNr">1827 </span> run [ -<span id="L1828" class="LineNr">1828 </span> editor-event-loop screen, console, e +<span id="L1828" class="LineNr">1828 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1829" class="LineNr">1829 </span> ] <span id="L1830" class="LineNr">1830 </span> <span class="Comment"># cursor deletes to end of line</span> <span id="L1831" class="LineNr">1831 </span> screen-should-contain [ @@ -1907,7 +1907,7 @@ if ('onhashchange' in window) { <span id="L1849" class="LineNr">1849 </span> press ctrl-k <span id="L1850" class="LineNr">1850 </span> ] <span id="L1851" class="LineNr">1851 </span> run [ -<span id="L1852" class="LineNr">1852 </span> editor-event-loop screen, console, e +<span id="L1852" class="LineNr">1852 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1853" class="LineNr">1853 </span> ] <span id="L1854" class="LineNr">1854 </span> <span class="Comment"># cursor deletes just last character</span> <span id="L1855" class="LineNr">1855 </span> screen-should-contain [ @@ -1931,7 +1931,7 @@ if ('onhashchange' in window) { <span id="L1873" class="LineNr">1873 </span> press ctrl-k <span id="L1874" class="LineNr">1874 </span> ] <span id="L1875" class="LineNr">1875 </span> run [ -<span id="L1876" class="LineNr">1876 </span> editor-event-loop screen, console, e +<span id="L1876" class="LineNr">1876 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1877" class="LineNr">1877 </span> ] <span id="L1878" class="LineNr">1878 </span> <span class="Comment"># cursor deletes nothing</span> <span id="L1879" class="LineNr">1879 </span> screen-should-contain [ @@ -1955,7 +1955,7 @@ if ('onhashchange' in window) { <span id="L1897" class="LineNr">1897 </span> press ctrl-k <span id="L1898" class="LineNr">1898 </span> ] <span id="L1899" class="LineNr">1899 </span> run [ -<span id="L1900" class="LineNr">1900 </span> editor-event-loop screen, console, e +<span id="L1900" class="LineNr">1900 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1901" class="LineNr">1901 </span> ] <span id="L1902" class="LineNr">1902 </span> <span class="Comment"># cursor deletes just the final character</span> <span id="L1903" class="LineNr">1903 </span> screen-should-contain [ @@ -1979,7 +1979,7 @@ if ('onhashchange' in window) { <span id="L1921" class="LineNr">1921 </span> press ctrl-k <span id="L1922" class="LineNr">1922 </span> ] <span id="L1923" class="LineNr">1923 </span> run [ -<span id="L1924" class="LineNr">1924 </span> editor-event-loop screen, console, e +<span id="L1924" class="LineNr">1924 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1925" class="LineNr">1925 </span> ] <span id="L1926" class="LineNr">1926 </span> <span class="Comment"># cursor deletes nothing</span> <span id="L1927" class="LineNr">1927 </span> screen-should-contain [ @@ -2003,7 +2003,7 @@ if ('onhashchange' in window) { <span id="L1945" class="LineNr">1945 </span><span class="Constant">c</span> <span id="L1946" class="LineNr">1946 </span><span class="Constant">d]</span> <span id="L1947" class="LineNr">1947 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1948" class="LineNr">1948 </span> editor-render screen, e +<span id="L1948" class="LineNr">1948 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1949" class="LineNr">1949 </span> screen-should-contain [ <span id="L1950" class="LineNr">1950 </span> <span class="Constant"> . .</span> <span id="L1951" class="LineNr">1951 </span> <span class="Constant"> .a .</span> @@ -2016,7 +2016,7 @@ if ('onhashchange' in window) { <span id="L1958" class="LineNr">1958 </span> press down-arrow <span id="L1959" class="LineNr">1959 </span> ] <span id="L1960" class="LineNr">1960 </span> run [ -<span id="L1961" class="LineNr">1961 </span> editor-event-loop screen, console, e +<span id="L1961" class="LineNr">1961 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1962" class="LineNr">1962 </span> ] <span id="L1963" class="LineNr">1963 </span> <span class="Comment"># screen slides by one line</span> <span id="L1964" class="LineNr">1964 </span> screen-should-contain [ @@ -2053,7 +2053,7 @@ if ('onhashchange' in window) { <span id="L1995" class="LineNr">1995 </span> c:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L1996" class="LineNr">1996 </span> at-newline?:bool <span class="Special"><-</span> equal c, <span class="Constant">10/newline</span> <span id="L1997" class="LineNr">1997 </span> <span class="muControl">break-unless</span> at-newline? -<span id="L1998" class="LineNr">1998 </span> curr <span class="Special"><-</span> next curr +<span id="L1998" class="LineNr">1998 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L1999" class="LineNr">1999 </span> count <span class="Special"><-</span> add count,<span class="Constant"> 1</span> <span id="L2000" class="LineNr">2000 </span> <span class="Delimiter">}</span> <span id="L2001" class="LineNr">2001 </span> <span class="Delimiter">{</span> @@ -2063,7 +2063,7 @@ if ('onhashchange' in window) { <span id="L2005" class="LineNr">2005 </span> c:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L2006" class="LineNr">2006 </span> at-newline?:bool <span class="Special"><-</span> equal c, <span class="Constant">10/newline</span> <span id="L2007" class="LineNr">2007 </span> <span class="muControl">break-if</span> at-newline? -<span id="L2008" class="LineNr">2008 </span> curr <span class="Special"><-</span> next curr +<span id="L2008" class="LineNr">2008 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L2009" class="LineNr">2009 </span> count <span class="Special"><-</span> add count,<span class="Constant"> 1</span> <span id="L2010" class="LineNr">2010 </span> <span class="muControl">loop</span> <span id="L2011" class="LineNr">2011 </span> <span class="Delimiter">}</span> @@ -2082,7 +2082,7 @@ if ('onhashchange' in window) { <span id="L2024" class="LineNr">2024 </span><span class="Constant">h</span> <span id="L2025" class="LineNr">2025 </span><span class="Constant">i]</span> <span id="L2026" class="LineNr">2026 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L2027" class="LineNr">2027 </span> editor-render screen, e +<span id="L2027" class="LineNr">2027 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2028" class="LineNr">2028 </span> screen-should-contain [ <span id="L2029" class="LineNr">2029 </span> <span class="Constant"> . .</span> <span id="L2030" class="LineNr">2030 </span> <span class="Constant"> .abcd↩ .</span> @@ -2095,7 +2095,7 @@ if ('onhashchange' in window) { <span id="L2037" class="LineNr">2037 </span> press down-arrow <span id="L2038" class="LineNr">2038 </span> ] <span id="L2039" class="LineNr">2039 </span> run [ -<span id="L2040" class="LineNr">2040 </span> editor-event-loop screen, console, e +<span id="L2040" class="LineNr">2040 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2041" class="LineNr">2041 </span> ] <span id="L2042" class="LineNr">2042 </span> <span class="Comment"># screen shows partial wrapped line</span> <span id="L2043" class="LineNr">2043 </span> screen-should-contain [ @@ -2122,7 +2122,7 @@ if ('onhashchange' in window) { <span id="L2064" class="LineNr">2064 </span> press down-arrow <span id="L2065" class="LineNr">2065 </span> ] <span id="L2066" class="LineNr">2066 </span> run [ -<span id="L2067" class="LineNr">2067 </span> editor-event-loop screen, console, e +<span id="L2067" class="LineNr">2067 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2068" class="LineNr">2068 </span> ] <span id="L2069" class="LineNr">2069 </span> <span class="Comment"># screen shows partial wrapped line containing a wrap icon</span> <span id="L2070" class="LineNr">2070 </span> screen-should-contain [ @@ -2136,7 +2136,7 @@ if ('onhashchange' in window) { <span id="L2078" class="LineNr">2078 </span> press down-arrow <span id="L2079" class="LineNr">2079 </span> ] <span id="L2080" class="LineNr">2080 </span> run [ -<span id="L2081" class="LineNr">2081 </span> editor-event-loop screen, console, e +<span id="L2081" class="LineNr">2081 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2082" class="LineNr">2082 </span> ] <span id="L2083" class="LineNr">2083 </span> <span class="Comment"># screen shows partial wrapped line</span> <span id="L2084" class="LineNr">2084 </span> screen-should-contain [ @@ -2162,7 +2162,7 @@ if ('onhashchange' in window) { <span id="L2104" class="LineNr">2104 </span> type <span class="Constant">[g]</span> <span id="L2105" class="LineNr">2105 </span> ] <span id="L2106" class="LineNr">2106 </span> run [ -<span id="L2107" class="LineNr">2107 </span> editor-event-loop screen, console, e +<span id="L2107" class="LineNr">2107 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2108" class="LineNr">2108 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L2109" class="LineNr">2109 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L2110" class="LineNr">2110 </span> ] @@ -2193,7 +2193,7 @@ if ('onhashchange' in window) { <span id="L2135" class="LineNr">2135 </span>] <span id="L2136" class="LineNr">2136 </span> ] <span id="L2137" class="LineNr">2137 </span> run [ -<span id="L2138" class="LineNr">2138 </span> editor-event-loop screen, console, e +<span id="L2138" class="LineNr">2138 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2139" class="LineNr">2139 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L2140" class="LineNr">2140 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L2141" class="LineNr">2141 </span> ] @@ -2225,7 +2225,7 @@ if ('onhashchange' in window) { <span id="L2167" class="LineNr">2167 </span> press right-arrow <span id="L2168" class="LineNr">2168 </span> ] <span id="L2169" class="LineNr">2169 </span> run [ -<span id="L2170" class="LineNr">2170 </span> editor-event-loop screen, console, e +<span id="L2170" class="LineNr">2170 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2171" class="LineNr">2171 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L2172" class="LineNr">2172 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L2173" class="LineNr">2173 </span> ] @@ -2258,7 +2258,7 @@ if ('onhashchange' in window) { <span id="L2200" class="LineNr">2200 </span> press right-arrow <span id="L2201" class="LineNr">2201 </span> ] <span id="L2202" class="LineNr">2202 </span> run [ -<span id="L2203" class="LineNr">2203 </span> editor-event-loop screen, console, e +<span id="L2203" class="LineNr">2203 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2204" class="LineNr">2204 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L2205" class="LineNr">2205 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L2206" class="LineNr">2206 </span> ] @@ -2281,7 +2281,7 @@ if ('onhashchange' in window) { <span id="L2223" class="LineNr">2223 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L2224" class="LineNr">2224 </span><span class="Constant">de]</span> <span id="L2225" class="LineNr">2225 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L2226" class="LineNr">2226 </span> editor-render screen, e +<span id="L2226" class="LineNr">2226 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2227" class="LineNr">2227 </span> $clear-trace <span id="L2228" class="LineNr">2228 </span> <span class="Comment"># try to move down past end of text</span> <span id="L2229" class="LineNr">2229 </span> assume-console [ @@ -2289,7 +2289,7 @@ if ('onhashchange' in window) { <span id="L2231" class="LineNr">2231 </span> press down-arrow <span id="L2232" class="LineNr">2232 </span> ] <span id="L2233" class="LineNr">2233 </span> run [ -<span id="L2234" class="LineNr">2234 </span> editor-event-loop screen, console, e +<span id="L2234" class="LineNr">2234 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2235" class="LineNr">2235 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L2236" class="LineNr">2236 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L2237" class="LineNr">2237 </span> ] @@ -2302,7 +2302,7 @@ if ('onhashchange' in window) { <span id="L2244" class="LineNr">2244 </span> type <span class="Constant">[0]</span> <span id="L2245" class="LineNr">2245 </span> ] <span id="L2246" class="LineNr">2246 </span> run [ -<span id="L2247" class="LineNr">2247 </span> editor-event-loop screen, console, e +<span id="L2247" class="LineNr">2247 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2248" class="LineNr">2248 </span> ] <span id="L2249" class="LineNr">2249 </span> screen-should-contain [ <span id="L2250" class="LineNr">2250 </span> <span class="Constant"> . .</span> @@ -2317,7 +2317,7 @@ if ('onhashchange' in window) { <span id="L2259" class="LineNr">2259 </span> press down-arrow <span id="L2260" class="LineNr">2260 </span> ] <span id="L2261" class="LineNr">2261 </span> run [ -<span id="L2262" class="LineNr">2262 </span> editor-event-loop screen, console, e +<span id="L2262" class="LineNr">2262 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2263" class="LineNr">2263 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L2264" class="LineNr">2264 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L2265" class="LineNr">2265 </span> ] @@ -2331,7 +2331,7 @@ if ('onhashchange' in window) { <span id="L2273" class="LineNr">2273 </span> type <span class="Constant">[1]</span> <span id="L2274" class="LineNr">2274 </span> ] <span id="L2275" class="LineNr">2275 </span> run [ -<span id="L2276" class="LineNr">2276 </span> editor-event-loop screen, console, e +<span id="L2276" class="LineNr">2276 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2277" class="LineNr">2277 </span> ] <span id="L2278" class="LineNr">2278 </span> screen-should-contain [ <span id="L2279" class="LineNr">2279 </span> <span class="Constant"> . .</span> @@ -2354,7 +2354,7 @@ if ('onhashchange' in window) { <span id="L2296" class="LineNr">2296 </span><span class="Constant">f</span> <span id="L2297" class="LineNr">2297 </span><span class="Constant">g]</span> <span id="L2298" class="LineNr">2298 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L2299" class="LineNr">2299 </span> editor-render screen, e +<span id="L2299" class="LineNr">2299 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2300" class="LineNr">2300 </span> <span class="Comment"># scroll down one page and one line</span> <span id="L2301" class="LineNr">2301 </span> assume-console [ <span id="L2302" class="LineNr">2302 </span> press page-down @@ -2362,7 +2362,7 @@ if ('onhashchange' in window) { <span id="L2304" class="LineNr">2304 </span> press down-arrow <span id="L2305" class="LineNr">2305 </span> ] <span id="L2306" class="LineNr">2306 </span> run [ -<span id="L2307" class="LineNr">2307 </span> editor-event-loop screen, console, e +<span id="L2307" class="LineNr">2307 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2308" class="LineNr">2308 </span> ] <span id="L2309" class="LineNr">2309 </span> <span class="Comment"># screen scrolls down 3 lines</span> <span id="L2310" class="LineNr">2310 </span> screen-should-contain [ @@ -2385,7 +2385,7 @@ if ('onhashchange' in window) { <span id="L2327" class="LineNr">2327 </span><span class="Constant">c</span> <span id="L2328" class="LineNr">2328 </span><span class="Constant">d]</span> <span id="L2329" class="LineNr">2329 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L2330" class="LineNr">2330 </span> editor-render screen, e +<span id="L2330" class="LineNr">2330 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2331" class="LineNr">2331 </span> screen-should-contain [ <span id="L2332" class="LineNr">2332 </span> <span class="Constant"> . .</span> <span id="L2333" class="LineNr">2333 </span> <span class="Constant"> .a .</span> @@ -2398,7 +2398,7 @@ if ('onhashchange' in window) { <span id="L2340" class="LineNr">2340 </span> press up-arrow <span id="L2341" class="LineNr">2341 </span> ] <span id="L2342" class="LineNr">2342 </span> run [ -<span id="L2343" class="LineNr">2343 </span> editor-event-loop screen, console, e +<span id="L2343" class="LineNr">2343 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2344" class="LineNr">2344 </span> ] <span id="L2345" class="LineNr">2345 </span> <span class="Comment"># screen slides by one line</span> <span id="L2346" class="LineNr">2346 </span> screen-should-contain [ @@ -2438,9 +2438,9 @@ if ('onhashchange' in window) { <span id="L2380" class="LineNr">2380 </span> <span class="Delimiter">{</span> <span id="L2381" class="LineNr">2381 </span> <span class="muControl">break-if</span> len <span id="L2382" class="LineNr">2382 </span> <span class="Comment"># empty line; just skip this newline</span> -<span id="L2383" class="LineNr">2383 </span> prev:&:duplex-list:char <span class="Special"><-</span> prev curr -<span id="L2384" class="LineNr">2384 </span> <span class="muControl">return-unless</span> prev, curr -<span id="L2385" class="LineNr">2385 </span> <span class="muControl">return</span> prev +<span id="L2383" class="LineNr">2383 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> curr +<span id="L2384" class="LineNr">2384 </span> <span class="muControl">return-unless</span> <a href='065duplex_list.mu.html#L36'>prev</a>, curr +<span id="L2385" class="LineNr">2385 </span> <span class="muControl">return</span> <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L2386" class="LineNr">2386 </span> <span class="Delimiter">}</span> <span id="L2387" class="LineNr">2387 </span> _, max:num <span class="Special"><-</span> divide-with-remainder len, max-line-length <span id="L2388" class="LineNr">2388 </span> <span class="Comment"># remainder 0 => scan one width-worth</span> @@ -2454,9 +2454,9 @@ if ('onhashchange' in window) { <span id="L2396" class="LineNr">2396 </span> <span class="Delimiter">{</span> <span id="L2397" class="LineNr">2397 </span> done?:bool <span class="Special"><-</span> greater-or-equal count, max <span id="L2398" class="LineNr">2398 </span> <span class="muControl">break-if</span> done? -<span id="L2399" class="LineNr">2399 </span> prev:&:duplex-list:char <span class="Special"><-</span> prev curr -<span id="L2400" class="LineNr">2400 </span> <span class="muControl">break-unless</span> prev -<span id="L2401" class="LineNr">2401 </span> curr <span class="Special"><-</span> copy prev +<span id="L2399" class="LineNr">2399 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> curr +<span id="L2400" class="LineNr">2400 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L36'>prev</a> +<span id="L2401" class="LineNr">2401 </span> curr <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L2402" class="LineNr">2402 </span> count <span class="Special"><-</span> add count,<span class="Constant"> 1</span> <span id="L2403" class="LineNr">2403 </span> <span class="muControl">loop</span> <span id="L2404" class="LineNr">2404 </span> <span class="Delimiter">}</span> @@ -2474,7 +2474,7 @@ if ('onhashchange' in window) { <span id="L2416" class="LineNr">2416 </span><span class="Constant">h</span> <span id="L2417" class="LineNr">2417 </span><span class="Constant">i]</span> <span id="L2418" class="LineNr">2418 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L2419" class="LineNr">2419 </span> editor-render screen, e +<span id="L2419" class="LineNr">2419 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2420" class="LineNr">2420 </span> screen-should-contain [ <span id="L2421" class="LineNr">2421 </span> <span class="Constant"> . .</span> <span id="L2422" class="LineNr">2422 </span> <span class="Constant"> .abcd↩ .</span> @@ -2486,7 +2486,7 @@ if ('onhashchange' in window) { <span id="L2428" class="LineNr">2428 </span> press page-down <span id="L2429" class="LineNr">2429 </span> ] <span id="L2430" class="LineNr">2430 </span> run [ -<span id="L2431" class="LineNr">2431 </span> editor-event-loop screen, console, e +<span id="L2431" class="LineNr">2431 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2432" class="LineNr">2432 </span> ] <span id="L2433" class="LineNr">2433 </span> screen-should-contain [ <span id="L2434" class="LineNr">2434 </span> <span class="Constant"> . .</span> @@ -2499,7 +2499,7 @@ if ('onhashchange' in window) { <span id="L2441" class="LineNr">2441 </span> press up-arrow <span id="L2442" class="LineNr">2442 </span> ] <span id="L2443" class="LineNr">2443 </span> run [ -<span id="L2444" class="LineNr">2444 </span> editor-event-loop screen, console, e +<span id="L2444" class="LineNr">2444 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2445" class="LineNr">2445 </span> ] <span id="L2446" class="LineNr">2446 </span> <span class="Comment"># screen shows partial wrapped line</span> <span id="L2447" class="LineNr">2447 </span> screen-should-contain [ @@ -2520,13 +2520,13 @@ if ('onhashchange' in window) { <span id="L2462" class="LineNr">2462 </span><span class="Constant">l</span> <span id="L2463" class="LineNr">2463 </span><span class="Constant">m]</span> <span id="L2464" class="LineNr">2464 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L2465" class="LineNr">2465 </span> editor-render screen, e +<span id="L2465" class="LineNr">2465 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2466" class="LineNr">2466 </span> <span class="Comment"># position cursor at top of second page</span> <span id="L2467" class="LineNr">2467 </span> assume-console [ <span id="L2468" class="LineNr">2468 </span> press page-down <span id="L2469" class="LineNr">2469 </span> ] <span id="L2470" class="LineNr">2470 </span> run [ -<span id="L2471" class="LineNr">2471 </span> editor-event-loop screen, console, e +<span id="L2471" class="LineNr">2471 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2472" class="LineNr">2472 </span> ] <span id="L2473" class="LineNr">2473 </span> screen-should-contain [ <span id="L2474" class="LineNr">2474 </span> <span class="Constant"> . .</span> @@ -2540,7 +2540,7 @@ if ('onhashchange' in window) { <span id="L2482" class="LineNr">2482 </span> press up-arrow <span id="L2483" class="LineNr">2483 </span> ] <span id="L2484" class="LineNr">2484 </span> run [ -<span id="L2485" class="LineNr">2485 </span> editor-event-loop screen, console, e +<span id="L2485" class="LineNr">2485 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2486" class="LineNr">2486 </span> ] <span id="L2487" class="LineNr">2487 </span> <span class="Comment"># screen shows partial wrapped line</span> <span id="L2488" class="LineNr">2488 </span> screen-should-contain [ @@ -2555,7 +2555,7 @@ if ('onhashchange' in window) { <span id="L2497" class="LineNr">2497 </span> press up-arrow <span id="L2498" class="LineNr">2498 </span> ] <span id="L2499" class="LineNr">2499 </span> run [ -<span id="L2500" class="LineNr">2500 </span> editor-event-loop screen, console, e +<span id="L2500" class="LineNr">2500 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2501" class="LineNr">2501 </span> ] <span id="L2502" class="LineNr">2502 </span> <span class="Comment"># screen shows partial wrapped line</span> <span id="L2503" class="LineNr">2503 </span> screen-should-contain [ @@ -2570,7 +2570,7 @@ if ('onhashchange' in window) { <span id="L2512" class="LineNr">2512 </span> press up-arrow <span id="L2513" class="LineNr">2513 </span> ] <span id="L2514" class="LineNr">2514 </span> run [ -<span id="L2515" class="LineNr">2515 </span> editor-event-loop screen, console, e +<span id="L2515" class="LineNr">2515 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2516" class="LineNr">2516 </span> ] <span id="L2517" class="LineNr">2517 </span> <span class="Comment"># screen shows partial wrapped line</span> <span id="L2518" class="LineNr">2518 </span> screen-should-contain [ @@ -2595,7 +2595,7 @@ if ('onhashchange' in window) { <span id="L2537" class="LineNr">2537 </span><span class="Constant">h</span> <span id="L2538" class="LineNr">2538 </span><span class="Constant">i]</span> <span id="L2539" class="LineNr">2539 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span> -<span id="L2540" class="LineNr">2540 </span> editor-render screen, e +<span id="L2540" class="LineNr">2540 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2541" class="LineNr">2541 </span> screen-should-contain [ <span id="L2542" class="LineNr">2542 </span> <span class="Constant"> . .</span> <span id="L2543" class="LineNr">2543 </span> <span class="Constant"> .abcde↩ .</span> @@ -2607,7 +2607,7 @@ if ('onhashchange' in window) { <span id="L2549" class="LineNr">2549 </span> press page-down <span id="L2550" class="LineNr">2550 </span> ] <span id="L2551" class="LineNr">2551 </span> run [ -<span id="L2552" class="LineNr">2552 </span> editor-event-loop screen, console, e +<span id="L2552" class="LineNr">2552 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2553" class="LineNr">2553 </span> ] <span id="L2554" class="LineNr">2554 </span> screen-should-contain [ <span id="L2555" class="LineNr">2555 </span> <span class="Constant"> . .</span> @@ -2620,7 +2620,7 @@ if ('onhashchange' in window) { <span id="L2562" class="LineNr">2562 </span> press up-arrow <span id="L2563" class="LineNr">2563 </span> ] <span id="L2564" class="LineNr">2564 </span> run [ -<span id="L2565" class="LineNr">2565 </span> editor-event-loop screen, console, e +<span id="L2565" class="LineNr">2565 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2566" class="LineNr">2566 </span> ] <span id="L2567" class="LineNr">2567 </span> <span class="Comment"># screen shows partial wrapped line</span> <span id="L2568" class="LineNr">2568 </span> screen-should-contain [ @@ -2643,12 +2643,12 @@ if ('onhashchange' in window) { <span id="L2585" class="LineNr">2585 </span>d <span id="L2586" class="LineNr">2586 </span>e] <span id="L2587" class="LineNr">2587 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">6/right</span> -<span id="L2588" class="LineNr">2588 </span> editor-render screen, e +<span id="L2588" class="LineNr">2588 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2589" class="LineNr">2589 </span> assume-console [ <span id="L2590" class="LineNr">2590 </span> press page-down <span id="L2591" class="LineNr">2591 </span> ] <span id="L2592" class="LineNr">2592 </span> run [ -<span id="L2593" class="LineNr">2593 </span> editor-event-loop screen, console, e +<span id="L2593" class="LineNr">2593 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2594" class="LineNr">2594 </span> ] <span id="L2595" class="LineNr">2595 </span> screen-should-contain [ <span id="L2596" class="LineNr">2596 </span> <span class="Constant"> . .</span> @@ -2660,7 +2660,7 @@ if ('onhashchange' in window) { <span id="L2602" class="LineNr">2602 </span> press page-down <span id="L2603" class="LineNr">2603 </span> ] <span id="L2604" class="LineNr">2604 </span> run [ -<span id="L2605" class="LineNr">2605 </span> editor-event-loop screen, console, e +<span id="L2605" class="LineNr">2605 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2606" class="LineNr">2606 </span> ] <span id="L2607" class="LineNr">2607 </span> screen-should-contain [ <span id="L2608" class="LineNr">2608 </span> <span class="Constant"> . .</span> @@ -2672,7 +2672,7 @@ if ('onhashchange' in window) { <span id="L2614" class="LineNr">2614 </span> press page-up <span id="L2615" class="LineNr">2615 </span> ] <span id="L2616" class="LineNr">2616 </span> run [ -<span id="L2617" class="LineNr">2617 </span> editor-event-loop screen, console, e +<span id="L2617" class="LineNr">2617 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2618" class="LineNr">2618 </span> ] <span id="L2619" class="LineNr">2619 </span> screen-should-contain [ <span id="L2620" class="LineNr">2620 </span> <span class="Constant"> . .</span> @@ -2693,13 +2693,13 @@ if ('onhashchange' in window) { <span id="L2635" class="LineNr">2635 </span><span class="Constant">d</span> <span id="L2636" class="LineNr">2636 </span><span class="Constant">e]</span> <span id="L2637" class="LineNr">2637 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">5/right</span> -<span id="L2638" class="LineNr">2638 </span> editor-render screen, e +<span id="L2638" class="LineNr">2638 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2639" class="LineNr">2639 </span> <span class="Comment"># position cursor at top of second page</span> <span id="L2640" class="LineNr">2640 </span> assume-console [ <span id="L2641" class="LineNr">2641 </span> press page-down <span id="L2642" class="LineNr">2642 </span> ] <span id="L2643" class="LineNr">2643 </span> run [ -<span id="L2644" class="LineNr">2644 </span> editor-event-loop screen, console, e +<span id="L2644" class="LineNr">2644 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2645" class="LineNr">2645 </span> ] <span id="L2646" class="LineNr">2646 </span> screen-should-contain [ <span id="L2647" class="LineNr">2647 </span> <span class="Constant"> . .</span> @@ -2712,7 +2712,7 @@ if ('onhashchange' in window) { <span id="L2654" class="LineNr">2654 </span> press left-arrow <span id="L2655" class="LineNr">2655 </span> ] <span id="L2656" class="LineNr">2656 </span> run [ -<span id="L2657" class="LineNr">2657 </span> editor-event-loop screen, console, e +<span id="L2657" class="LineNr">2657 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2658" class="LineNr">2658 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L2659" class="LineNr">2659 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L2660" class="LineNr">2660 </span> ] @@ -2739,7 +2739,7 @@ if ('onhashchange' in window) { <span id="L2681" class="LineNr">2681 </span><span class="Constant">c</span> <span id="L2682" class="LineNr">2682 </span><span class="Constant">d]</span> <span id="L2683" class="LineNr">2683 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L2684" class="LineNr">2684 </span> editor-render screen, e +<span id="L2684" class="LineNr">2684 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2685" class="LineNr">2685 </span> screen-should-contain [ <span id="L2686" class="LineNr">2686 </span> <span class="Constant"> . .</span> <span id="L2687" class="LineNr">2687 </span> <span class="Constant"> .a .</span> @@ -2754,7 +2754,7 @@ if ('onhashchange' in window) { <span id="L2696" class="LineNr">2696 </span> press up-arrow <span id="L2697" class="LineNr">2697 </span> ] <span id="L2698" class="LineNr">2698 </span> run [ -<span id="L2699" class="LineNr">2699 </span> editor-event-loop screen, console, e +<span id="L2699" class="LineNr">2699 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2700" class="LineNr">2700 </span> ] <span id="L2701" class="LineNr">2701 </span> <span class="Comment"># screen slides by one line</span> <span id="L2702" class="LineNr">2702 </span> screen-should-contain [ @@ -2768,7 +2768,7 @@ if ('onhashchange' in window) { <span id="L2710" class="LineNr">2710 </span> press up-arrow <span id="L2711" class="LineNr">2711 </span> ] <span id="L2712" class="LineNr">2712 </span> run [ -<span id="L2713" class="LineNr">2713 </span> editor-event-loop screen, console, e +<span id="L2713" class="LineNr">2713 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2714" class="LineNr">2714 </span> ] <span id="L2715" class="LineNr">2715 </span> <span class="Comment"># screen remains unchanged</span> <span id="L2716" class="LineNr">2716 </span> screen-should-contain [ @@ -2789,7 +2789,7 @@ if ('onhashchange' in window) { <span id="L2731" class="LineNr">2731 </span><span class="Constant">c</span> <span id="L2732" class="LineNr">2732 </span><span class="Constant">d]</span> <span id="L2733" class="LineNr">2733 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L2734" class="LineNr">2734 </span> editor-render screen, e +<span id="L2734" class="LineNr">2734 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2735" class="LineNr">2735 </span> screen-should-contain [ <span id="L2736" class="LineNr">2736 </span> <span class="Constant"> . .</span> <span id="L2737" class="LineNr">2737 </span> <span class="Constant"> .a .</span> @@ -2801,7 +2801,7 @@ if ('onhashchange' in window) { <span id="L2743" class="LineNr">2743 </span> press page-down <span id="L2744" class="LineNr">2744 </span> ] <span id="L2745" class="LineNr">2745 </span> run [ -<span id="L2746" class="LineNr">2746 </span> editor-event-loop screen, console, e +<span id="L2746" class="LineNr">2746 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2747" class="LineNr">2747 </span> ] <span id="L2748" class="LineNr">2748 </span> <span class="Comment"># screen shows next page</span> <span id="L2749" class="LineNr">2749 </span> screen-should-contain [ @@ -2852,14 +2852,14 @@ if ('onhashchange' in window) { <span id="L2794" class="LineNr">2794 </span> <span class="muControl">return-unless</span> bottom-of-screen <span id="L2795" class="LineNr">2795 </span> <span class="Comment"># if not, position cursor at final character</span> <span id="L2796" class="LineNr">2796 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> -<span id="L2797" class="LineNr">2797 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> prev bottom-of-screen +<span id="L2797" class="LineNr">2797 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> bottom-of-screen <span id="L2798" class="LineNr">2798 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L2799" class="LineNr">2799 </span> <span class="Comment"># keep one line in common with previous page</span> <span id="L2800" class="LineNr">2800 </span> <span class="Delimiter">{</span> -<span id="L2801" class="LineNr">2801 </span> last:char <span class="Special"><-</span> get *before-cursor, <span class="Constant">value:offset</span> -<span id="L2802" class="LineNr">2802 </span> newline?:bool <span class="Special"><-</span> equal last, <span class="Constant">10/newline</span> +<span id="L2801" class="LineNr">2801 </span> <a href='065duplex_list.mu.html#L516'>last</a>:char <span class="Special"><-</span> get *before-cursor, <span class="Constant">value:offset</span> +<span id="L2802" class="LineNr">2802 </span> newline?:bool <span class="Special"><-</span> equal <a href='065duplex_list.mu.html#L516'>last</a>, <span class="Constant">10/newline</span> <span id="L2803" class="LineNr">2803 </span> <span class="muControl">break-unless</span> newline?:bool -<span id="L2804" class="LineNr">2804 </span> before-cursor <span class="Special"><-</span> prev before-cursor +<span id="L2804" class="LineNr">2804 </span> before-cursor <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> before-cursor <span id="L2805" class="LineNr">2805 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor <span id="L2806" class="LineNr">2806 </span> <span class="Delimiter">}</span> <span id="L2807" class="LineNr">2807 </span> <span class="Comment"># move cursor and top-of-screen to start of that line</span> @@ -2874,7 +2874,7 @@ if ('onhashchange' in window) { <span id="L2816" class="LineNr">2816 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a</span> <span id="L2817" class="LineNr">2817 </span><span class="Constant">b]</span> <span id="L2818" class="LineNr">2818 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L2819" class="LineNr">2819 </span> editor-render screen, e +<span id="L2819" class="LineNr">2819 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2820" class="LineNr">2820 </span> screen-should-contain [ <span id="L2821" class="LineNr">2821 </span> <span class="Constant"> . .</span> <span id="L2822" class="LineNr">2822 </span> <span class="Constant"> .a .</span> @@ -2886,7 +2886,7 @@ if ('onhashchange' in window) { <span id="L2828" class="LineNr">2828 </span> press page-down <span id="L2829" class="LineNr">2829 </span> ] <span id="L2830" class="LineNr">2830 </span> run [ -<span id="L2831" class="LineNr">2831 </span> editor-event-loop screen, console, e +<span id="L2831" class="LineNr">2831 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2832" class="LineNr">2832 </span> ] <span id="L2833" class="LineNr">2833 </span> <span class="Comment"># screen remains unmodified</span> <span id="L2834" class="LineNr">2834 </span> screen-should-contain [ @@ -2907,7 +2907,7 @@ if ('onhashchange' in window) { <span id="L2849" class="LineNr">2849 </span><span class="Constant">cdefgh]</span> <span id="L2850" class="LineNr">2850 </span> <span class="Comment"># editor screen triggers wrap of last line</span> <span id="L2851" class="LineNr">2851 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span> -<span id="L2852" class="LineNr">2852 </span> editor-render screen, e +<span id="L2852" class="LineNr">2852 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2853" class="LineNr">2853 </span> <span class="Comment"># some part of last line is not displayed</span> <span id="L2854" class="LineNr">2854 </span> screen-should-contain [ <span id="L2855" class="LineNr">2855 </span> <span class="Constant"> . .</span> @@ -2920,7 +2920,7 @@ if ('onhashchange' in window) { <span id="L2862" class="LineNr">2862 </span> press page-down <span id="L2863" class="LineNr">2863 </span> ] <span id="L2864" class="LineNr">2864 </span> run [ -<span id="L2865" class="LineNr">2865 </span> editor-event-loop screen, console, e +<span id="L2865" class="LineNr">2865 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2866" class="LineNr">2866 </span> ] <span id="L2867" class="LineNr">2867 </span> <span class="Comment"># screen shows entire wrapped line</span> <span id="L2868" class="LineNr">2868 </span> screen-should-contain [ @@ -2940,7 +2940,7 @@ if ('onhashchange' in window) { <span id="L2882" class="LineNr">2882 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a</span> <span id="L2883" class="LineNr">2883 </span><span class="Constant">bcdefgh]</span> <span id="L2884" class="LineNr">2884 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span> -<span id="L2885" class="LineNr">2885 </span> editor-render screen, e +<span id="L2885" class="LineNr">2885 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2886" class="LineNr">2886 </span> <span class="Comment"># some part of last line is not displayed</span> <span id="L2887" class="LineNr">2887 </span> screen-should-contain [ <span id="L2888" class="LineNr">2888 </span> <span class="Constant"> . .</span> @@ -2953,7 +2953,7 @@ if ('onhashchange' in window) { <span id="L2895" class="LineNr">2895 </span> press page-down <span id="L2896" class="LineNr">2896 </span> ] <span id="L2897" class="LineNr">2897 </span> run [ -<span id="L2898" class="LineNr">2898 </span> editor-event-loop screen, console, e +<span id="L2898" class="LineNr">2898 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2899" class="LineNr">2899 </span> ] <span id="L2900" class="LineNr">2900 </span> <span class="Comment"># screen shows entire wrapped line</span> <span id="L2901" class="LineNr">2901 </span> screen-should-contain [ @@ -2974,7 +2974,7 @@ if ('onhashchange' in window) { <span id="L2916" class="LineNr">2916 </span><span class="Constant">c</span> <span id="L2917" class="LineNr">2917 </span><span class="Constant">d]</span> <span id="L2918" class="LineNr">2918 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L2919" class="LineNr">2919 </span> editor-render screen, e +<span id="L2919" class="LineNr">2919 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2920" class="LineNr">2920 </span> screen-should-contain [ <span id="L2921" class="LineNr">2921 </span> <span class="Constant"> . .</span> <span id="L2922" class="LineNr">2922 </span> <span class="Constant"> .a .</span> @@ -2986,7 +2986,7 @@ if ('onhashchange' in window) { <span id="L2928" class="LineNr">2928 </span> press page-down <span id="L2929" class="LineNr">2929 </span> ] <span id="L2930" class="LineNr">2930 </span> run [ -<span id="L2931" class="LineNr">2931 </span> editor-event-loop screen, console, e +<span id="L2931" class="LineNr">2931 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2932" class="LineNr">2932 </span> ] <span id="L2933" class="LineNr">2933 </span> <span class="Comment"># screen shows next page</span> <span id="L2934" class="LineNr">2934 </span> screen-should-contain [ @@ -3000,7 +3000,7 @@ if ('onhashchange' in window) { <span id="L2942" class="LineNr">2942 </span> press page-up <span id="L2943" class="LineNr">2943 </span> ] <span id="L2944" class="LineNr">2944 </span> run [ -<span id="L2945" class="LineNr">2945 </span> editor-event-loop screen, console, e +<span id="L2945" class="LineNr">2945 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2946" class="LineNr">2946 </span> ] <span id="L2947" class="LineNr">2947 </span> <span class="Comment"># screen shows original page again</span> <span id="L2948" class="LineNr">2948 </span> screen-should-contain [ @@ -3017,7 +3017,7 @@ if ('onhashchange' in window) { <span id="L2959" class="LineNr">2959 </span> <span class="muControl">break-unless</span> page-up? <span id="L2960" class="LineNr">2960 </span> old-top:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> <span id="L2961" class="LineNr">2961 </span><span class="Constant"> <move-cursor-begin></span> -<span id="L2962" class="LineNr">2962 </span> editor <span class="Special"><-</span> page-up editor, screen-height +<span id="L2962" class="LineNr">2962 </span> editor <span class="Special"><-</span> page-up editor, <a href='081print.mu.html#L594'>screen-height</a> <span id="L2963" class="LineNr">2963 </span> undo-coalesce-tag:num <span class="Special"><-</span> copy <span class="Constant">0/never</span> <span id="L2964" class="LineNr">2964 </span><span class="Constant"> <move-cursor-end></span> <span id="L2965" class="LineNr">2965 </span> top-of-screen:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> @@ -3032,7 +3032,7 @@ if ('onhashchange' in window) { <span id="L2974" class="LineNr">2974 </span> <span class="muControl">break-unless</span> page-up? <span id="L2975" class="LineNr">2975 </span> old-top:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> <span id="L2976" class="LineNr">2976 </span><span class="Constant"> <move-cursor-begin></span> -<span id="L2977" class="LineNr">2977 </span> editor <span class="Special"><-</span> page-up editor, screen-height +<span id="L2977" class="LineNr">2977 </span> editor <span class="Special"><-</span> page-up editor, <a href='081print.mu.html#L594'>screen-height</a> <span id="L2978" class="LineNr">2978 </span> undo-coalesce-tag:num <span class="Special"><-</span> copy <span class="Constant">0/never</span> <span id="L2979" class="LineNr">2979 </span><span class="Constant"> <move-cursor-end></span> <span id="L2980" class="LineNr">2980 </span> top-of-screen:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> @@ -3042,18 +3042,18 @@ if ('onhashchange' in window) { <span id="L2984" class="LineNr">2984 </span> <span class="Delimiter">}</span> <span id="L2985" class="LineNr">2985 </span>] <span id="L2986" class="LineNr">2986 </span> -<span id="L2987" class="LineNr">2987 </span><span class="muRecipe">def</span> page-up editor:&:editor, screen-height:num<span class="muRecipe"> -> </span>editor:&:editor [ +<span id="L2987" class="LineNr">2987 </span><span class="muRecipe">def</span> page-up editor:&:editor, <a href='081print.mu.html#L594'>screen-height</a>:num<span class="muRecipe"> -> </span>editor:&:editor [ <span id="L2988" class="LineNr">2988 </span> <span class="Constant">local-scope</span> <span id="L2989" class="LineNr">2989 </span> <span class="Constant">load-ingredients</span> -<span id="L2990" class="LineNr">2990 </span> max:num <span class="Special"><-</span> subtract screen-height, <span class="Constant">1/menu-bar</span>, <span class="Constant">1/overlapping-line</span> +<span id="L2990" class="LineNr">2990 </span> max:num <span class="Special"><-</span> subtract <a href='081print.mu.html#L594'>screen-height</a>, <span class="Constant">1/menu-bar</span>, <span class="Constant">1/overlapping-line</span> <span id="L2991" class="LineNr">2991 </span> count:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L2992" class="LineNr">2992 </span> top-of-screen:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> <span id="L2993" class="LineNr">2993 </span> <span class="Delimiter">{</span> <span id="L2994" class="LineNr">2994 </span> done?:bool <span class="Special"><-</span> greater-or-equal count, max <span id="L2995" class="LineNr">2995 </span> <span class="muControl">break-if</span> done? -<span id="L2996" class="LineNr">2996 </span> prev:&:duplex-list:char <span class="Special"><-</span> before-previous-line top-of-screen, editor -<span id="L2997" class="LineNr">2997 </span> <span class="muControl">break-unless</span> prev -<span id="L2998" class="LineNr">2998 </span> top-of-screen <span class="Special"><-</span> copy prev +<span id="L2996" class="LineNr">2996 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> before-previous-line top-of-screen, editor +<span id="L2997" class="LineNr">2997 </span> <span class="muControl">break-unless</span> <a href='065duplex_list.mu.html#L36'>prev</a> +<span id="L2998" class="LineNr">2998 </span> top-of-screen <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L2999" class="LineNr">2999 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">top-of-screen:offset</span>, top-of-screen <span id="L3000" class="LineNr">3000 </span> count <span class="Special"><-</span> add count,<span class="Constant"> 1</span> <span id="L3001" class="LineNr">3001 </span> <span class="muControl">loop</span> @@ -3074,7 +3074,7 @@ if ('onhashchange' in window) { <span id="L3016" class="LineNr">3016 </span><span class="Constant">g</span> <span id="L3017" class="LineNr">3017 </span><span class="Constant">h]</span> <span id="L3018" class="LineNr">3018 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L3019" class="LineNr">3019 </span> editor-render screen, e +<span id="L3019" class="LineNr">3019 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L3020" class="LineNr">3020 </span> screen-should-contain [ <span id="L3021" class="LineNr">3021 </span> <span class="Constant"> . .</span> <span id="L3022" class="LineNr">3022 </span> <span class="Constant"> .a .</span> @@ -3087,7 +3087,7 @@ if ('onhashchange' in window) { <span id="L3029" class="LineNr">3029 </span> press page-down <span id="L3030" class="LineNr">3030 </span> ] <span id="L3031" class="LineNr">3031 </span> run [ -<span id="L3032" class="LineNr">3032 </span> editor-event-loop screen, console, e +<span id="L3032" class="LineNr">3032 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3033" class="LineNr">3033 </span> ] <span id="L3034" class="LineNr">3034 </span> <span class="Comment"># screen shows third page</span> <span id="L3035" class="LineNr">3035 </span> screen-should-contain [ @@ -3101,7 +3101,7 @@ if ('onhashchange' in window) { <span id="L3043" class="LineNr">3043 </span> press page-up <span id="L3044" class="LineNr">3044 </span> ] <span id="L3045" class="LineNr">3045 </span> run [ -<span id="L3046" class="LineNr">3046 </span> editor-event-loop screen, console, e +<span id="L3046" class="LineNr">3046 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3047" class="LineNr">3047 </span> ] <span id="L3048" class="LineNr">3048 </span> <span class="Comment"># screen shows second page</span> <span id="L3049" class="LineNr">3049 </span> screen-should-contain [ @@ -3115,7 +3115,7 @@ if ('onhashchange' in window) { <span id="L3057" class="LineNr">3057 </span> press page-up <span id="L3058" class="LineNr">3058 </span> ] <span id="L3059" class="LineNr">3059 </span> run [ -<span id="L3060" class="LineNr">3060 </span> editor-event-loop screen, console, e +<span id="L3060" class="LineNr">3060 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3061" class="LineNr">3061 </span> ] <span id="L3062" class="LineNr">3062 </span> <span class="Comment"># screen shows original page again</span> <span id="L3063" class="LineNr">3063 </span> screen-should-contain [ @@ -3143,7 +3143,7 @@ if ('onhashchange' in window) { <span id="L3085" class="LineNr">3085 </span><span class="Constant">o]</span> <span id="L3086" class="LineNr">3086 </span> <span class="Comment"># editor screen triggers wrap of last line</span> <span id="L3087" class="LineNr">3087 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span> -<span id="L3088" class="LineNr">3088 </span> editor-render screen, e +<span id="L3088" class="LineNr">3088 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L3089" class="LineNr">3089 </span> <span class="Comment"># some part of last line is not displayed</span> <span id="L3090" class="LineNr">3090 </span> screen-should-contain [ <span id="L3091" class="LineNr">3091 </span> <span class="Constant"> . .</span> @@ -3160,7 +3160,7 @@ if ('onhashchange' in window) { <span id="L3102" class="LineNr">3102 </span> press down-arrow <span id="L3103" class="LineNr">3103 </span> ] <span id="L3104" class="LineNr">3104 </span> run [ -<span id="L3105" class="LineNr">3105 </span> editor-event-loop screen, console, e +<span id="L3105" class="LineNr">3105 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3106" class="LineNr">3106 </span> ] <span id="L3107" class="LineNr">3107 </span> <span class="Comment"># screen shows entire wrapped line</span> <span id="L3108" class="LineNr">3108 </span> screen-should-contain [ @@ -3176,7 +3176,7 @@ if ('onhashchange' in window) { <span id="L3118" class="LineNr">3118 </span> press page-up <span id="L3119" class="LineNr">3119 </span> ] <span id="L3120" class="LineNr">3120 </span> run [ -<span id="L3121" class="LineNr">3121 </span> editor-event-loop screen, console, e +<span id="L3121" class="LineNr">3121 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3122" class="LineNr">3122 </span> ] <span id="L3123" class="LineNr">3123 </span> <span class="Comment"># screen resets</span> <span id="L3124" class="LineNr">3124 </span> screen-should-contain [ @@ -3198,7 +3198,7 @@ if ('onhashchange' in window) { <span id="L3140" class="LineNr">3140 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a</span> <span id="L3141" class="LineNr">3141 </span><span class="Constant">bcdefgh]</span> <span id="L3142" class="LineNr">3142 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span> -<span id="L3143" class="LineNr">3143 </span> editor-render screen, e +<span id="L3143" class="LineNr">3143 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L3144" class="LineNr">3144 </span> <span class="Comment"># some part of last line is not displayed</span> <span id="L3145" class="LineNr">3145 </span> screen-should-contain [ <span id="L3146" class="LineNr">3146 </span> <span class="Constant"> . .</span> @@ -3211,7 +3211,7 @@ if ('onhashchange' in window) { <span id="L3153" class="LineNr">3153 </span> press page-down <span id="L3154" class="LineNr">3154 </span> ] <span id="L3155" class="LineNr">3155 </span> run [ -<span id="L3156" class="LineNr">3156 </span> editor-event-loop screen, console, e +<span id="L3156" class="LineNr">3156 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3157" class="LineNr">3157 </span> ] <span id="L3158" class="LineNr">3158 </span> <span class="Comment"># screen shows entire wrapped line</span> <span id="L3159" class="LineNr">3159 </span> screen-should-contain [ @@ -3225,7 +3225,7 @@ if ('onhashchange' in window) { <span id="L3167" class="LineNr">3167 </span> press page-up <span id="L3168" class="LineNr">3168 </span> ] <span id="L3169" class="LineNr">3169 </span> run [ -<span id="L3170" class="LineNr">3170 </span> editor-event-loop screen, console, e +<span id="L3170" class="LineNr">3170 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3171" class="LineNr">3171 </span> ] <span id="L3172" class="LineNr">3172 </span> <span class="Comment"># screen resets</span> <span id="L3173" class="LineNr">3173 </span> screen-should-contain [ @@ -3250,7 +3250,7 @@ if ('onhashchange' in window) { <span id="L3192" class="LineNr">3192 </span><span class="Constant">hxx</span> <span id="L3193" class="LineNr">3193 </span><span class="Constant">]</span> <span id="L3194" class="LineNr">3194 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span> -<span id="L3195" class="LineNr">3195 </span> editor-render screen, e +<span id="L3195" class="LineNr">3195 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L3196" class="LineNr">3196 </span> screen-should-contain [ <span id="L3197" class="LineNr">3197 </span> <span class="Constant"> . .</span> <span id="L3198" class="LineNr">3198 </span> <span class="Constant"> .axx .</span> @@ -3261,7 +3261,7 @@ if ('onhashchange' in window) { <span id="L3203" class="LineNr">3203 </span> press page-down <span id="L3204" class="LineNr">3204 </span> ] <span id="L3205" class="LineNr">3205 </span> run [ -<span id="L3206" class="LineNr">3206 </span> editor-event-loop screen, console, e +<span id="L3206" class="LineNr">3206 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3207" class="LineNr">3207 </span> ] <span id="L3208" class="LineNr">3208 </span> screen-should-contain [ <span id="L3209" class="LineNr">3209 </span> <span class="Constant"> . .</span> @@ -3273,7 +3273,7 @@ if ('onhashchange' in window) { <span id="L3215" class="LineNr">3215 </span> press page-down <span id="L3216" class="LineNr">3216 </span> ] <span id="L3217" class="LineNr">3217 </span> run [ -<span id="L3218" class="LineNr">3218 </span> editor-event-loop screen, console, e +<span id="L3218" class="LineNr">3218 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3219" class="LineNr">3219 </span> ] <span id="L3220" class="LineNr">3220 </span> screen-should-contain [ <span id="L3221" class="LineNr">3221 </span> <span class="Constant"> . .</span> @@ -3286,7 +3286,7 @@ if ('onhashchange' in window) { <span id="L3228" class="LineNr">3228 </span> press page-up <span id="L3229" class="LineNr">3229 </span> ] <span id="L3230" class="LineNr">3230 </span> run [ -<span id="L3231" class="LineNr">3231 </span> editor-event-loop screen, console, e +<span id="L3231" class="LineNr">3231 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3232" class="LineNr">3232 </span> ] <span id="L3233" class="LineNr">3233 </span> screen-should-contain [ <span id="L3234" class="LineNr">3234 </span> <span class="Constant"> . .</span> @@ -3310,7 +3310,7 @@ if ('onhashchange' in window) { <span id="L3252" class="LineNr">3252 </span>gxy <span id="L3253" class="LineNr">3253 </span>] <span id="L3254" class="LineNr">3254 </span> e:&:editor <span class="Special"><-</span> new-editor s, <span class="Constant">0/left</span>, <span class="Constant">4/right</span> -<span id="L3255" class="LineNr">3255 </span> editor-render screen, e +<span id="L3255" class="LineNr">3255 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L3256" class="LineNr">3256 </span> screen-should-contain [ <span id="L3257" class="LineNr">3257 </span> <span class="Constant"> . .</span> <span id="L3258" class="LineNr">3258 </span> <span class="Constant"> .axy .</span> @@ -3321,7 +3321,7 @@ if ('onhashchange' in window) { <span id="L3263" class="LineNr">3263 </span> press page-down <span id="L3264" class="LineNr">3264 </span> ] <span id="L3265" class="LineNr">3265 </span> run [ -<span id="L3266" class="LineNr">3266 </span> editor-event-loop screen, console, e +<span id="L3266" class="LineNr">3266 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3267" class="LineNr">3267 </span> ] <span id="L3268" class="LineNr">3268 </span> screen-should-contain [ <span id="L3269" class="LineNr">3269 </span> <span class="Constant"> . .</span> @@ -3333,7 +3333,7 @@ if ('onhashchange' in window) { <span id="L3275" class="LineNr">3275 </span> press page-down <span id="L3276" class="LineNr">3276 </span> ] <span id="L3277" class="LineNr">3277 </span> run [ -<span id="L3278" class="LineNr">3278 </span> editor-event-loop screen, console, e +<span id="L3278" class="LineNr">3278 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3279" class="LineNr">3279 </span> ] <span id="L3280" class="LineNr">3280 </span> screen-should-contain [ <span id="L3281" class="LineNr">3281 </span> <span class="Constant"> . .</span> @@ -3346,7 +3346,7 @@ if ('onhashchange' in window) { <span id="L3288" class="LineNr">3288 </span> press page-up <span id="L3289" class="LineNr">3289 </span> ] <span id="L3290" class="LineNr">3290 </span> run [ -<span id="L3291" class="LineNr">3291 </span> editor-event-loop screen, console, e +<span id="L3291" class="LineNr">3291 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L3292" class="LineNr">3292 </span> ] <span id="L3293" class="LineNr">3293 </span> screen-should-contain [ <span id="L3294" class="LineNr">3294 </span> <span class="Constant"> . .</span> diff --git a/html/edit/004-programming-environment.mu.html b/html/edit/004-programming-environment.mu.html index 951dffa3..9b8841fe 100644 --- a/html/edit/004-programming-environment.mu.html +++ b/html/edit/004-programming-environment.mu.html @@ -77,13 +77,13 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr"> 18 </span> sandbox-in-focus?:bool <span class="Comment"># false => cursor in recipes; true => cursor in current-sandbox</span> <span id="L19" class="LineNr"> 19 </span>] <span id="L20" class="LineNr"> 20 </span> -<span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> new-programming-environment resources:&:resources, screen:&:screen, test-sandbox-editor-contents:text<span class="muRecipe"> -> </span>result:&:environment [ +<span id="L21" class="LineNr"> 21 </span><span class="muRecipe">def</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, test-sandbox-editor-contents:text<span class="muRecipe"> -> </span>result:&:environment [ <span id="L22" class="LineNr"> 22 </span> <span class="Constant">local-scope</span> <span id="L23" class="LineNr"> 23 </span> <span class="Constant">load-ingredients</span> -<span id="L24" class="LineNr"> 24 </span> width:num <span class="Special"><-</span> screen-width screen +<span id="L24" class="LineNr"> 24 </span> width:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a> <span id="L25" class="LineNr"> 25 </span> result <span class="Special"><-</span> new <span class="Constant">environment:type</span> <span id="L26" class="LineNr"> 26 </span> <span class="Comment"># recipe editor on the left</span> -<span id="L27" class="LineNr"> 27 </span> initial-recipe-contents:text <span class="Special"><-</span> slurp resources, <span class="Constant">[lesson/recipes.mu]</span> <span class="Comment"># ignore errors</span> +<span id="L27" class="LineNr"> 27 </span> initial-recipe-contents:text <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[lesson/recipes.mu]</span> <span class="Comment"># ignore errors</span> <span id="L28" class="LineNr"> 28 </span> divider:num, _ <span class="Special"><-</span> divide-with-remainder width,<span class="Constant"> 2</span> <span id="L29" class="LineNr"> 29 </span> recipes:&:editor <span class="Special"><-</span> new-editor initial-recipe-contents, <span class="Constant">0/left</span>, divider/right <span id="L30" class="LineNr"> 30 </span> <span class="Comment"># sandbox editor on the right</span> @@ -95,7 +95,7 @@ if ('onhashchange' in window) { <span id="L36" class="LineNr"> 36 </span><span class="Constant"> <programming-environment-initialization></span> <span id="L37" class="LineNr"> 37 </span>] <span id="L38" class="LineNr"> 38 </span> -<span id="L39" class="LineNr"> 39 </span><span class="muRecipe">def</span> event-loop screen:&:screen, console:&:console, env:&:environment, resources:&:resources<span class="muRecipe"> -> </span>screen:&:screen, console:&:console, env:&:environment, resources:&:resources [ +<span id="L39" class="LineNr"> 39 </span><span class="muRecipe">def</span> event-loop <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a>, env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a>, env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a> [ <span id="L40" class="LineNr"> 40 </span> <span class="Constant">local-scope</span> <span id="L41" class="LineNr"> 41 </span> <span class="Constant">load-ingredients</span> <span id="L42" class="LineNr"> 42 </span> recipes:&:editor <span class="Special"><-</span> get *env, <span class="Constant">recipes:offset</span> @@ -108,25 +108,25 @@ if ('onhashchange' in window) { <span id="L49" class="LineNr"> 49 </span> <span class="Delimiter">{</span> <span id="L50" class="LineNr"> 50 </span> <span class="Comment"># looping over each (keyboard or touch) event as it occurs</span> <span id="L51" class="LineNr"> 51 </span><span class="Constant"> +next-event</span> -<span id="L52" class="LineNr"> 52 </span> e:event, found?:bool, quit?:bool, console <span class="Special"><-</span> read-event console +<span id="L52" class="LineNr"> 52 </span> e:<a href='084console.mu.html#L4'>event</a>, found?:bool, quit?:bool, <a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> <a href='084console.mu.html#L35'>read-event</a> <a href='084console.mu.html#L23'>console</a> <span id="L53" class="LineNr"> 53 </span> <span class="muControl">loop-unless</span> found? <span id="L54" class="LineNr"> 54 </span> <span class="muControl">break-if</span> quit? <span class="Comment"># only in tests</span> <span id="L55" class="LineNr"> 55 </span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[next-event]</span> <span id="L56" class="LineNr"> 56 </span><span class="Constant"> <handle-event></span> <span id="L57" class="LineNr"> 57 </span> <span class="Comment"># check for global events that will trigger regardless of which editor has focus</span> <span id="L58" class="LineNr"> 58 </span> <span class="Delimiter">{</span> -<span id="L59" class="LineNr"> 59 </span> k:num, is-keycode?:bool <span class="Special"><-</span> maybe-convert e:event, <span class="Constant">keycode:variant</span> +<span id="L59" class="LineNr"> 59 </span> k:num, is-keycode?:bool <span class="Special"><-</span> maybe-convert e:<a href='084console.mu.html#L4'>event</a>, <span class="Constant">keycode:variant</span> <span id="L60" class="LineNr"> 60 </span> <span class="muControl">break-unless</span> is-keycode? <span id="L61" class="LineNr"> 61 </span><span class="Constant"> <global-keypress></span> <span id="L62" class="LineNr"> 62 </span> <span class="Delimiter">}</span> <span id="L63" class="LineNr"> 63 </span> <span class="Delimiter">{</span> -<span id="L64" class="LineNr"> 64 </span> c:char, is-unicode?:bool <span class="Special"><-</span> maybe-convert e:event, <span class="Constant">text:variant</span> +<span id="L64" class="LineNr"> 64 </span> c:char, is-unicode?:bool <span class="Special"><-</span> maybe-convert e:<a href='084console.mu.html#L4'>event</a>, <span class="Constant">text:variant</span> <span id="L65" class="LineNr"> 65 </span> <span class="muControl">break-unless</span> is-unicode? <span id="L66" class="LineNr"> 66 </span><span class="Constant"> <global-type></span> <span id="L67" class="LineNr"> 67 </span> <span class="Delimiter">}</span> <span id="L68" class="LineNr"> 68 </span> <span class="Comment"># 'touch' event - send to both sides, see what picks it up</span> <span id="L69" class="LineNr"> 69 </span> <span class="Delimiter">{</span> -<span id="L70" class="LineNr"> 70 </span> t:touch-event, is-touch?:bool <span class="Special"><-</span> maybe-convert e:event, <span class="Constant">touch:variant</span> +<span id="L70" class="LineNr"> 70 </span> t:<a href='084console.mu.html#L12'>touch-event</a>, is-touch?:bool <span class="Special"><-</span> maybe-convert e:<a href='084console.mu.html#L4'>event</a>, <span class="Constant">touch:variant</span> <span id="L71" class="LineNr"> 71 </span> <span class="muControl">break-unless</span> is-touch? <span id="L72" class="LineNr"> 72 </span> <span class="Comment"># ignore all but 'left-click' events for now</span> <span id="L73" class="LineNr"> 73 </span> <span class="Comment"># todo: test this</span> @@ -138,41 +138,41 @@ if ('onhashchange' in window) { <span id="L79" class="LineNr"> 79 </span> <span class="Comment"># later exceptions for non-editor touches will go here</span> <span id="L80" class="LineNr"> 80 </span><span class="Constant"> <global-touch></span> <span id="L81" class="LineNr"> 81 </span> <span class="Comment"># send to both editors</span> -<span id="L82" class="LineNr"> 82 </span> _ <span class="Special"><-</span> move-cursor-in-editor screen, recipes, t -<span id="L83" class="LineNr"> 83 </span> sandbox-in-focus?:bool <span class="Special"><-</span> move-cursor-in-editor screen, current-sandbox, t +<span id="L82" class="LineNr"> 82 </span> _ <span class="Special"><-</span> move-cursor-in-editor <a href='081print.mu.html#L4'>screen</a>, recipes, t +<span id="L83" class="LineNr"> 83 </span> sandbox-in-focus?:bool <span class="Special"><-</span> move-cursor-in-editor <a href='081print.mu.html#L4'>screen</a>, current-sandbox, t <span id="L84" class="LineNr"> 84 </span> *env <span class="Special"><-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, sandbox-in-focus? -<span id="L85" class="LineNr"> 85 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L85" class="LineNr"> 85 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env <span id="L86" class="LineNr"> 86 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L87" class="LineNr"> 87 </span> <span class="Delimiter">}</span> <span id="L88" class="LineNr"> 88 </span> <span class="Comment"># 'resize' event - redraw editor</span> <span id="L89" class="LineNr"> 89 </span> <span class="Comment"># todo: test this after supporting resize in assume-console</span> <span id="L90" class="LineNr"> 90 </span> <span class="Delimiter">{</span> -<span id="L91" class="LineNr"> 91 </span> r:resize-event, is-resize?:bool <span class="Special"><-</span> maybe-convert e:event, <span class="Constant">resize:variant</span> +<span id="L91" class="LineNr"> 91 </span> r:<a href='084console.mu.html#L18'>resize-event</a>, is-resize?:bool <span class="Special"><-</span> maybe-convert e:<a href='084console.mu.html#L4'>event</a>, <span class="Constant">resize:variant</span> <span id="L92" class="LineNr"> 92 </span> <span class="muControl">break-unless</span> is-resize? <span id="L93" class="LineNr"> 93 </span> <span class="Comment"># if more events, we're still resizing; wait until we stop</span> -<span id="L94" class="LineNr"> 94 </span> more-events?:bool <span class="Special"><-</span> has-more-events? console +<span id="L94" class="LineNr"> 94 </span> more-events?:bool <span class="Special"><-</span> <a href='084console.mu.html#L100'>has-more-events?</a> <a href='084console.mu.html#L23'>console</a> <span id="L95" class="LineNr"> 95 </span> <span class="Delimiter">{</span> <span id="L96" class="LineNr"> 96 </span> <span class="muControl">break-unless</span> more-events? <span id="L97" class="LineNr"> 97 </span> render-all-on-no-more-events? <span class="Special"><-</span> copy <span class="Constant">1/true</span> <span class="Comment"># no rendering now, full rendering on some future event</span> <span id="L98" class="LineNr"> 98 </span> <span class="Delimiter">}</span> <span id="L99" class="LineNr"> 99 </span> <span class="Delimiter">{</span> <span id="L100" class="LineNr">100 </span> <span class="muControl">break-if</span> more-events? -<span id="L101" class="LineNr">101 </span> env, screen <span class="Special"><-</span> resize screen, env -<span id="L102" class="LineNr">102 </span> screen <span class="Special"><-</span> render-all screen, env, render-without-moving-cursor +<span id="L101" class="LineNr">101 </span> env, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> resize <a href='081print.mu.html#L4'>screen</a>, env +<span id="L102" class="LineNr">102 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render-without-moving-cursor <span id="L103" class="LineNr">103 </span> render-all-on-no-more-events? <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span class="Comment"># full render done</span> <span id="L104" class="LineNr">104 </span> <span class="Delimiter">}</span> <span id="L105" class="LineNr">105 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L106" class="LineNr">106 </span> <span class="Delimiter">}</span> <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> <span id="L108" class="LineNr">108 </span> <span class="Delimiter">{</span> -<span id="L109" class="LineNr">109 </span> hide-screen screen +<span id="L109" class="LineNr">109 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L110" class="LineNr">110 </span> sandbox-in-focus?:bool <span class="Special"><-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span> <span id="L111" class="LineNr">111 </span> <span class="Delimiter">{</span> <span id="L112" class="LineNr">112 </span> <span class="muControl">break-if</span> sandbox-in-focus? -<span id="L113" class="LineNr">113 </span> render?:bool <span class="Special"><-</span> handle-keyboard-event screen, recipes, e:event +<span id="L113" class="LineNr">113 </span> render?:bool <span class="Special"><-</span> handle-keyboard-event <a href='081print.mu.html#L4'>screen</a>, recipes, e:<a href='084console.mu.html#L4'>event</a> <span id="L114" class="LineNr">114 </span> <span class="Comment"># refresh screen only if no more events</span> <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> -<span id="L116" class="LineNr">116 </span> more-events?:bool <span class="Special"><-</span> has-more-events? console +<span id="L116" class="LineNr">116 </span> more-events?:bool <span class="Special"><-</span> <a href='084console.mu.html#L100'>has-more-events?</a> <a href='084console.mu.html#L23'>console</a> <span id="L117" class="LineNr">117 </span> <span class="Delimiter">{</span> <span id="L118" class="LineNr">118 </span> <span class="muControl">break-unless</span> more-events? <span id="L119" class="LineNr">119 </span> render-all-on-no-more-events? <span class="Special"><-</span> copy <span class="Constant">1/true</span> <span class="Comment"># no rendering now, full rendering on some future event</span> @@ -183,24 +183,24 @@ if ('onhashchange' in window) { <span id="L124" class="LineNr">124 </span> <span class="Delimiter">{</span> <span id="L125" class="LineNr">125 </span> <span class="muControl">break-unless</span> render-all-on-no-more-events? <span id="L126" class="LineNr">126 </span> <span class="Comment"># no more events, and we have to force render</span> -<span id="L127" class="LineNr">127 </span> screen <span class="Special"><-</span> render-all screen, env, render +<span id="L127" class="LineNr">127 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L128" class="LineNr">128 </span> render-all-on-no-more-events? <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span id="L129" class="LineNr">129 </span> <span class="muControl">jump</span> <span class="Constant">+finish-event</span> <span id="L130" class="LineNr">130 </span> <span class="Delimiter">}</span> <span id="L131" class="LineNr">131 </span> <span class="Comment"># no more events, no force render</span> <span id="L132" class="LineNr">132 </span> <span class="Delimiter">{</span> <span id="L133" class="LineNr">133 </span> <span class="muControl">break-unless</span> render? -<span id="L134" class="LineNr">134 </span> screen <span class="Special"><-</span> render-recipes screen, env, render +<span id="L134" class="LineNr">134 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-recipes <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L135" class="LineNr">135 </span> <span class="muControl">jump</span> <span class="Constant">+finish-event</span> <span id="L136" class="LineNr">136 </span> <span class="Delimiter">}</span> <span id="L137" class="LineNr">137 </span> <span class="Delimiter">}</span> <span id="L138" class="LineNr">138 </span> <span class="Delimiter">}</span> <span id="L139" class="LineNr">139 </span> <span class="Delimiter">{</span> <span id="L140" class="LineNr">140 </span> <span class="muControl">break-unless</span> sandbox-in-focus? -<span id="L141" class="LineNr">141 </span> render?:bool <span class="Special"><-</span> handle-keyboard-event screen, current-sandbox, e:event +<span id="L141" class="LineNr">141 </span> render?:bool <span class="Special"><-</span> handle-keyboard-event <a href='081print.mu.html#L4'>screen</a>, current-sandbox, e:<a href='084console.mu.html#L4'>event</a> <span id="L142" class="LineNr">142 </span> <span class="Comment"># refresh screen only if no more events</span> <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> -<span id="L144" class="LineNr">144 </span> more-events?:bool <span class="Special"><-</span> has-more-events? console +<span id="L144" class="LineNr">144 </span> more-events?:bool <span class="Special"><-</span> <a href='084console.mu.html#L100'>has-more-events?</a> <a href='084console.mu.html#L23'>console</a> <span id="L145" class="LineNr">145 </span> <span class="Delimiter">{</span> <span id="L146" class="LineNr">146 </span> <span class="muControl">break-unless</span> more-events? <span id="L147" class="LineNr">147 </span> render-all-on-no-more-events? <span class="Special"><-</span> copy <span class="Constant">1/true</span> <span class="Comment"># no rendering now, full rendering on some future event</span> @@ -211,31 +211,31 @@ if ('onhashchange' in window) { <span id="L152" class="LineNr">152 </span> <span class="Delimiter">{</span> <span id="L153" class="LineNr">153 </span> <span class="muControl">break-unless</span> render-all-on-no-more-events? <span id="L154" class="LineNr">154 </span> <span class="Comment"># no more events, and we have to force render</span> -<span id="L155" class="LineNr">155 </span> screen <span class="Special"><-</span> render-all screen, env, render +<span id="L155" class="LineNr">155 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L156" class="LineNr">156 </span> render-all-on-no-more-events? <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span id="L157" class="LineNr">157 </span> <span class="muControl">jump</span> <span class="Constant">+finish-event</span> <span id="L158" class="LineNr">158 </span> <span class="Delimiter">}</span> <span id="L159" class="LineNr">159 </span> <span class="Comment"># no more events, no force render</span> <span id="L160" class="LineNr">160 </span> <span class="Delimiter">{</span> <span id="L161" class="LineNr">161 </span> <span class="muControl">break-unless</span> render? -<span id="L162" class="LineNr">162 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render +<span id="L162" class="LineNr">162 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L163" class="LineNr">163 </span> <span class="muControl">jump</span> <span class="Constant">+finish-event</span> <span id="L164" class="LineNr">164 </span> <span class="Delimiter">}</span> <span id="L165" class="LineNr">165 </span> <span class="Delimiter">}</span> <span id="L166" class="LineNr">166 </span> <span class="Delimiter">}</span> <span id="L167" class="LineNr">167 </span><span class="Constant"> +finish-event</span> -<span id="L168" class="LineNr">168 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env -<span id="L169" class="LineNr">169 </span> show-screen screen +<span id="L168" class="LineNr">168 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L169" class="LineNr">169 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L170" class="LineNr">170 </span> <span class="Delimiter">}</span> <span id="L171" class="LineNr">171 </span> <span class="muControl">loop</span> <span id="L172" class="LineNr">172 </span> <span class="Delimiter">}</span> <span id="L173" class="LineNr">173 </span>] <span id="L174" class="LineNr">174 </span> -<span id="L175" class="LineNr">175 </span><span class="muRecipe">def</span> resize screen:&:screen, env:&:environment<span class="muRecipe"> -> </span>env:&:environment, screen:&:screen [ +<span id="L175" class="LineNr">175 </span><span class="muRecipe">def</span> resize <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment<span class="muRecipe"> -> </span>env:&:environment, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L176" class="LineNr">176 </span> <span class="Constant">local-scope</span> <span id="L177" class="LineNr">177 </span> <span class="Constant">load-ingredients</span> -<span id="L178" class="LineNr">178 </span> clear-screen screen <span class="Comment"># update screen dimensions</span> -<span id="L179" class="LineNr">179 </span> width:num <span class="Special"><-</span> screen-width screen +<span id="L178" class="LineNr">178 </span> <a href='081print.mu.html#L27'>clear-screen</a> <a href='081print.mu.html#L4'>screen</a> <span class="Comment"># update screen dimensions</span> +<span id="L179" class="LineNr">179 </span> width:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a> <span id="L180" class="LineNr">180 </span> divider:num, _ <span class="Special"><-</span> divide-with-remainder width,<span class="Constant"> 2</span> <span id="L181" class="LineNr">181 </span> <span class="Comment"># update recipe editor</span> <span id="L182" class="LineNr">182 </span> recipes:&:editor <span class="Special"><-</span> get *env, <span class="Constant">recipes:offset</span> @@ -258,16 +258,16 @@ if ('onhashchange' in window) { <span id="L199" class="LineNr">199 </span><span class="Comment"># Variant of 'render' that updates cursor-row and cursor-column based on</span> <span id="L200" class="LineNr">200 </span><span class="Comment"># before-cursor (rather than the other way around). If before-cursor moves</span> <span id="L201" class="LineNr">201 </span><span class="Comment"># off-screen, it resets cursor-row and cursor-column.</span> -<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> render-without-moving-cursor screen:&:screen, editor:&:editor<span class="muRecipe"> -> </span>last-row:num, last-column:num, screen:&:screen, editor:&:editor [ +<span id="L202" class="LineNr">202 </span><span class="muRecipe">def</span> render-without-moving-cursor <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor<span class="muRecipe"> -> </span>last-row:num, last-column:num, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, editor:&:editor [ <span id="L203" class="LineNr">203 </span> <span class="Constant">local-scope</span> <span id="L204" class="LineNr">204 </span> <span class="Constant">load-ingredients</span> <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> <span id="L206" class="LineNr">206 </span> left:num <span class="Special"><-</span> get *editor, <span class="Constant">left:offset</span> -<span id="L207" class="LineNr">207 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L207" class="LineNr">207 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L208" class="LineNr">208 </span> right:num <span class="Special"><-</span> get *editor, <span class="Constant">right:offset</span> <span id="L209" class="LineNr">209 </span> curr:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> -<span id="L210" class="LineNr">210 </span> prev:&:duplex-list:char <span class="Special"><-</span> copy curr <span class="Comment"># just in case curr becomes null and we can't compute prev</span> -<span id="L211" class="LineNr">211 </span> curr <span class="Special"><-</span> next curr +<span id="L210" class="LineNr">210 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:duplex-list:char <span class="Special"><-</span> copy curr <span class="Comment"># just in case curr becomes null and we can't compute prev</span> +<span id="L211" class="LineNr">211 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L212" class="LineNr">212 </span><span class="Constant"> +render-loop-initialization</span> <span id="L213" class="LineNr">213 </span> color:num <span class="Special"><-</span> copy <span class="Constant">7/white</span> <span id="L214" class="LineNr">214 </span> row:num <span class="Special"><-</span> copy <span class="Constant">1/top</span> @@ -280,17 +280,17 @@ if ('onhashchange' in window) { <span id="L221" class="LineNr">221 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, column <span id="L222" class="LineNr">222 </span> top-of-screen:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> <span id="L223" class="LineNr">223 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, top-of-screen -<span id="L224" class="LineNr">224 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L224" class="LineNr">224 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L225" class="LineNr">225 </span> <span class="Delimiter">{</span> <span id="L226" class="LineNr">226 </span><span class="Constant"> +next-character</span> <span id="L227" class="LineNr">227 </span> <span class="muControl">break-unless</span> curr -<span id="L228" class="LineNr">228 </span> off-screen?:bool <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L228" class="LineNr">228 </span> off-screen?:bool <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L229" class="LineNr">229 </span> <span class="muControl">break-if</span> off-screen? <span id="L230" class="LineNr">230 </span> <span class="Comment"># if we find old-before-cursor still on the new resized screen, update</span> <span id="L231" class="LineNr">231 </span> <span class="Comment"># editor.cursor-row and editor.cursor-column based on</span> <span id="L232" class="LineNr">232 </span> <span class="Comment"># old-before-cursor</span> <span id="L233" class="LineNr">233 </span> <span class="Delimiter">{</span> -<span id="L234" class="LineNr">234 </span> at-cursor?:bool <span class="Special"><-</span> equal old-before-cursor, prev +<span id="L234" class="LineNr">234 </span> at-cursor?:bool <span class="Special"><-</span> equal old-before-cursor, <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L235" class="LineNr">235 </span> <span class="muControl">break-unless</span> at-cursor? <span id="L236" class="LineNr">236 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, row <span id="L237" class="LineNr">237 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-column:offset</span>, column @@ -303,13 +303,13 @@ if ('onhashchange' in window) { <span id="L244" class="LineNr">244 </span> newline?:bool <span class="Special"><-</span> equal c, <span class="Constant">10/newline</span> <span id="L245" class="LineNr">245 </span> <span class="muControl">break-unless</span> newline? <span id="L246" class="LineNr">246 </span> <span class="Comment"># clear rest of line in this window</span> -<span id="L247" class="LineNr">247 </span> clear-line-until screen, right +<span id="L247" class="LineNr">247 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L248" class="LineNr">248 </span> <span class="Comment"># skip to next line</span> <span id="L249" class="LineNr">249 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L250" class="LineNr">250 </span> column <span class="Special"><-</span> copy left -<span id="L251" class="LineNr">251 </span> screen <span class="Special"><-</span> move-cursor screen, row, column -<span id="L252" class="LineNr">252 </span> curr <span class="Special"><-</span> next curr -<span id="L253" class="LineNr">253 </span> prev <span class="Special"><-</span> next prev +<span id="L251" class="LineNr">251 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column +<span id="L252" class="LineNr">252 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr +<span id="L253" class="LineNr">253 </span> <a href='065duplex_list.mu.html#L36'>prev</a> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L254" class="LineNr">254 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L255" class="LineNr">255 </span> <span class="Delimiter">}</span> <span id="L256" class="LineNr">256 </span> <span class="Delimiter">{</span> @@ -319,16 +319,16 @@ if ('onhashchange' in window) { <span id="L260" class="LineNr">260 </span> <span class="muControl">break-unless</span> at-right? <span id="L261" class="LineNr">261 </span> <span class="Comment"># print wrap icon</span> <span id="L262" class="LineNr">262 </span> wrap-icon:char <span class="Special"><-</span> copy <span class="Constant">8617/loop-back-to-left</span> -<span id="L263" class="LineNr">263 </span> print screen, wrap-icon, <span class="Constant">245/grey</span> +<span id="L263" class="LineNr">263 </span> print <a href='081print.mu.html#L4'>screen</a>, wrap-icon, <span class="Constant">245/grey</span> <span id="L264" class="LineNr">264 </span> column <span class="Special"><-</span> copy left <span id="L265" class="LineNr">265 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L266" class="LineNr">266 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L266" class="LineNr">266 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L267" class="LineNr">267 </span> <span class="Comment"># don't increment curr</span> <span id="L268" class="LineNr">268 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L269" class="LineNr">269 </span> <span class="Delimiter">}</span> -<span id="L270" class="LineNr">270 </span> print screen, c, color -<span id="L271" class="LineNr">271 </span> curr <span class="Special"><-</span> next curr -<span id="L272" class="LineNr">272 </span> prev <span class="Special"><-</span> next prev +<span id="L270" class="LineNr">270 </span> print <a href='081print.mu.html#L4'>screen</a>, c, color +<span id="L271" class="LineNr">271 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr +<span id="L272" class="LineNr">272 </span> <a href='065duplex_list.mu.html#L36'>prev</a> <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> <a href='065duplex_list.mu.html#L36'>prev</a> <span id="L273" class="LineNr">273 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L274" class="LineNr">274 </span> <span class="muControl">loop</span> <span id="L275" class="LineNr">275 </span> <span class="Delimiter">}</span> @@ -348,7 +348,7 @@ if ('onhashchange' in window) { <span id="L289" class="LineNr">289 </span><span class="Constant"> |abc|</span> <span id="L290" class="LineNr">290 </span> ] <span id="L291" class="LineNr">291 </span> ] -<span id="L292" class="LineNr">292 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span> <span class="Comment"># contents of sandbox editor</span> +<span id="L292" class="LineNr">292 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[def]</span> <span class="Comment"># contents of sandbox editor</span> <span id="L293" class="LineNr">293 </span> <span class="Comment"># focus on both sides</span> <span id="L294" class="LineNr">294 </span> assume-console [ <span id="L295" class="LineNr">295 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span> @@ -356,7 +356,7 @@ if ('onhashchange' in window) { <span id="L297" class="LineNr">297 </span> ] <span id="L298" class="LineNr">298 </span> <span class="Comment"># check cursor column in each</span> <span id="L299" class="LineNr">299 </span> run [ -<span id="L300" class="LineNr">300 </span> event-loop screen, console, env, resources +<span id="L300" class="LineNr">300 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L301" class="LineNr">301 </span> recipes:&:editor <span class="Special"><-</span> get *env, <span class="Constant">recipes:offset</span> <span id="L302" class="LineNr">302 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *recipes, <span class="Constant">cursor-column:offset</span> <span id="L303" class="LineNr">303 </span> sandbox:&:editor <span class="Special"><-</span> get *env, <span class="Constant">current-sandbox:offset</span> @@ -378,8 +378,8 @@ if ('onhashchange' in window) { <span id="L319" class="LineNr">319 </span><span class="Constant"> |abc|</span> <span id="L320" class="LineNr">320 </span> ] <span id="L321" class="LineNr">321 </span> ] -<span id="L322" class="LineNr">322 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span> <span class="Comment"># contents of sandbox</span> -<span id="L323" class="LineNr">323 </span> render-all screen, env, render +<span id="L322" class="LineNr">322 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[def]</span> <span class="Comment"># contents of sandbox</span> +<span id="L323" class="LineNr">323 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L324" class="LineNr">324 </span> <span class="Comment"># type one letter in each of them</span> <span id="L325" class="LineNr">325 </span> assume-console [ <span id="L326" class="LineNr">326 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span> @@ -388,7 +388,7 @@ if ('onhashchange' in window) { <span id="L329" class="LineNr">329 </span> type <span class="Constant">[1]</span> <span id="L330" class="LineNr">330 </span> ] <span id="L331" class="LineNr">331 </span> run [ -<span id="L332" class="LineNr">332 </span> event-loop screen, console, env, resources +<span id="L332" class="LineNr">332 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L333" class="LineNr">333 </span> recipes:&:editor <span class="Special"><-</span> get *env, <span class="Constant">recipes:offset</span> <span id="L334" class="LineNr">334 </span> 5:num/<span class="Special">raw</span> <span class="Special"><-</span> get *recipes, <span class="Constant">cursor-column:offset</span> <span id="L335" class="LineNr">335 </span> sandbox:&:editor <span class="Special"><-</span> get *env, <span class="Constant">current-sandbox:offset</span> @@ -408,7 +408,7 @@ if ('onhashchange' in window) { <span id="L349" class="LineNr">349 </span> <span class="Comment"># show the cursor at the right window</span> <span id="L350" class="LineNr">350 </span> run [ <span id="L351" class="LineNr">351 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L352" class="LineNr">352 </span> print screen, cursor +<span id="L352" class="LineNr">352 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L353" class="LineNr">353 </span> ] <span id="L354" class="LineNr">354 </span> screen-should-contain [ <span id="L355" class="LineNr">355 </span> <span class="Constant"> . run (F4) .</span> @@ -428,14 +428,14 @@ if ('onhashchange' in window) { <span id="L369" class="LineNr">369 </span><span class="Constant"> |abc|</span> <span id="L370" class="LineNr">370 </span> ] <span id="L371" class="LineNr">371 </span> ] -<span id="L372" class="LineNr">372 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[def]</span> -<span id="L373" class="LineNr">373 </span> render-all screen, env, render +<span id="L372" class="LineNr">372 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[def]</span> +<span id="L373" class="LineNr">373 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L374" class="LineNr">374 </span> <span class="Comment"># initialize programming environment and highlight cursor</span> <span id="L375" class="LineNr">375 </span> assume-console <span class="Constant">[]</span> <span id="L376" class="LineNr">376 </span> run [ -<span id="L377" class="LineNr">377 </span> event-loop screen, console, env, resources +<span id="L377" class="LineNr">377 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L378" class="LineNr">378 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L379" class="LineNr">379 </span> print screen, cursor +<span id="L379" class="LineNr">379 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L380" class="LineNr">380 </span> ] <span id="L381" class="LineNr">381 </span> <span class="Comment"># is cursor at the right place?</span> <span id="L382" class="LineNr">382 </span> screen-should-contain [ @@ -450,9 +450,9 @@ if ('onhashchange' in window) { <span id="L391" class="LineNr">391 </span> type <span class="Constant">[z]</span> <span id="L392" class="LineNr">392 </span> ] <span id="L393" class="LineNr">393 </span> run [ -<span id="L394" class="LineNr">394 </span> event-loop screen, console, env, resources +<span id="L394" class="LineNr">394 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L395" class="LineNr">395 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L396" class="LineNr">396 </span> print screen, cursor +<span id="L396" class="LineNr">396 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L397" class="LineNr">397 </span> ] <span id="L398" class="LineNr">398 </span> <span class="Comment"># cursor should still be right</span> <span id="L399" class="LineNr">399 </span> screen-should-contain [ @@ -473,8 +473,8 @@ if ('onhashchange' in window) { <span id="L414" class="LineNr">414 </span> <span class="Comment"># initialize sandbox side with two lines</span> <span id="L415" class="LineNr">415 </span> test-sandbox-editor-contents:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L416" class="LineNr">416 </span><span class="Constant">def]</span> -<span id="L417" class="LineNr">417 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, test-sandbox-editor-contents -<span id="L418" class="LineNr">418 </span> render-all screen, env, render +<span id="L417" class="LineNr">417 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, test-sandbox-editor-contents +<span id="L418" class="LineNr">418 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L419" class="LineNr">419 </span> screen-should-contain [ <span id="L420" class="LineNr">420 </span> <span class="Constant"> . run (F4) .</span> <span id="L421" class="LineNr">421 </span> <span class="Constant"> . ╎abc .</span> @@ -488,9 +488,9 @@ if ('onhashchange' in window) { <span id="L429" class="LineNr">429 </span> press backspace <span id="L430" class="LineNr">430 </span> ] <span id="L431" class="LineNr">431 </span> run [ -<span id="L432" class="LineNr">432 </span> event-loop screen, console, env, resources +<span id="L432" class="LineNr">432 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L433" class="LineNr">433 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L434" class="LineNr">434 </span> print screen, cursor +<span id="L434" class="LineNr">434 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L435" class="LineNr">435 </span> ] <span id="L436" class="LineNr">436 </span> <span class="Comment"># cursor moves to end of old line</span> <span id="L437" class="LineNr">437 </span> screen-should-contain [ @@ -501,39 +501,39 @@ if ('onhashchange' in window) { <span id="L442" class="LineNr">442 </span> ] <span id="L443" class="LineNr">443 </span>] <span id="L444" class="LineNr">444 </span> -<span id="L445" class="LineNr">445 </span><span class="muRecipe">def</span> render-all screen:&:screen, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span>screen:&:screen, env:&:environment [ +<span id="L445" class="LineNr">445 </span><span class="muRecipe">def</span> render-all <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment [ <span id="L446" class="LineNr">446 </span> <span class="Constant">local-scope</span> <span id="L447" class="LineNr">447 </span> <span class="Constant">load-ingredients</span> <span id="L448" class="LineNr">448 </span> trace<span class="Constant"> 10</span>, <span class="Constant">[app]</span>, <span class="Constant">[render all]</span> -<span id="L449" class="LineNr">449 </span> hide-screen screen +<span id="L449" class="LineNr">449 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L450" class="LineNr">450 </span> <span class="Comment"># top menu</span> <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> -<span id="L452" class="LineNr">452 </span> width:num <span class="Special"><-</span> screen-width screen -<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> +<span id="L452" class="LineNr">452 </span> width:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L453" class="LineNr">453 </span> draw-horizontal <a href='081print.mu.html#L4'>screen</a>,<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> <span id="L454" class="LineNr">454 </span> button-start:num <span class="Special"><-</span> subtract width,<span class="Constant"> 20</span> <span id="L455" class="LineNr">455 </span> button-on-screen?:bool <span class="Special"><-</span> greater-or-equal button-start,<span class="Constant"> 0</span> <span id="L456" class="LineNr">456 </span> assert button-on-screen?, <span class="Constant">[screen too narrow for menu]</span> -<span id="L457" class="LineNr">457 </span> screen <span class="Special"><-</span> move-cursor screen, <span class="Constant">0/row</span>, button-start -<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> +<span id="L457" class="LineNr">457 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">0/row</span>, button-start +<span id="L458" class="LineNr">458 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[ run (F4) ]</span>, <span class="Constant">255/white</span>, <span class="Constant">161/reddish</span> <span id="L459" class="LineNr">459 </span> <span class="Comment"># dotted line down the middle</span> <span id="L460" class="LineNr">460 </span> trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render divider]</span> <span id="L461" class="LineNr">461 </span> divider:num, _ <span class="Special"><-</span> divide-with-remainder width,<span class="Constant"> 2</span> -<span id="L462" class="LineNr">462 </span> height:num <span class="Special"><-</span> screen-height screen -<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> +<span id="L462" class="LineNr">462 </span> height:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L463" class="LineNr">463 </span> draw-vertical <a href='081print.mu.html#L4'>screen</a>, divider, <span class="Constant">1/top</span>, height, <span class="Constant">9482/vertical-dotted</span> <span id="L464" class="LineNr">464 </span> <span class="Comment">#</span> -<span id="L465" class="LineNr">465 </span> screen <span class="Special"><-</span> render-recipes screen, env, render-editor -<span id="L466" class="LineNr">466 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render-editor +<span id="L465" class="LineNr">465 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-recipes <a href='081print.mu.html#L4'>screen</a>, env, render-editor +<span id="L466" class="LineNr">466 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render-editor <span id="L467" class="LineNr">467 </span><span class="Constant"> <render-components-end></span> <span id="L468" class="LineNr">468 </span> <span class="Comment">#</span> <span id="L469" class="LineNr">469 </span> recipes:&:editor <span class="Special"><-</span> get *env, <span class="Constant">recipes:offset</span> <span id="L470" class="LineNr">470 </span> current-sandbox:&:editor <span class="Special"><-</span> get *env, <span class="Constant">current-sandbox:offset</span> <span id="L471" class="LineNr">471 </span> sandbox-in-focus?:bool <span class="Special"><-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span> -<span id="L472" class="LineNr">472 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L472" class="LineNr">472 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env <span id="L473" class="LineNr">473 </span> <span class="Comment">#</span> -<span id="L474" class="LineNr">474 </span> show-screen screen +<span id="L474" class="LineNr">474 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L475" class="LineNr">475 </span>] <span id="L476" class="LineNr">476 </span> -<span id="L477" class="LineNr">477 </span><span class="muRecipe">def</span> render-recipes screen:&:screen, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span>screen:&:screen, env:&:environment [ +<span id="L477" class="LineNr">477 </span><span class="muRecipe">def</span> render-recipes <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment [ <span id="L478" class="LineNr">478 </span> <span class="Constant">local-scope</span> <span id="L479" class="LineNr">479 </span> <span class="Constant">load-ingredients</span> <span id="L480" class="LineNr">480 </span> trace<span class="Constant"> 11</span>, <span class="Constant">[app]</span>, <span class="Constant">[render recipes]</span> @@ -541,33 +541,33 @@ if ('onhashchange' in window) { <span id="L482" class="LineNr">482 </span> <span class="Comment"># render recipes</span> <span id="L483" class="LineNr">483 </span> left:num <span class="Special"><-</span> get *recipes, <span class="Constant">left:offset</span> <span id="L484" class="LineNr">484 </span> right:num <span class="Special"><-</span> get *recipes, <span class="Constant">right:offset</span> -<span id="L485" class="LineNr">485 </span> row:num, column:num, screen <span class="Special"><-</span> call render-editor, screen, recipes -<span id="L486" class="LineNr">486 </span> clear-line-until screen, right +<span id="L485" class="LineNr">485 </span> row:num, column:num, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> call render-editor, <a href='081print.mu.html#L4'>screen</a>, recipes +<span id="L486" class="LineNr">486 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L487" class="LineNr">487 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L488" class="LineNr">488 </span><span class="Constant"> <render-recipe-components-end></span> <span id="L489" class="LineNr">489 </span> <span class="Comment"># draw dotted line after recipes</span> -<span id="L490" class="LineNr">490 </span> draw-horizontal screen, row, left, right, <span class="Constant">9480/horizontal-dotted</span> +<span id="L490" class="LineNr">490 </span> draw-horizontal <a href='081print.mu.html#L4'>screen</a>, row, left, right, <span class="Constant">9480/horizontal-dotted</span> <span id="L491" class="LineNr">491 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L492" class="LineNr">492 </span> clear-screen-from screen, row, left, left, right +<span id="L492" class="LineNr">492 </span> clear-screen-from <a href='081print.mu.html#L4'>screen</a>, row, left, left, right <span id="L493" class="LineNr">493 </span>] <span id="L494" class="LineNr">494 </span> <span id="L495" class="LineNr">495 </span><span class="Comment"># replaced in a later layer</span> -<span id="L496" class="LineNr">496 </span><span class="muRecipe">def</span> render-sandbox-side screen:&:screen, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span>screen:&:screen, env:&:environment [ +<span id="L496" class="LineNr">496 </span><span class="muRecipe">def</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment [ <span id="L497" class="LineNr">497 </span> <span class="Constant">local-scope</span> <span id="L498" class="LineNr">498 </span> <span class="Constant">load-ingredients</span> <span id="L499" class="LineNr">499 </span> current-sandbox:&:editor <span class="Special"><-</span> get *env, <span class="Constant">current-sandbox:offset</span> <span id="L500" class="LineNr">500 </span> left:num <span class="Special"><-</span> get *current-sandbox, <span class="Constant">left:offset</span> <span id="L501" class="LineNr">501 </span> right:num <span class="Special"><-</span> get *current-sandbox, <span class="Constant">right:offset</span> -<span id="L502" class="LineNr">502 </span> row:num, column:num, screen, current-sandbox <span class="Special"><-</span> call render-editor, screen, current-sandbox -<span id="L503" class="LineNr">503 </span> clear-line-until screen, right +<span id="L502" class="LineNr">502 </span> row:num, column:num, <a href='081print.mu.html#L4'>screen</a>, current-sandbox <span class="Special"><-</span> call render-editor, <a href='081print.mu.html#L4'>screen</a>, current-sandbox +<span id="L503" class="LineNr">503 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L504" class="LineNr">504 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L505" class="LineNr">505 </span> <span class="Comment"># draw solid line after code (you'll see why in later layers)</span> -<span id="L506" class="LineNr">506 </span> draw-horizontal screen, row, left, right +<span id="L506" class="LineNr">506 </span> draw-horizontal <a href='081print.mu.html#L4'>screen</a>, row, left, right <span id="L507" class="LineNr">507 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L508" class="LineNr">508 </span> clear-screen-from screen, row, left, left, right +<span id="L508" class="LineNr">508 </span> clear-screen-from <a href='081print.mu.html#L4'>screen</a>, row, left, left, right <span id="L509" class="LineNr">509 </span>] <span id="L510" class="LineNr">510 </span> -<span id="L511" class="LineNr">511 </span><span class="muRecipe">def</span> update-cursor screen:&:screen, recipes:&:editor, current-sandbox:&:editor, sandbox-in-focus?:bool, env:&:environment<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L511" class="LineNr">511 </span><span class="muRecipe">def</span> update-cursor <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, recipes:&:editor, current-sandbox:&:editor, sandbox-in-focus?:bool, env:&:environment<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L512" class="LineNr">512 </span> <span class="Constant">local-scope</span> <span id="L513" class="LineNr">513 </span> <span class="Constant">load-ingredients</span> <span id="L514" class="LineNr">514 </span><span class="Constant"> <update-cursor-special-cases></span> @@ -581,25 +581,25 @@ if ('onhashchange' in window) { <span id="L522" class="LineNr">522 </span> cursor-row:num <span class="Special"><-</span> get *current-sandbox, <span class="Constant">cursor-row:offset</span> <span id="L523" class="LineNr">523 </span> cursor-column:num <span class="Special"><-</span> get *current-sandbox, <span class="Constant">cursor-column:offset</span> <span id="L524" class="LineNr">524 </span> <span class="Delimiter">}</span> -<span id="L525" class="LineNr">525 </span> screen <span class="Special"><-</span> move-cursor screen, cursor-row, cursor-column +<span id="L525" class="LineNr">525 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, cursor-row, cursor-column <span id="L526" class="LineNr">526 </span>] <span id="L527" class="LineNr">527 </span> <span id="L528" class="LineNr">528 </span><span class="Comment"># like 'render' for texts, but with colorization for comments like in the editor</span> -<span id="L529" class="LineNr">529 </span><span class="muRecipe">def</span> render-code screen:&:screen, s:text, left:num, right:num, row:num<span class="muRecipe"> -> </span>row:num, screen:&:screen [ +<span id="L529" class="LineNr">529 </span><span class="muRecipe">def</span> render-code <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, s:text, left:num, right:num, row:num<span class="muRecipe"> -> </span>row:num, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L530" class="LineNr">530 </span> <span class="Constant">local-scope</span> <span id="L531" class="LineNr">531 </span> <span class="Constant">load-ingredients</span> <span id="L532" class="LineNr">532 </span> <span class="muControl">return-unless</span> s <span id="L533" class="LineNr">533 </span> color:num <span class="Special"><-</span> copy <span class="Constant">7/white</span> <span id="L534" class="LineNr">534 </span> column:num <span class="Special"><-</span> copy left -<span id="L535" class="LineNr">535 </span> screen <span class="Special"><-</span> move-cursor screen, row, column -<span id="L536" class="LineNr">536 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L535" class="LineNr">535 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column +<span id="L536" class="LineNr">536 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L537" class="LineNr">537 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L538" class="LineNr">538 </span> len:num <span class="Special"><-</span> length *s <span id="L539" class="LineNr">539 </span> <span class="Delimiter">{</span> <span id="L540" class="LineNr">540 </span><span class="Constant"> +next-character</span> <span id="L541" class="LineNr">541 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L542" class="LineNr">542 </span> <span class="muControl">break-if</span> done? -<span id="L543" class="LineNr">543 </span> done? <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L543" class="LineNr">543 </span> done? <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L544" class="LineNr">544 </span> <span class="muControl">break-if</span> done? <span id="L545" class="LineNr">545 </span> c:char <span class="Special"><-</span> index *s, i <span id="L546" class="LineNr">546 </span> <span class="Constant"><character-c-received></span> <span class="Comment"># only line different from render</span> @@ -609,10 +609,10 @@ if ('onhashchange' in window) { <span id="L550" class="LineNr">550 </span> <span class="muControl">break-unless</span> at-right? <span id="L551" class="LineNr">551 </span> <span class="Comment"># print wrap icon</span> <span id="L552" class="LineNr">552 </span> wrap-icon:char <span class="Special"><-</span> copy <span class="Constant">8617/loop-back-to-left</span> -<span id="L553" class="LineNr">553 </span> print screen, wrap-icon, <span class="Constant">245/grey</span> +<span id="L553" class="LineNr">553 </span> print <a href='081print.mu.html#L4'>screen</a>, wrap-icon, <span class="Constant">245/grey</span> <span id="L554" class="LineNr">554 </span> column <span class="Special"><-</span> copy left <span id="L555" class="LineNr">555 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L556" class="LineNr">556 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L556" class="LineNr">556 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L557" class="LineNr">557 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span class="Comment"># retry i</span> <span id="L558" class="LineNr">558 </span> <span class="Delimiter">}</span> <span id="L559" class="LineNr">559 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> @@ -625,26 +625,26 @@ if ('onhashchange' in window) { <span id="L566" class="LineNr">566 </span> done?:bool <span class="Special"><-</span> greater-than column, right <span id="L567" class="LineNr">567 </span> <span class="muControl">break-if</span> done? <span id="L568" class="LineNr">568 </span> space:char <span class="Special"><-</span> copy <span class="Constant">32/space</span> -<span id="L569" class="LineNr">569 </span> print screen, space +<span id="L569" class="LineNr">569 </span> print <a href='081print.mu.html#L4'>screen</a>, space <span id="L570" class="LineNr">570 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L571" class="LineNr">571 </span> <span class="muControl">loop</span> <span id="L572" class="LineNr">572 </span> <span class="Delimiter">}</span> <span id="L573" class="LineNr">573 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L574" class="LineNr">574 </span> column <span class="Special"><-</span> copy left -<span id="L575" class="LineNr">575 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L575" class="LineNr">575 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L576" class="LineNr">576 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L577" class="LineNr">577 </span> <span class="Delimiter">}</span> -<span id="L578" class="LineNr">578 </span> print screen, c, color +<span id="L578" class="LineNr">578 </span> print <a href='081print.mu.html#L4'>screen</a>, c, color <span id="L579" class="LineNr">579 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L580" class="LineNr">580 </span> <span class="muControl">loop</span> <span id="L581" class="LineNr">581 </span> <span class="Delimiter">}</span> <span id="L582" class="LineNr">582 </span> was-at-left?:bool <span class="Special"><-</span> equal column, left -<span id="L583" class="LineNr">583 </span> clear-line-until screen, right +<span id="L583" class="LineNr">583 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L584" class="LineNr">584 </span> <span class="Delimiter">{</span> <span id="L585" class="LineNr">585 </span> <span class="muControl">break-if</span> was-at-left? <span id="L586" class="LineNr">586 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L587" class="LineNr">587 </span> <span class="Delimiter">}</span> -<span id="L588" class="LineNr">588 </span> move-cursor screen, row, left +<span id="L588" class="LineNr">588 </span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, left <span id="L589" class="LineNr">589 </span>] <span id="L590" class="LineNr">590 </span> <span id="L591" class="LineNr">591 </span><span class="Comment"># ctrl-l - redraw screen (just in case it printed junk somehow)</span> @@ -653,8 +653,8 @@ if ('onhashchange' in window) { <span id="L594" class="LineNr">594 </span> <span class="Delimiter">{</span> <span id="L595" class="LineNr">595 </span> redraw-screen?:bool <span class="Special"><-</span> equal c, <span class="Constant">12/ctrl-l</span> <span id="L596" class="LineNr">596 </span> <span class="muControl">break-unless</span> redraw-screen? -<span id="L597" class="LineNr">597 </span> screen <span class="Special"><-</span> render-all screen, env:&:environment, render -<span id="L598" class="LineNr">598 </span> sync-screen screen +<span id="L597" class="LineNr">597 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-all <a href='081print.mu.html#L4'>screen</a>, env:&:environment, render +<span id="L598" class="LineNr">598 </span> <a href='081print.mu.html#L53'>sync-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L599" class="LineNr">599 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L600" class="LineNr">600 </span> <span class="Delimiter">}</span> <span id="L601" class="LineNr">601 </span>] @@ -669,14 +669,14 @@ if ('onhashchange' in window) { <span id="L610" class="LineNr">610 </span> sandbox-in-focus?:bool <span class="Special"><-</span> get *env, <span class="Constant">sandbox-in-focus?:offset</span> <span id="L611" class="LineNr">611 </span> sandbox-in-focus? <span class="Special"><-</span> not sandbox-in-focus? <span id="L612" class="LineNr">612 </span> *env <span class="Special"><-</span> put *env, <span class="Constant">sandbox-in-focus?:offset</span>, sandbox-in-focus? -<span id="L613" class="LineNr">613 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L613" class="LineNr">613 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env <span id="L614" class="LineNr">614 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L615" class="LineNr">615 </span> <span class="Delimiter">}</span> <span id="L616" class="LineNr">616 </span>] <span id="L617" class="LineNr">617 </span> <span id="L618" class="LineNr">618 </span><span class="SalientComment">## helpers</span> <span id="L619" class="LineNr">619 </span> -<span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> draw-vertical screen:&:screen, col:num, y:num, bottom:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L620" class="LineNr">620 </span><span class="muRecipe">def</span> draw-vertical <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, col:num, y:num, bottom:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L621" class="LineNr">621 </span> <span class="Constant">local-scope</span> <span id="L622" class="LineNr">622 </span> <span class="Constant">load-ingredients</span> <span id="L623" class="LineNr">623 </span> style:char, style-found?:bool <span class="Special"><-</span> <span class="Constant">next-ingredient</span> @@ -693,8 +693,8 @@ if ('onhashchange' in window) { <span id="L634" class="LineNr">634 </span> <span class="Delimiter">{</span> <span id="L635" class="LineNr">635 </span> continue?:bool <span class="Special"><-</span> lesser-than y, bottom <span id="L636" class="LineNr">636 </span> <span class="muControl">break-unless</span> continue? -<span id="L637" class="LineNr">637 </span> screen <span class="Special"><-</span> move-cursor screen, y, col -<span id="L638" class="LineNr">638 </span> print screen, style, color +<span id="L637" class="LineNr">637 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, y, col +<span id="L638" class="LineNr">638 </span> print <a href='081print.mu.html#L4'>screen</a>, style, color <span id="L639" class="LineNr">639 </span> y <span class="Special"><-</span> add y,<span class="Constant"> 1</span> <span id="L640" class="LineNr">640 </span> <span class="muControl">loop</span> <span id="L641" class="LineNr">641 </span> <span class="Delimiter">}</span> diff --git a/html/edit/005-sandbox.mu.html b/html/edit/005-sandbox.mu.html index 39108d9c..5c5b4f00 100644 --- a/html/edit/005-sandbox.mu.html +++ b/html/edit/005-sandbox.mu.html @@ -93,7 +93,7 @@ if ('onhashchange' in window) { <span id="L34" class="LineNr"> 34 </span> <span class="Comment"># constraint: will be 0 for sandboxes at positions before env.render-from</span> <span id="L35" class="LineNr"> 35 </span> starting-row-on-screen:num <span id="L36" class="LineNr"> 36 </span> code-ending-row-on-screen:num <span class="Comment"># past end of code</span> -<span id="L37" class="LineNr"> 37 </span> screen:&:screen <span class="Comment"># prints in the sandbox go here</span> +<span id="L37" class="LineNr"> 37 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Comment"># prints in the sandbox go here</span> <span id="L38" class="LineNr"> 38 </span> next-sandbox:&:sandbox <span id="L39" class="LineNr"> 39 </span>] <span id="L40" class="LineNr"> 40 </span> @@ -105,13 +105,13 @@ if ('onhashchange' in window) { <span id="L46" class="LineNr"> 46 </span> assume-resources [ <span id="L47" class="LineNr"> 47 </span> ] <span id="L48" class="LineNr"> 48 </span> <span class="Comment"># sandbox editor contains an instruction without storing outputs</span> -<span id="L49" class="LineNr"> 49 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[divide-with-remainder 11, 3]</span> +<span id="L49" class="LineNr"> 49 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[divide-with-remainder 11, 3]</span> <span id="L50" class="LineNr"> 50 </span> <span class="Comment"># run the code in the editors</span> <span id="L51" class="LineNr"> 51 </span> assume-console [ <span id="L52" class="LineNr"> 52 </span> press F4 <span id="L53" class="LineNr"> 53 </span> ] <span id="L54" class="LineNr"> 54 </span> run [ -<span id="L55" class="LineNr"> 55 </span> event-loop screen, console, env, resources +<span id="L55" class="LineNr"> 55 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L56" class="LineNr"> 56 </span> ] <span id="L57" class="LineNr"> 57 </span> <span class="Comment"># check that screen prints the results</span> <span id="L58" class="LineNr"> 58 </span> screen-should-contain [ @@ -161,7 +161,7 @@ if ('onhashchange' in window) { <span id="L102" class="LineNr"> 102 </span> press F4 <span id="L103" class="LineNr"> 103 </span> ] <span id="L104" class="LineNr"> 104 </span> run [ -<span id="L105" class="LineNr"> 105 </span> event-loop screen, console, env, resources +<span id="L105" class="LineNr"> 105 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L106" class="LineNr"> 106 </span> ] <span id="L107" class="LineNr"> 107 </span> <span class="Comment"># check that screen prints both sandboxes</span> <span id="L108" class="LineNr"> 108 </span> screen-should-contain [ @@ -186,23 +186,23 @@ if ('onhashchange' in window) { <span id="L127" class="LineNr"> 127 </span> <span class="Delimiter">{</span> <span id="L128" class="LineNr"> 128 </span> do-run?:bool <span class="Special"><-</span> equal k, <span class="Constant">65532/F4</span> <span id="L129" class="LineNr"> 129 </span> <span class="muControl">break-unless</span> do-run? -<span id="L130" class="LineNr"> 130 </span> screen <span class="Special"><-</span> update-status screen, <span class="Constant">[running... ]</span>, <span class="Constant">245/grey</span> -<span id="L131" class="LineNr"> 131 </span> error?:bool <span class="Special"><-</span> run-sandboxes env, resources, screen +<span id="L130" class="LineNr"> 130 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-status <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[running... ]</span>, <span class="Constant">245/grey</span> +<span id="L131" class="LineNr"> 131 </span> error?:bool <span class="Special"><-</span> run-sandboxes env, <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a> <span id="L132" class="LineNr"> 132 </span> <span class="Comment"># F4 might update warnings and results on both sides</span> -<span id="L133" class="LineNr"> 133 </span> screen <span class="Special"><-</span> render-all screen, env, render +<span id="L133" class="LineNr"> 133 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L134" class="LineNr"> 134 </span> <span class="Delimiter">{</span> <span id="L135" class="LineNr"> 135 </span> <span class="muControl">break-if</span> error? -<span id="L136" class="LineNr"> 136 </span> screen <span class="Special"><-</span> update-status screen, <span class="Constant">[ ]</span>, <span class="Constant">245/grey</span> +<span id="L136" class="LineNr"> 136 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-status <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[ ]</span>, <span class="Constant">245/grey</span> <span id="L137" class="LineNr"> 137 </span> <span class="Delimiter">}</span> -<span id="L138" class="LineNr"> 138 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L138" class="LineNr"> 138 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env <span id="L139" class="LineNr"> 139 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L140" class="LineNr"> 140 </span> <span class="Delimiter">}</span> <span id="L141" class="LineNr"> 141 </span>] <span id="L142" class="LineNr"> 142 </span> -<span id="L143" class="LineNr"> 143 </span><span class="muRecipe">def</span> run-sandboxes env:&:environment, resources:&:resources, screen:&:screen<span class="muRecipe"> -> </span>errors-found?:bool, env:&:environment, resources:&:resources, screen:&:screen [ +<span id="L143" class="LineNr"> 143 </span><span class="muRecipe">def</span> run-sandboxes env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>errors-found?:bool, env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L144" class="LineNr"> 144 </span> <span class="Constant">local-scope</span> <span id="L145" class="LineNr"> 145 </span> <span class="Constant">load-ingredients</span> -<span id="L146" class="LineNr"> 146 </span> errors-found?:bool <span class="Special"><-</span> update-recipes env, resources, screen +<span id="L146" class="LineNr"> 146 </span> errors-found?:bool <span class="Special"><-</span> update-recipes env, <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a> <span id="L147" class="LineNr"> 147 </span> <span class="muControl">return-if</span> errors-found? <span id="L148" class="LineNr"> 148 </span> <span class="Comment"># check contents of right editor (sandbox)</span> <span id="L149" class="LineNr"> 149 </span><span class="Constant"> <run-sandboxes-begin></span> @@ -228,7 +228,7 @@ if ('onhashchange' in window) { <span id="L169" class="LineNr"> 169 </span> *current-sandbox <span class="Special"><-</span> put *current-sandbox, <span class="Constant">top-of-screen:offset</span>, init <span id="L170" class="LineNr"> 170 </span> <span class="Delimiter">}</span> <span id="L171" class="LineNr"> 171 </span> <span class="Comment"># save all sandboxes before running, just in case we die when running</span> -<span id="L172" class="LineNr"> 172 </span> save-sandboxes env, resources +<span id="L172" class="LineNr"> 172 </span> save-sandboxes env, <a href='088file.mu.html#L11'>resources</a> <span id="L173" class="LineNr"> 173 </span> <span class="Comment"># run all sandboxes</span> <span id="L174" class="LineNr"> 174 </span> curr:&:sandbox <span class="Special"><-</span> get *env, <span class="Constant">sandbox:offset</span> <span id="L175" class="LineNr"> 175 </span> idx:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> @@ -244,12 +244,12 @@ if ('onhashchange' in window) { <span id="L185" class="LineNr"> 185 </span> <span id="L186" class="LineNr"> 186 </span><span class="Comment"># load code from disk</span> <span id="L187" class="LineNr"> 187 </span><span class="Comment"># replaced in a later layer (whereupon errors-found? will actually be set)</span> -<span id="L188" class="LineNr"> 188 </span><span class="muRecipe">def</span> update-recipes env:&:environment, resources:&:resources, screen:&:screen<span class="muRecipe"> -> </span>errors-found?:bool, env:&:environment, resources:&:resources, screen:&:screen [ +<span id="L188" class="LineNr"> 188 </span><span class="muRecipe">def</span> update-recipes env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>errors-found?:bool, env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L189" class="LineNr"> 189 </span> <span class="Constant">local-scope</span> <span id="L190" class="LineNr"> 190 </span> <span class="Constant">load-ingredients</span> <span id="L191" class="LineNr"> 191 </span> recipes:&:editor <span class="Special"><-</span> get *env, <span class="Constant">recipes:offset</span> <span id="L192" class="LineNr"> 192 </span> in:text <span class="Special"><-</span> editor-contents recipes -<span id="L193" class="LineNr"> 193 </span> resources <span class="Special"><-</span> dump resources, <span class="Constant">[lesson/recipes.mu]</span>, in +<span id="L193" class="LineNr"> 193 </span> <a href='088file.mu.html#L11'>resources</a> <span class="Special"><-</span> <a href='088file.mu.html#L127'>dump</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[lesson/recipes.mu]</span>, in <span id="L194" class="LineNr"> 194 </span> reload in <span id="L195" class="LineNr"> 195 </span> errors-found? <span class="Special"><-</span> copy <span class="Constant">0/false</span> <span id="L196" class="LineNr"> 196 </span>] @@ -259,19 +259,19 @@ if ('onhashchange' in window) { <span id="L200" class="LineNr"> 200 </span> <span class="Constant">local-scope</span> <span id="L201" class="LineNr"> 201 </span> <span class="Constant">load-ingredients</span> <span id="L202" class="LineNr"> 202 </span> data:text <span class="Special"><-</span> get *sandbox, <span class="Constant">data:offset</span> -<span id="L203" class="LineNr"> 203 </span> response:text, _, fake-screen:&:screen <span class="Special"><-</span> run-sandboxed data +<span id="L203" class="LineNr"> 203 </span> response:text, _, fake-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> run-sandboxed data <span id="L204" class="LineNr"> 204 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">response:offset</span>, response -<span id="L205" class="LineNr"> 205 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen +<span id="L205" class="LineNr"> 205 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant"><a href='081print.mu.html#L4'>screen</a>:offset</span>, fake-screen <span id="L206" class="LineNr"> 206 </span>] <span id="L207" class="LineNr"> 207 </span> -<span id="L208" class="LineNr"> 208 </span><span class="muRecipe">def</span> update-status screen:&:screen, msg:text, color:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L208" class="LineNr"> 208 </span><span class="muRecipe">def</span> update-status <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, msg:text, color:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L209" class="LineNr"> 209 </span> <span class="Constant">local-scope</span> <span id="L210" class="LineNr"> 210 </span> <span class="Constant">load-ingredients</span> -<span id="L211" class="LineNr"> 211 </span> screen <span class="Special"><-</span> move-cursor screen,<span class="Constant"> 0</span>,<span class="Constant"> 2</span> -<span id="L212" class="LineNr"> 212 </span> screen <span class="Special"><-</span> print screen, msg, color, <span class="Constant">238/grey/background</span> +<span id="L211" class="LineNr"> 211 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>,<span class="Constant"> 0</span>,<span class="Constant"> 2</span> +<span id="L212" class="LineNr"> 212 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, msg, color, <span class="Constant">238/grey/background</span> <span id="L213" class="LineNr"> 213 </span>] <span id="L214" class="LineNr"> 214 </span> -<span id="L215" class="LineNr"> 215 </span><span class="muRecipe">def</span> save-sandboxes env:&:environment, resources:&:resources<span class="muRecipe"> -> </span>resources:&:resources [ +<span id="L215" class="LineNr"> 215 </span><span class="muRecipe">def</span> save-sandboxes env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a><span class="muRecipe"> -> </span><a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a> [ <span id="L216" class="LineNr"> 216 </span> <span class="Constant">local-scope</span> <span id="L217" class="LineNr"> 217 </span> <span class="Constant">load-ingredients</span> <span id="L218" class="LineNr"> 218 </span> current-sandbox:&:editor <span class="Special"><-</span> get *env, <span class="Constant">current-sandbox:offset</span> @@ -283,7 +283,7 @@ if ('onhashchange' in window) { <span id="L224" class="LineNr"> 224 </span> <span class="muControl">break-unless</span> curr <span id="L225" class="LineNr"> 225 </span> data:text <span class="Special"><-</span> get *curr, <span class="Constant">data:offset</span> <span id="L226" class="LineNr"> 226 </span> filename:text <span class="Special"><-</span> append <span class="Constant">[lesson/]</span>, idx -<span id="L227" class="LineNr"> 227 </span> resources <span class="Special"><-</span> dump resources, filename, data +<span id="L227" class="LineNr"> 227 </span> <a href='088file.mu.html#L11'>resources</a> <span class="Special"><-</span> <a href='088file.mu.html#L127'>dump</a> <a href='088file.mu.html#L11'>resources</a>, filename, data <span id="L228" class="LineNr"> 228 </span><span class="Constant"> <end-save-sandbox></span> <span id="L229" class="LineNr"> 229 </span> idx <span class="Special"><-</span> add idx,<span class="Constant"> 1</span> <span id="L230" class="LineNr"> 230 </span> curr <span class="Special"><-</span> get *curr, <span class="Constant">next-sandbox:offset</span> @@ -291,7 +291,7 @@ if ('onhashchange' in window) { <span id="L232" class="LineNr"> 232 </span> <span class="Delimiter">}</span> <span id="L233" class="LineNr"> 233 </span>] <span id="L234" class="LineNr"> 234 </span> -<span id="L235" class="LineNr"> 235 </span><span class="muRecipe">def!</span> render-sandbox-side screen:&:screen, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span>screen:&:screen, env:&:environment [ +<span id="L235" class="LineNr"> 235 </span><span class="muRecipe">def!</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment, <span class="Delimiter">{</span>render-editor: (recipe (address screen) (address editor)<span class="muRecipe"> -> </span>number number (address screen) (address editor))<span class="Delimiter">}</span><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, env:&:environment [ <span id="L236" class="LineNr"> 236 </span> <span class="Constant">local-scope</span> <span id="L237" class="LineNr"> 237 </span> <span class="Constant">load-ingredients</span> <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> @@ -304,58 +304,58 @@ if ('onhashchange' in window) { <span id="L245" class="LineNr"> 245 </span> <span class="Delimiter">{</span> <span id="L246" class="LineNr"> 246 </span> render-current-sandbox?:bool <span class="Special"><-</span> equal render-from,<span class="Constant"> -1</span> <span id="L247" class="LineNr"> 247 </span> <span class="muControl">break-unless</span> render-current-sandbox? -<span id="L248" class="LineNr"> 248 </span> row, column, screen, current-sandbox <span class="Special"><-</span> call render-editor, screen, current-sandbox -<span id="L249" class="LineNr"> 249 </span> clear-screen-from screen, row, column, left, right +<span id="L248" class="LineNr"> 248 </span> row, column, <a href='081print.mu.html#L4'>screen</a>, current-sandbox <span class="Special"><-</span> call render-editor, <a href='081print.mu.html#L4'>screen</a>, current-sandbox +<span id="L249" class="LineNr"> 249 </span> clear-screen-from <a href='081print.mu.html#L4'>screen</a>, row, column, left, right <span id="L250" class="LineNr"> 250 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L251" class="LineNr"> 251 </span> <span class="Delimiter">}</span> <span id="L252" class="LineNr"> 252 </span> <span class="Comment"># render sandboxes</span> -<span id="L253" class="LineNr"> 253 </span> draw-horizontal screen, row, left, right +<span id="L253" class="LineNr"> 253 </span> draw-horizontal <a href='081print.mu.html#L4'>screen</a>, row, left, right <span id="L254" class="LineNr"> 254 </span> sandbox:&:sandbox <span class="Special"><-</span> get *env, <span class="Constant">sandbox:offset</span> -<span id="L255" class="LineNr"> 255 </span> row, screen <span class="Special"><-</span> render-sandboxes screen, sandbox, left, right, row, render-from -<span id="L256" class="LineNr"> 256 </span> clear-rest-of-screen screen, row, left, right +<span id="L255" class="LineNr"> 255 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandboxes <a href='081print.mu.html#L4'>screen</a>, sandbox, left, right, row, render-from +<span id="L256" class="LineNr"> 256 </span> clear-rest-of-screen <a href='081print.mu.html#L4'>screen</a>, row, left, right <span id="L257" class="LineNr"> 257 </span>] <span id="L258" class="LineNr"> 258 </span> -<span id="L259" class="LineNr"> 259 </span><span class="muRecipe">def</span> render-sandboxes screen:&:screen, sandbox:&:sandbox, left:num, right:num, row:num, render-from:num, idx:num<span class="muRecipe"> -> </span>row:num, screen:&:screen, sandbox:&:sandbox [ +<span id="L259" class="LineNr"> 259 </span><span class="muRecipe">def</span> render-sandboxes <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, sandbox:&:sandbox, left:num, right:num, row:num, render-from:num, idx:num<span class="muRecipe"> -> </span>row:num, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, sandbox:&:sandbox [ <span id="L260" class="LineNr"> 260 </span> <span class="Constant">local-scope</span> <span id="L261" class="LineNr"> 261 </span> <span class="Constant">load-ingredients</span> <span id="L262" class="LineNr"> 262 </span> <span class="muControl">return-unless</span> sandbox -<span id="L263" class="LineNr"> 263 </span> screen-height:num <span class="Special"><-</span> screen-height screen -<span id="L264" class="LineNr"> 264 </span> at-bottom?:bool <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L263" class="LineNr"> 263 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L264" class="LineNr"> 264 </span> at-bottom?:bool <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L265" class="LineNr"> 265 </span> <span class="muControl">return-if</span> at-bottom?:bool <span id="L266" class="LineNr"> 266 </span> hidden?:bool <span class="Special"><-</span> lesser-than idx, render-from <span id="L267" class="LineNr"> 267 </span> <span class="Delimiter">{</span> <span id="L268" class="LineNr"> 268 </span> <span class="muControl">break-if</span> hidden? <span id="L269" class="LineNr"> 269 </span> <span class="Comment"># render sandbox menu</span> <span id="L270" class="LineNr"> 270 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L271" class="LineNr"> 271 </span> screen <span class="Special"><-</span> move-cursor screen, row, left -<span id="L272" class="LineNr"> 272 </span> screen <span class="Special"><-</span> render-sandbox-menu screen, idx, left, right +<span id="L271" class="LineNr"> 271 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, left +<span id="L272" class="LineNr"> 272 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-menu <a href='081print.mu.html#L4'>screen</a>, idx, left, right <span id="L273" class="LineNr"> 273 </span> <span class="Comment"># save menu row so we can detect clicks to it later</span> <span id="L274" class="LineNr"> 274 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">starting-row-on-screen:offset</span>, row <span id="L275" class="LineNr"> 275 </span> <span class="Comment"># render sandbox contents</span> <span id="L276" class="LineNr"> 276 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L277" class="LineNr"> 277 </span> screen <span class="Special"><-</span> move-cursor screen, row, left +<span id="L277" class="LineNr"> 277 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, left <span id="L278" class="LineNr"> 278 </span> sandbox-data:text <span class="Special"><-</span> get *sandbox, <span class="Constant">data:offset</span> -<span id="L279" class="LineNr"> 279 </span> row, screen <span class="Special"><-</span> render-code screen, sandbox-data, left, right, row +<span id="L279" class="LineNr"> 279 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-code <a href='081print.mu.html#L4'>screen</a>, sandbox-data, left, right, row <span id="L280" class="LineNr"> 280 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">code-ending-row-on-screen:offset</span>, row <span id="L281" class="LineNr"> 281 </span> <span class="Comment"># render sandbox warnings, screen or response, in that order</span> <span id="L282" class="LineNr"> 282 </span> sandbox-response:text <span class="Special"><-</span> get *sandbox, <span class="Constant">response:offset</span> <span id="L283" class="LineNr"> 283 </span><span class="Constant"> <render-sandbox-results></span> <span id="L284" class="LineNr"> 284 </span> <span class="Delimiter">{</span> -<span id="L285" class="LineNr"> 285 </span> sandbox-screen:&:screen <span class="Special"><-</span> get *sandbox, <span class="Constant">screen:offset</span> -<span id="L286" class="LineNr"> 286 </span> empty-screen?:bool <span class="Special"><-</span> fake-screen-is-empty? sandbox-screen +<span id="L285" class="LineNr"> 285 </span> sandbox-screen:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> get *sandbox, <span class="Constant"><a href='081print.mu.html#L4'>screen</a>:offset</span> +<span id="L286" class="LineNr"> 286 </span> empty-screen?:bool <span class="Special"><-</span> <a href='081print.mu.html#L60'>fake-screen-is-empty?</a> sandbox-screen <span id="L287" class="LineNr"> 287 </span> <span class="muControl">break-if</span> empty-screen? -<span id="L288" class="LineNr"> 288 </span> row, screen <span class="Special"><-</span> render-screen screen, sandbox-screen, left, right, row +<span id="L288" class="LineNr"> 288 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-screen <a href='081print.mu.html#L4'>screen</a>, sandbox-screen, left, right, row <span id="L289" class="LineNr"> 289 </span> <span class="Delimiter">}</span> <span id="L290" class="LineNr"> 290 </span> <span class="Delimiter">{</span> <span id="L291" class="LineNr"> 291 </span> <span class="muControl">break-unless</span> empty-screen? <span id="L292" class="LineNr"> 292 </span><span class="Constant"> <render-sandbox-response></span> -<span id="L293" class="LineNr"> 293 </span> row, screen <span class="Special"><-</span> render-text screen, sandbox-response, left, right, <span class="Constant">245/grey</span>, row +<span id="L293" class="LineNr"> 293 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-text <a href='081print.mu.html#L4'>screen</a>, sandbox-response, left, right, <span class="Constant">245/grey</span>, row <span id="L294" class="LineNr"> 294 </span> <span class="Delimiter">}</span> <span id="L295" class="LineNr"> 295 </span><span class="Constant"> +render-sandbox-end</span> -<span id="L296" class="LineNr"> 296 </span> at-bottom?:bool <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L296" class="LineNr"> 296 </span> at-bottom?:bool <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L297" class="LineNr"> 297 </span> <span class="muControl">return-if</span> at-bottom? <span id="L298" class="LineNr"> 298 </span> <span class="Comment"># draw solid line after sandbox</span> -<span id="L299" class="LineNr"> 299 </span> draw-horizontal screen, row, left, right +<span id="L299" class="LineNr"> 299 </span> draw-horizontal <a href='081print.mu.html#L4'>screen</a>, row, left, right <span id="L300" class="LineNr"> 300 </span> <span class="Delimiter">}</span> <span id="L301" class="LineNr"> 301 </span> <span class="Comment"># if hidden, reset row attributes</span> <span id="L302" class="LineNr"> 302 </span> <span class="Delimiter">{</span> @@ -367,29 +367,29 @@ if ('onhashchange' in window) { <span id="L308" class="LineNr"> 308 </span> <span class="Comment"># draw next sandbox</span> <span id="L309" class="LineNr"> 309 </span> next-sandbox:&:sandbox <span class="Special"><-</span> get *sandbox, <span class="Constant">next-sandbox:offset</span> <span id="L310" class="LineNr"> 310 </span> next-idx:num <span class="Special"><-</span> add idx,<span class="Constant"> 1</span> -<span id="L311" class="LineNr"> 311 </span> row, screen <span class="Special"><-</span> render-sandboxes screen, next-sandbox, left, right, row, render-from, next-idx +<span id="L311" class="LineNr"> 311 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandboxes <a href='081print.mu.html#L4'>screen</a>, next-sandbox, left, right, row, render-from, next-idx <span id="L312" class="LineNr"> 312 </span>] <span id="L313" class="LineNr"> 313 </span> -<span id="L314" class="LineNr"> 314 </span><span class="muRecipe">def</span> render-sandbox-menu screen:&:screen, sandbox-index:num, left:num, right:num<span class="muRecipe"> -> </span>screen:&:screen [ +<span id="L314" class="LineNr"> 314 </span><span class="muRecipe">def</span> render-sandbox-menu <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, sandbox-index:num, left:num, right:num<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L315" class="LineNr"> 315 </span> <span class="Constant">local-scope</span> <span id="L316" class="LineNr"> 316 </span> <span class="Constant">load-ingredients</span> -<span id="L317" class="LineNr"> 317 </span> move-cursor-to-column screen, left +<span id="L317" class="LineNr"> 317 </span> <a href='081print.mu.html#L574'>move-cursor-to-column</a> <a href='081print.mu.html#L4'>screen</a>, left <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"><-</span> sandbox-menu-columns left, right -<span id="L319" class="LineNr"> 319 </span> print screen, sandbox-index, <span class="Constant">232/dark-grey</span>, <span class="Constant">245/grey</span> +<span id="L319" class="LineNr"> 319 </span> print <a href='081print.mu.html#L4'>screen</a>, sandbox-index, <span class="Constant">232/dark-grey</span>, <span class="Constant">245/grey</span> <span id="L320" class="LineNr"> 320 </span> start-buttons:num <span class="Special"><-</span> subtract edit-button-left,<span class="Constant"> 1</span> -<span id="L321" class="LineNr"> 321 </span> clear-line-until screen, start-buttons, <span class="Constant">245/grey</span> -<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> -<span id="L323" class="LineNr"> 323 </span> clear-line-until screen, edit-button-right, <span class="Constant">94/background-orange</span> -<span id="L324" class="LineNr"> 324 </span> _, col:num <span class="Special"><-</span> cursor-position screen +<span id="L321" class="LineNr"> 321 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, start-buttons, <span class="Constant">245/grey</span> +<span id="L322" class="LineNr"> 322 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[edit]</span>, <span class="Constant">232/black</span>, <span class="Constant">94/background-orange</span> +<span id="L323" class="LineNr"> 323 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, edit-button-right, <span class="Constant">94/background-orange</span> +<span id="L324" class="LineNr"> 324 </span> _, col:num <span class="Special"><-</span> <a href='081print.mu.html#L428'>cursor-position</a> <a href='081print.mu.html#L4'>screen</a> <span id="L325" class="LineNr"> 325 </span> at-start-of-copy-button?:bool <span class="Special"><-</span> equal col, copy-button-left <span id="L326" class="LineNr"> 326 </span> assert at-start-of-copy-button?, <span class="Constant">[aaa]</span> -<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> -<span id="L328" class="LineNr"> 328 </span> clear-line-until screen, copy-button-right, <span class="Constant">58/background-green</span> -<span id="L329" class="LineNr"> 329 </span> _, col:num <span class="Special"><-</span> cursor-position screen +<span id="L327" class="LineNr"> 327 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[copy]</span>, <span class="Constant">232/black</span>, <span class="Constant">58/background-green</span> +<span id="L328" class="LineNr"> 328 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, copy-button-right, <span class="Constant">58/background-green</span> +<span id="L329" class="LineNr"> 329 </span> _, col:num <span class="Special"><-</span> <a href='081print.mu.html#L428'>cursor-position</a> <a href='081print.mu.html#L4'>screen</a> <span id="L330" class="LineNr"> 330 </span> at-start-of-delete-button?:bool <span class="Special"><-</span> equal col, delete-button-left <span id="L331" class="LineNr"> 331 </span> assert at-start-of-delete-button?, <span class="Constant">[bbb]</span> -<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> -<span id="L333" class="LineNr"> 333 </span> clear-line-until screen, right, <span class="Constant">52/background-red</span> +<span id="L332" class="LineNr"> 332 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[delete]</span>, <span class="Constant">232/black</span>, <span class="Constant">52/background-red</span> +<span id="L333" class="LineNr"> 333 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right, <span class="Constant">52/background-red</span> <span id="L334" class="LineNr"> 334 </span>] <span id="L335" class="LineNr"> 335 </span> <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> @@ -412,20 +412,20 @@ if ('onhashchange' in window) { <span id="L353" class="LineNr"> 353 </span> <span id="L354" class="LineNr"> 354 </span><span class="Comment"># print a text 's' to 'editor' in 'color' starting at 'row'</span> <span id="L355" class="LineNr"> 355 </span><span class="Comment"># clear rest of last line, move cursor to next line</span> -<span id="L356" class="LineNr"> 356 </span><span class="muRecipe">def</span> render-text screen:&:screen, s:text, left:num, right:num, color:num, row:num<span class="muRecipe"> -> </span>row:num, screen:&:screen [ +<span id="L356" class="LineNr"> 356 </span><span class="muRecipe">def</span> render-text <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, s:text, left:num, right:num, color:num, row:num<span class="muRecipe"> -> </span>row:num, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L357" class="LineNr"> 357 </span> <span class="Constant">local-scope</span> <span id="L358" class="LineNr"> 358 </span> <span class="Constant">load-ingredients</span> <span id="L359" class="LineNr"> 359 </span> <span class="muControl">return-unless</span> s <span id="L360" class="LineNr"> 360 </span> column:num <span class="Special"><-</span> copy left -<span id="L361" class="LineNr"> 361 </span> screen <span class="Special"><-</span> move-cursor screen, row, column -<span id="L362" class="LineNr"> 362 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L361" class="LineNr"> 361 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column +<span id="L362" class="LineNr"> 362 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L363" class="LineNr"> 363 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L364" class="LineNr"> 364 </span> len:num <span class="Special"><-</span> length *s <span id="L365" class="LineNr"> 365 </span> <span class="Delimiter">{</span> <span id="L366" class="LineNr"> 366 </span><span class="Constant"> +next-character</span> <span id="L367" class="LineNr"> 367 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L368" class="LineNr"> 368 </span> <span class="muControl">break-if</span> done? -<span id="L369" class="LineNr"> 369 </span> done? <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L369" class="LineNr"> 369 </span> done? <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L370" class="LineNr"> 370 </span> <span class="muControl">break-if</span> done? <span id="L371" class="LineNr"> 371 </span> c:char <span class="Special"><-</span> index *s, i <span id="L372" class="LineNr"> 372 </span> <span class="Delimiter">{</span> @@ -434,10 +434,10 @@ if ('onhashchange' in window) { <span id="L375" class="LineNr"> 375 </span> <span class="muControl">break-unless</span> at-right? <span id="L376" class="LineNr"> 376 </span> <span class="Comment"># print wrap icon</span> <span id="L377" class="LineNr"> 377 </span> wrap-icon:char <span class="Special"><-</span> copy <span class="Constant">8617/loop-back-to-left</span> -<span id="L378" class="LineNr"> 378 </span> print screen, wrap-icon, <span class="Constant">245/grey</span> +<span id="L378" class="LineNr"> 378 </span> print <a href='081print.mu.html#L4'>screen</a>, wrap-icon, <span class="Constant">245/grey</span> <span id="L379" class="LineNr"> 379 </span> column <span class="Special"><-</span> copy left <span id="L380" class="LineNr"> 380 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> -<span id="L381" class="LineNr"> 381 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L381" class="LineNr"> 381 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L382" class="LineNr"> 382 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span class="Comment"># retry i</span> <span id="L383" class="LineNr"> 383 </span> <span class="Delimiter">}</span> <span id="L384" class="LineNr"> 384 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> @@ -450,39 +450,39 @@ if ('onhashchange' in window) { <span id="L391" class="LineNr"> 391 </span> done?:bool <span class="Special"><-</span> greater-than column, right <span id="L392" class="LineNr"> 392 </span> <span class="muControl">break-if</span> done? <span id="L393" class="LineNr"> 393 </span> space:char <span class="Special"><-</span> copy <span class="Constant">32/space</span> -<span id="L394" class="LineNr"> 394 </span> print screen, space +<span id="L394" class="LineNr"> 394 </span> print <a href='081print.mu.html#L4'>screen</a>, space <span id="L395" class="LineNr"> 395 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L396" class="LineNr"> 396 </span> <span class="muControl">loop</span> <span id="L397" class="LineNr"> 397 </span> <span class="Delimiter">}</span> <span id="L398" class="LineNr"> 398 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L399" class="LineNr"> 399 </span> column <span class="Special"><-</span> copy left -<span id="L400" class="LineNr"> 400 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L400" class="LineNr"> 400 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L401" class="LineNr"> 401 </span> <span class="muControl">loop</span> <span class="Constant">+next-character</span> <span id="L402" class="LineNr"> 402 </span> <span class="Delimiter">}</span> -<span id="L403" class="LineNr"> 403 </span> print screen, c, color +<span id="L403" class="LineNr"> 403 </span> print <a href='081print.mu.html#L4'>screen</a>, c, color <span id="L404" class="LineNr"> 404 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L405" class="LineNr"> 405 </span> <span class="muControl">loop</span> <span id="L406" class="LineNr"> 406 </span> <span class="Delimiter">}</span> <span id="L407" class="LineNr"> 407 </span> was-at-left?:bool <span class="Special"><-</span> equal column, left -<span id="L408" class="LineNr"> 408 </span> clear-line-until screen, right +<span id="L408" class="LineNr"> 408 </span> <a href='081print.mu.html#L408'>clear-line-until</a> <a href='081print.mu.html#L4'>screen</a>, right <span id="L409" class="LineNr"> 409 </span> <span class="Delimiter">{</span> <span id="L410" class="LineNr"> 410 </span> <span class="muControl">break-if</span> was-at-left? <span id="L411" class="LineNr"> 411 </span> row <span class="Special"><-</span> add row,<span class="Constant"> 1</span> <span id="L412" class="LineNr"> 412 </span> <span class="Delimiter">}</span> -<span id="L413" class="LineNr"> 413 </span> move-cursor screen, row, left +<span id="L413" class="LineNr"> 413 </span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, left <span id="L414" class="LineNr"> 414 </span>] <span id="L415" class="LineNr"> 415 </span> <span id="L416" class="LineNr"> 416 </span><span class="Comment"># assumes programming environment has no sandboxes; restores them from previous session</span> -<span id="L417" class="LineNr"> 417 </span><span class="muRecipe">def</span> restore-sandboxes env:&:environment, resources:&:resources<span class="muRecipe"> -> </span>env:&:environment [ +<span id="L417" class="LineNr"> 417 </span><span class="muRecipe">def</span> restore-sandboxes env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a><span class="muRecipe"> -> </span>env:&:environment [ <span id="L418" class="LineNr"> 418 </span> <span class="Constant">local-scope</span> <span id="L419" class="LineNr"> 419 </span> <span class="Constant">load-ingredients</span> <span id="L420" class="LineNr"> 420 </span> <span class="Comment"># read all scenarios, pushing them to end of a list of scenarios</span> <span id="L421" class="LineNr"> 421 </span> idx:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L422" class="LineNr"> 422 </span> curr:&:sandbox <span class="Special"><-</span> copy<span class="Constant"> 0</span> -<span id="L423" class="LineNr"> 423 </span> prev:&:sandbox <span class="Special"><-</span> copy<span class="Constant"> 0</span> +<span id="L423" class="LineNr"> 423 </span> <a href='065duplex_list.mu.html#L36'>prev</a>:&:sandbox <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L424" class="LineNr"> 424 </span> <span class="Delimiter">{</span> <span id="L425" class="LineNr"> 425 </span> filename:text <span class="Special"><-</span> append <span class="Constant">[lesson/]</span>, idx -<span id="L426" class="LineNr"> 426 </span> contents:text <span class="Special"><-</span> slurp resources, filename +<span id="L426" class="LineNr"> 426 </span> contents:text <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, filename <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> <span id="L428" class="LineNr"> 428 </span> <span class="Comment"># todo: handle empty sandbox</span> <span id="L429" class="LineNr"> 429 </span> <span class="Comment"># create new sandbox for file</span> @@ -498,7 +498,7 @@ if ('onhashchange' in window) { <span id="L439" class="LineNr"> 439 </span> *prev <span class="Special"><-</span> put *prev, <span class="Constant">next-sandbox:offset</span>, curr <span id="L440" class="LineNr"> 440 </span> <span class="Delimiter">}</span> <span id="L441" class="LineNr"> 441 </span> idx <span class="Special"><-</span> add idx,<span class="Constant"> 1</span> -<span id="L442" class="LineNr"> 442 </span> prev <span class="Special"><-</span> copy curr +<span id="L442" class="LineNr"> 442 </span> <a href='065duplex_list.mu.html#L36'>prev</a> <span class="Special"><-</span> copy curr <span id="L443" class="LineNr"> 443 </span> <span class="muControl">loop</span> <span id="L444" class="LineNr"> 444 </span> <span class="Delimiter">}</span> <span id="L445" class="LineNr"> 445 </span> <span class="Comment"># update sandbox count</span> @@ -507,42 +507,42 @@ if ('onhashchange' in window) { <span id="L448" class="LineNr"> 448 </span> <span id="L449" class="LineNr"> 449 </span><span class="Comment"># print the fake sandbox screen to 'screen' with appropriate delimiters</span> <span id="L450" class="LineNr"> 450 </span><span class="Comment"># leave cursor at start of next line</span> -<span id="L451" class="LineNr"> 451 </span><span class="muRecipe">def</span> render-screen screen:&:screen, sandbox-screen:&:screen, left:num, right:num, row:num<span class="muRecipe"> -> </span>row:num, screen:&:screen [ +<span id="L451" class="LineNr"> 451 </span><span class="muRecipe">def</span> render-screen <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, sandbox-screen:&:<a href='081print.mu.html#L4'>screen</a>, left:num, right:num, row:num<span class="muRecipe"> -> </span>row:num, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L452" class="LineNr"> 452 </span> <span class="Constant">local-scope</span> <span id="L453" class="LineNr"> 453 </span> <span class="Constant">load-ingredients</span> <span id="L454" class="LineNr"> 454 </span> <span class="muControl">return-unless</span> sandbox-screen <span id="L455" class="LineNr"> 455 </span> <span class="Comment"># print 'screen:'</span> -<span id="L456" class="LineNr"> 456 </span> row <span class="Special"><-</span> render-text screen, <span class="Constant">[screen:]</span>, left, right, <span class="Constant">245/grey</span>, row -<span id="L457" class="LineNr"> 457 </span> screen <span class="Special"><-</span> move-cursor screen, row, left +<span id="L456" class="LineNr"> 456 </span> row <span class="Special"><-</span> render-text <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[screen:]</span>, left, right, <span class="Constant">245/grey</span>, row +<span id="L457" class="LineNr"> 457 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, left <span id="L458" class="LineNr"> 458 </span> <span class="Comment"># start printing sandbox-screen</span> <span id="L459" class="LineNr"> 459 </span> column:num <span class="Special"><-</span> copy left -<span id="L460" class="LineNr"> 460 </span> s-width:num <span class="Special"><-</span> screen-width sandbox-screen -<span id="L461" class="LineNr"> 461 </span> s-height:num <span class="Special"><-</span> screen-height sandbox-screen -<span id="L462" class="LineNr"> 462 </span> buf:&:@:screen-cell <span class="Special"><-</span> get *sandbox-screen, <span class="Constant">data:offset</span> +<span id="L460" class="LineNr"> 460 </span> s-width:num <span class="Special"><-</span> <a href='081print.mu.html#L581'>screen-width</a> sandbox-screen +<span id="L461" class="LineNr"> 461 </span> s-height:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> sandbox-screen +<span id="L462" class="LineNr"> 462 </span> buf:&:@:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> get *sandbox-screen, <span class="Constant">data:offset</span> <span id="L463" class="LineNr"> 463 </span> stop-printing:num <span class="Special"><-</span> add left, s-width,<span class="Constant"> 3</span> <span id="L464" class="LineNr"> 464 </span> max-column:num <span class="Special"><-</span> min stop-printing, right <span id="L465" class="LineNr"> 465 </span> i:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L466" class="LineNr"> 466 </span> len:num <span class="Special"><-</span> length *buf -<span id="L467" class="LineNr"> 467 </span> screen-height:num <span class="Special"><-</span> screen-height screen +<span id="L467" class="LineNr"> 467 </span> <a href='081print.mu.html#L594'>screen-height</a>:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L468" class="LineNr"> 468 </span> <span class="Delimiter">{</span> <span id="L469" class="LineNr"> 469 </span> done?:bool <span class="Special"><-</span> greater-or-equal i, len <span id="L470" class="LineNr"> 470 </span> <span class="muControl">break-if</span> done? -<span id="L471" class="LineNr"> 471 </span> done? <span class="Special"><-</span> greater-or-equal row, screen-height +<span id="L471" class="LineNr"> 471 </span> done? <span class="Special"><-</span> greater-or-equal row, <a href='081print.mu.html#L594'>screen-height</a> <span id="L472" class="LineNr"> 472 </span> <span class="muControl">break-if</span> done? <span id="L473" class="LineNr"> 473 </span> column <span class="Special"><-</span> copy left -<span id="L474" class="LineNr"> 474 </span> screen <span class="Special"><-</span> move-cursor screen, row, column +<span id="L474" class="LineNr"> 474 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, row, column <span id="L475" class="LineNr"> 475 </span> <span class="Comment"># initial leader for each row: two spaces and a '.'</span> <span id="L476" class="LineNr"> 476 </span> space:char <span class="Special"><-</span> copy <span class="Constant">32/space</span> -<span id="L477" class="LineNr"> 477 </span> print screen, space, <span class="Constant">245/grey</span> -<span id="L478" class="LineNr"> 478 </span> print screen, space, <span class="Constant">245/grey</span> +<span id="L477" class="LineNr"> 477 </span> print <a href='081print.mu.html#L4'>screen</a>, space, <span class="Constant">245/grey</span> +<span id="L478" class="LineNr"> 478 </span> print <a href='081print.mu.html#L4'>screen</a>, space, <span class="Constant">245/grey</span> <span id="L479" class="LineNr"> 479 </span> full-stop:char <span class="Special"><-</span> copy <span class="Constant">46/period</span> -<span id="L480" class="LineNr"> 480 </span> print screen, full-stop, <span class="Constant">245/grey</span> +<span id="L480" class="LineNr"> 480 </span> print <a href='081print.mu.html#L4'>screen</a>, full-stop, <span class="Constant">245/grey</span> <span id="L481" class="LineNr"> 481 </span> column <span class="Special"><-</span> add left,<span class="Constant"> 3</span> <span id="L482" class="LineNr"> 482 </span> <span class="Delimiter">{</span> <span id="L483" class="LineNr"> 483 </span> <span class="Comment"># print row</span> <span id="L484" class="LineNr"> 484 </span> row-done?:bool <span class="Special"><-</span> greater-or-equal column, max-column <span id="L485" class="LineNr"> 485 </span> <span class="muControl">break-if</span> row-done? -<span id="L486" class="LineNr"> 486 </span> curr:screen-cell <span class="Special"><-</span> index *buf, i +<span id="L486" class="LineNr"> 486 </span> curr:<a href='081print.mu.html#L12'>screen-cell</a> <span class="Special"><-</span> index *buf, i <span id="L487" class="LineNr"> 487 </span> c:char <span class="Special"><-</span> get curr, <span class="Constant">contents:offset</span> <span id="L488" class="LineNr"> 488 </span> color:num <span class="Special"><-</span> get curr, <span class="Constant">color:offset</span> <span id="L489" class="LineNr"> 489 </span> <span class="Delimiter">{</span> @@ -551,19 +551,19 @@ if ('onhashchange' in window) { <span id="L492" class="LineNr"> 492 </span> <span class="muControl">break-unless</span> white? <span id="L493" class="LineNr"> 493 </span> color <span class="Special"><-</span> copy <span class="Constant">245/grey</span> <span id="L494" class="LineNr"> 494 </span> <span class="Delimiter">}</span> -<span id="L495" class="LineNr"> 495 </span> print screen, c, color +<span id="L495" class="LineNr"> 495 </span> print <a href='081print.mu.html#L4'>screen</a>, c, color <span id="L496" class="LineNr"> 496 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L497" class="LineNr"> 497 </span> i <span class="Special"><-</span> add i,<span class="Constant"> 1</span> <span id="L498" class="LineNr"> 498 </span> <span class="muControl">loop</span> <span id="L499" class="LineNr"> 499 </span> <span class="Delimiter">}</span> <span id="L500" class="LineNr"> 500 </span> <span class="Comment"># print final '.'</span> -<span id="L501" class="LineNr"> 501 </span> print screen, full-stop, <span class="Constant">245/grey</span> +<span id="L501" class="LineNr"> 501 </span> print <a href='081print.mu.html#L4'>screen</a>, full-stop, <span class="Constant">245/grey</span> <span id="L502" class="LineNr"> 502 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L503" class="LineNr"> 503 </span> <span class="Delimiter">{</span> <span id="L504" class="LineNr"> 504 </span> <span class="Comment"># clear rest of current line</span> <span id="L505" class="LineNr"> 505 </span> line-done?:bool <span class="Special"><-</span> greater-than column, right <span id="L506" class="LineNr"> 506 </span> <span class="muControl">break-if</span> line-done? -<span id="L507" class="LineNr"> 507 </span> print screen, space +<span id="L507" class="LineNr"> 507 </span> print <a href='081print.mu.html#L4'>screen</a>, space <span id="L508" class="LineNr"> 508 </span> column <span class="Special"><-</span> add column,<span class="Constant"> 1</span> <span id="L509" class="LineNr"> 509 </span> <span class="muControl">loop</span> <span id="L510" class="LineNr"> 510 </span> <span class="Delimiter">}</span> @@ -588,12 +588,12 @@ if ('onhashchange' in window) { <span id="L529" class="LineNr"> 529 </span> ] <span id="L530" class="LineNr"> 530 </span> ] <span id="L531" class="LineNr"> 531 </span> <span class="Comment"># sandbox editor contains an instruction without storing outputs</span> -<span id="L532" class="LineNr"> 532 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> <span class="Comment"># contents of sandbox editor</span> +<span id="L532" class="LineNr"> 532 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span class="Comment"># contents of sandbox editor</span> <span id="L533" class="LineNr"> 533 </span> <span class="Comment"># run the code in the editors</span> <span id="L534" class="LineNr"> 534 </span> assume-console [ <span id="L535" class="LineNr"> 535 </span> press F4 <span id="L536" class="LineNr"> 536 </span> ] -<span id="L537" class="LineNr"> 537 </span> event-loop screen, console, env, resources +<span id="L537" class="LineNr"> 537 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L538" class="LineNr"> 538 </span> screen-should-contain [ <span id="L539" class="LineNr"> 539 </span> <span class="Constant"> . run (F4) .</span> <span id="L540" class="LineNr"> 540 </span> <span class="Constant"> . ╎ .</span> @@ -614,7 +614,7 @@ if ('onhashchange' in window) { <span id="L555" class="LineNr"> 555 </span> press F4 <span id="L556" class="LineNr"> 556 </span> ] <span id="L557" class="LineNr"> 557 </span> run [ -<span id="L558" class="LineNr"> 558 </span> event-loop screen, console, env, resources +<span id="L558" class="LineNr"> 558 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L559" class="LineNr"> 559 </span> ] <span id="L560" class="LineNr"> 560 </span> <span class="Comment"># check that screen updates the result on the right</span> <span id="L561" class="LineNr"> 561 </span> screen-should-contain [ @@ -639,13 +639,13 @@ if ('onhashchange' in window) { <span id="L580" class="LineNr"> 580 </span> assume-resources [ <span id="L581" class="LineNr"> 581 </span> ] <span id="L582" class="LineNr"> 582 </span> <span class="Comment"># sandbox editor contains an instruction</span> -<span id="L583" class="LineNr"> 583 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[print-integer screen, 4]</span> <span class="Comment"># contents of sandbox editor</span> +<span id="L583" class="LineNr"> 583 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[print-integer <a href='081print.mu.html#L4'>screen</a>, 4]</span> <span class="Comment"># contents of sandbox editor</span> <span id="L584" class="LineNr"> 584 </span> <span class="Comment"># run the code in the editor</span> <span id="L585" class="LineNr"> 585 </span> assume-console [ <span id="L586" class="LineNr"> 586 </span> press F4 <span id="L587" class="LineNr"> 587 </span> ] <span id="L588" class="LineNr"> 588 </span> run [ -<span id="L589" class="LineNr"> 589 </span> event-loop screen, console, env, resources +<span id="L589" class="LineNr"> 589 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L590" class="LineNr"> 590 </span> ] <span id="L591" class="LineNr"> 591 </span> <span class="Comment"># check that it prints a little toy screen</span> <span id="L592" class="LineNr"> 592 </span> screen-should-contain [ @@ -653,7 +653,7 @@ if ('onhashchange' in window) { <span id="L594" class="LineNr"> 594 </span> <span class="Constant"> . ╎ .</span> <span id="L595" class="LineNr"> 595 </span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span> <span id="L596" class="LineNr"> 596 </span> <span class="Constant"> . ╎0 edit copy delete .</span> -<span id="L597" class="LineNr"> 597 </span> <span class="Constant"> . ╎print-integer screen, 4 .</span> +<span id="L597" class="LineNr"> 597 </span> <span class="Constant"> . ╎print-integer <a href='081print.mu.html#L4'>screen</a>, 4 .</span> <span id="L598" class="LineNr"> 598 </span> <span class="Constant"> . ╎screen: .</span> <span id="L599" class="LineNr"> 599 </span> <span class="Constant"> . ╎ .4 . .</span> <span id="L600" class="LineNr"> 600 </span> <span class="Constant"> . ╎ . . .</span> @@ -668,20 +668,20 @@ if ('onhashchange' in window) { <span id="L609" class="LineNr"> 609 </span><span class="muRecipe">def</span> editor-contents editor:&:editor<span class="muRecipe"> -> </span>result:text [ <span id="L610" class="LineNr"> 610 </span> <span class="Constant">local-scope</span> <span id="L611" class="LineNr"> 611 </span> <span class="Constant">load-ingredients</span> -<span id="L612" class="LineNr"> 612 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 80</span> +<span id="L612" class="LineNr"> 612 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 80</span> <span id="L613" class="LineNr"> 613 </span> curr:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">data:offset</span> <span id="L614" class="LineNr"> 614 </span> <span class="Comment"># skip § sentinel</span> <span id="L615" class="LineNr"> 615 </span> assert curr, <span class="Constant">[editor without data is illegal; must have at least a sentinel]</span> -<span id="L616" class="LineNr"> 616 </span> curr <span class="Special"><-</span> next curr +<span id="L616" class="LineNr"> 616 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L617" class="LineNr"> 617 </span> <span class="muControl">return-unless</span> curr,<span class="Constant"> 0</span> <span id="L618" class="LineNr"> 618 </span> <span class="Delimiter">{</span> <span id="L619" class="LineNr"> 619 </span> <span class="muControl">break-unless</span> curr <span id="L620" class="LineNr"> 620 </span> c:char <span class="Special"><-</span> get *curr, <span class="Constant">value:offset</span> <span id="L621" class="LineNr"> 621 </span> buf <span class="Special"><-</span> append buf, c -<span id="L622" class="LineNr"> 622 </span> curr <span class="Special"><-</span> next curr +<span id="L622" class="LineNr"> 622 </span> curr <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> curr <span id="L623" class="LineNr"> 623 </span> <span class="muControl">loop</span> <span id="L624" class="LineNr"> 624 </span> <span class="Delimiter">}</span> -<span id="L625" class="LineNr"> 625 </span> result <span class="Special"><-</span> buffer-to-array buf +<span id="L625" class="LineNr"> 625 </span> result <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L626" class="LineNr"> 626 </span>] <span id="L627" class="LineNr"> 627 </span> <span id="L628" class="LineNr"> 628 </span><span class="muScenario">scenario</span> editor-provides-edited-contents [ @@ -693,7 +693,7 @@ if ('onhashchange' in window) { <span id="L634" class="LineNr"> 634 </span> type <span class="Constant">[def]</span> <span id="L635" class="LineNr"> 635 </span> ] <span id="L636" class="LineNr"> 636 </span> run [ -<span id="L637" class="LineNr"> 637 </span> editor-event-loop screen, console, e +<span id="L637" class="LineNr"> 637 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L638" class="LineNr"> 638 </span> s:text <span class="Special"><-</span> editor-contents e <span id="L639" class="LineNr"> 639 </span> 1:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s <span id="L640" class="LineNr"> 640 </span> ] @@ -710,13 +710,13 @@ if ('onhashchange' in window) { <span id="L651" class="LineNr"> 651 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span> <span id="L652" class="LineNr"> 652 </span> assume-resources [ <span id="L653" class="LineNr"> 653 </span> ] -<span id="L654" class="LineNr"> 654 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L655" class="LineNr"> 655 </span> render-all screen, env, render +<span id="L654" class="LineNr"> 654 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L655" class="LineNr"> 655 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L656" class="LineNr"> 656 </span> assume-console [ <span id="L657" class="LineNr"> 657 </span> press enter <span id="L658" class="LineNr"> 658 </span> press down-arrow <span id="L659" class="LineNr"> 659 </span> ] -<span id="L660" class="LineNr"> 660 </span> event-loop screen, console, env, resources +<span id="L660" class="LineNr"> 660 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L661" class="LineNr"> 661 </span> <span class="Comment"># no scroll</span> <span id="L662" class="LineNr"> 662 </span> screen-should-contain [ <span id="L663" class="LineNr"> 663 </span> <span class="Constant"> . run (F4) .</span> @@ -733,16 +733,16 @@ if ('onhashchange' in window) { <span id="L674" class="LineNr"> 674 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span> <span id="L675" class="LineNr"> 675 </span> assume-resources [ <span id="L676" class="LineNr"> 676 </span> ] -<span id="L677" class="LineNr"> 677 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L678" class="LineNr"> 678 </span> render-all screen, env, render +<span id="L677" class="LineNr"> 677 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L678" class="LineNr"> 678 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L679" class="LineNr"> 679 </span> assume-console [ <span id="L680" class="LineNr"> 680 </span> press enter <span id="L681" class="LineNr"> 681 </span> press up-arrow <span id="L682" class="LineNr"> 682 </span> press down-arrow <span class="Comment"># while cursor isn't at bottom</span> <span id="L683" class="LineNr"> 683 </span> ] -<span id="L684" class="LineNr"> 684 </span> event-loop screen, console, env, resources +<span id="L684" class="LineNr"> 684 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L685" class="LineNr"> 685 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L686" class="LineNr"> 686 </span> print screen, cursor +<span id="L686" class="LineNr"> 686 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L687" class="LineNr"> 687 </span> <span class="Comment"># cursor moves back to bottom</span> <span id="L688" class="LineNr"> 688 </span> screen-should-contain [ <span id="L689" class="LineNr"> 689 </span> <span class="Constant"> . run (F4) .</span> @@ -774,7 +774,7 @@ if ('onhashchange' in window) { <span id="L715" class="LineNr"> 715 </span> recipe-editor-bottom:num <span class="Special"><-</span> get *recipe-editor, <span class="Constant">bottom:offset</span> <span id="L716" class="LineNr"> 716 </span> at-bottom-of-editor?:bool <span class="Special"><-</span> greater-or-equal recipe-cursor-row, recipe-editor-bottom <span id="L717" class="LineNr"> 717 </span> <span class="muControl">break-unless</span> at-bottom-of-editor? -<span id="L718" class="LineNr"> 718 </span> more-to-scroll?:bool <span class="Special"><-</span> more-to-scroll? env, screen +<span id="L718" class="LineNr"> 718 </span> more-to-scroll?:bool <span class="Special"><-</span> more-to-scroll? env, <a href='081print.mu.html#L4'>screen</a> <span id="L719" class="LineNr"> 719 </span> <span class="muControl">break-if</span> more-to-scroll? <span id="L720" class="LineNr"> 720 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L721" class="LineNr"> 721 </span> <span class="Delimiter">}</span> @@ -782,7 +782,7 @@ if ('onhashchange' in window) { <span id="L723" class="LineNr"> 723 </span> <span class="muControl">break-if</span> sandbox-in-focus? <span id="L724" class="LineNr"> 724 </span> page-down?:bool <span class="Special"><-</span> equal k, <span class="Constant">65518/page-down</span> <span id="L725" class="LineNr"> 725 </span> <span class="muControl">break-unless</span> page-down? -<span id="L726" class="LineNr"> 726 </span> more-to-scroll?:bool <span class="Special"><-</span> more-to-scroll? env, screen +<span id="L726" class="LineNr"> 726 </span> more-to-scroll?:bool <span class="Special"><-</span> more-to-scroll? env, <a href='081print.mu.html#L4'>screen</a> <span id="L727" class="LineNr"> 727 </span> <span class="muControl">break-if</span> more-to-scroll? <span id="L728" class="LineNr"> 728 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L729" class="LineNr"> 729 </span> <span class="Delimiter">}</span> @@ -793,17 +793,17 @@ if ('onhashchange' in window) { <span id="L734" class="LineNr"> 734 </span> <span class="muControl">break-if</span> sandbox-in-focus? <span id="L735" class="LineNr"> 735 </span> page-down?:bool <span class="Special"><-</span> equal k, <span class="Constant">6/ctrl-f</span> <span id="L736" class="LineNr"> 736 </span> <span class="muControl">break-unless</span> page-down? -<span id="L737" class="LineNr"> 737 </span> more-to-scroll?:bool <span class="Special"><-</span> more-to-scroll? env, screen +<span id="L737" class="LineNr"> 737 </span> more-to-scroll?:bool <span class="Special"><-</span> more-to-scroll? env, <a href='081print.mu.html#L4'>screen</a> <span id="L738" class="LineNr"> 738 </span> <span class="muControl">break-if</span> more-to-scroll? <span id="L739" class="LineNr"> 739 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L740" class="LineNr"> 740 </span> <span class="Delimiter">}</span> <span id="L741" class="LineNr"> 741 </span>] <span id="L742" class="LineNr"> 742 </span> -<span id="L743" class="LineNr"> 743 </span><span class="muRecipe">def</span> more-to-scroll? env:&:environment, screen:&:screen<span class="muRecipe"> -> </span>result:bool [ +<span id="L743" class="LineNr"> 743 </span><span class="muRecipe">def</span> more-to-scroll? env:&:environment, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:bool [ <span id="L744" class="LineNr"> 744 </span> <span class="Constant">local-scope</span> <span id="L745" class="LineNr"> 745 </span> <span class="Constant">load-ingredients</span> <span id="L746" class="LineNr"> 746 </span> recipe-bottom:num <span class="Special"><-</span> get *env, <span class="Constant">recipe-bottom:offset</span> -<span id="L747" class="LineNr"> 747 </span> height:num <span class="Special"><-</span> screen-height screen +<span id="L747" class="LineNr"> 747 </span> height:num <span class="Special"><-</span> <a href='081print.mu.html#L594'>screen-height</a> <a href='081print.mu.html#L4'>screen</a> <span id="L748" class="LineNr"> 748 </span> result <span class="Special"><-</span> greater-or-equal recipe-bottom, height <span id="L749" class="LineNr"> 749 </span>] <span id="L750" class="LineNr"> 750 </span> @@ -813,8 +813,8 @@ if ('onhashchange' in window) { <span id="L754" class="LineNr"> 754 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span> <span id="L755" class="LineNr"> 755 </span> assume-resources [ <span id="L756" class="LineNr"> 756 </span> ] -<span id="L757" class="LineNr"> 757 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L758" class="LineNr"> 758 </span> render-all screen, env, render +<span id="L757" class="LineNr"> 757 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L758" class="LineNr"> 758 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L759" class="LineNr"> 759 </span> assume-console [ <span id="L760" class="LineNr"> 760 </span> <span class="Comment"># add a line</span> <span id="L761" class="LineNr"> 761 </span> press enter @@ -823,7 +823,7 @@ if ('onhashchange' in window) { <span id="L764" class="LineNr"> 764 </span> <span class="Comment"># try to scroll</span> <span id="L765" class="LineNr"> 765 </span> press page-down <span class="Comment"># or ctrl-f</span> <span id="L766" class="LineNr"> 766 </span> ] -<span id="L767" class="LineNr"> 767 </span> event-loop screen, console, env, resources +<span id="L767" class="LineNr"> 767 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L768" class="LineNr"> 768 </span> <span class="Comment"># no scroll, and cursor remains at top line</span> <span id="L769" class="LineNr"> 769 </span> screen-should-contain [ <span id="L770" class="LineNr"> 770 </span> <span class="Constant"> . run (F4) .</span> @@ -840,9 +840,9 @@ if ('onhashchange' in window) { <span id="L781" class="LineNr"> 781 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span> <span id="L782" class="LineNr"> 782 </span> assume-resources [ <span id="L783" class="LineNr"> 783 </span> ] -<span id="L784" class="LineNr"> 784 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[ab</span> +<span id="L784" class="LineNr"> 784 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[ab</span> <span id="L785" class="LineNr"> 785 </span><span class="Constant">cd]</span> -<span id="L786" class="LineNr"> 786 </span> render-all screen, env, render +<span id="L786" class="LineNr"> 786 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L787" class="LineNr"> 787 </span> assume-console [ <span id="L788" class="LineNr"> 788 </span> <span class="Comment"># add a line</span> <span id="L789" class="LineNr"> 789 </span> press enter @@ -851,9 +851,9 @@ if ('onhashchange' in window) { <span id="L792" class="LineNr"> 792 </span> <span class="Comment"># move cursor</span> <span id="L793" class="LineNr"> 793 </span> press down-arrow <span id="L794" class="LineNr"> 794 </span> ] -<span id="L795" class="LineNr"> 795 </span> event-loop screen, console, env, resources +<span id="L795" class="LineNr"> 795 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L796" class="LineNr"> 796 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L797" class="LineNr"> 797 </span> print screen, cursor +<span id="L797" class="LineNr"> 797 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L798" class="LineNr"> 798 </span> <span class="Comment"># no scroll on recipe side, cursor moves on sandbox side</span> <span id="L799" class="LineNr"> 799 </span> screen-should-contain [ <span id="L800" class="LineNr"> 800 </span> <span class="Constant"> . run (F4) .</span> @@ -873,13 +873,13 @@ if ('onhashchange' in window) { <span id="L814" class="LineNr"> 814 </span> <span class="Comment"># initialize</span> <span id="L815" class="LineNr"> 815 </span> assume-resources [ <span id="L816" class="LineNr"> 816 </span> ] -<span id="L817" class="LineNr"> 817 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span> -<span id="L818" class="LineNr"> 818 </span> render-all screen, env, render +<span id="L817" class="LineNr"> 817 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[add 2, 2]</span> +<span id="L818" class="LineNr"> 818 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L819" class="LineNr"> 819 </span> assume-console [ <span id="L820" class="LineNr"> 820 </span> <span class="Comment"># create a sandbox</span> <span id="L821" class="LineNr"> 821 </span> press F4 <span id="L822" class="LineNr"> 822 </span> ] -<span id="L823" class="LineNr"> 823 </span> event-loop screen, console, env, resources +<span id="L823" class="LineNr"> 823 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L824" class="LineNr"> 824 </span> screen-should-contain [ <span id="L825" class="LineNr"> 825 </span> <span class="Constant"> . run (F4) .</span> <span id="L826" class="LineNr"> 826 </span> <span class="Constant"> . ╎ .</span> @@ -893,9 +893,9 @@ if ('onhashchange' in window) { <span id="L834" class="LineNr"> 834 </span> press page-down <span id="L835" class="LineNr"> 835 </span> ] <span id="L836" class="LineNr"> 836 </span> run [ -<span id="L837" class="LineNr"> 837 </span> event-loop screen, console, env, resources +<span id="L837" class="LineNr"> 837 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L838" class="LineNr"> 838 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L839" class="LineNr"> 839 </span> print screen, cursor +<span id="L839" class="LineNr"> 839 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L840" class="LineNr"> 840 </span> ] <span id="L841" class="LineNr"> 841 </span> <span class="Comment"># sandbox editor hidden; first sandbox displayed</span> <span id="L842" class="LineNr"> 842 </span> <span class="Comment"># cursor moves to first sandbox</span> @@ -911,9 +911,9 @@ if ('onhashchange' in window) { <span id="L852" class="LineNr"> 852 </span> press page-up <span id="L853" class="LineNr"> 853 </span> ] <span id="L854" class="LineNr"> 854 </span> run [ -<span id="L855" class="LineNr"> 855 </span> event-loop screen, console, env, resources +<span id="L855" class="LineNr"> 855 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L856" class="LineNr"> 856 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L857" class="LineNr"> 857 </span> print screen, cursor +<span id="L857" class="LineNr"> 857 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L858" class="LineNr"> 858 </span> ] <span id="L859" class="LineNr"> 859 </span> <span class="Comment"># sandbox editor displays again, cursor is in editor</span> <span id="L860" class="LineNr"> 860 </span> screen-should-contain [ @@ -943,9 +943,9 @@ if ('onhashchange' in window) { <span id="L884" class="LineNr"> 884 </span> render-from <span class="Special"><-</span> add render-from,<span class="Constant"> 1</span> <span id="L885" class="LineNr"> 885 </span> *env <span class="Special"><-</span> put *env, <span class="Constant">render-from:offset</span>, render-from <span id="L886" class="LineNr"> 886 </span> <span class="Delimiter">}</span> -<span id="L887" class="LineNr"> 887 </span> hide-screen screen -<span id="L888" class="LineNr"> 888 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render -<span id="L889" class="LineNr"> 889 </span> show-screen screen +<span id="L887" class="LineNr"> 887 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L888" class="LineNr"> 888 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render +<span id="L889" class="LineNr"> 889 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L890" class="LineNr"> 890 </span> <span class="muControl">jump</span> <span class="Constant">+finish-event</span> <span id="L891" class="LineNr"> 891 </span> <span class="Delimiter">}</span> <span id="L892" class="LineNr"> 892 </span>] @@ -958,7 +958,7 @@ if ('onhashchange' in window) { <span id="L899" class="LineNr"> 899 </span> scrolling?:bool <span class="Special"><-</span> greater-or-equal render-from,<span class="Constant"> 0</span> <span id="L900" class="LineNr"> 900 </span> <span class="muControl">break-unless</span> scrolling? <span id="L901" class="LineNr"> 901 </span> cursor-column:num <span class="Special"><-</span> get *current-sandbox, <span class="Constant">left:offset</span> -<span id="L902" class="LineNr"> 902 </span> screen <span class="Special"><-</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 id="L902" class="LineNr"> 902 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L442'>move-cursor</a> <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">2/row</span>, cursor-column <span class="Comment"># highlighted sandbox will always start at row 2</span> <span id="L903" class="LineNr"> 903 </span> <span class="muControl">return</span> <span id="L904" class="LineNr"> 904 </span> <span class="Delimiter">}</span> <span id="L905" class="LineNr"> 905 </span>] @@ -974,9 +974,9 @@ if ('onhashchange' in window) { <span id="L915" class="LineNr"> 915 </span> <span class="muControl">break-if</span> at-beginning? <span id="L916" class="LineNr"> 916 </span> render-from <span class="Special"><-</span> subtract render-from,<span class="Constant"> 1</span> <span id="L917" class="LineNr"> 917 </span> *env <span class="Special"><-</span> put *env, <span class="Constant">render-from:offset</span>, render-from -<span id="L918" class="LineNr"> 918 </span> hide-screen screen -<span id="L919" class="LineNr"> 919 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render -<span id="L920" class="LineNr"> 920 </span> show-screen screen +<span id="L918" class="LineNr"> 918 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L919" class="LineNr"> 919 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render +<span id="L920" class="LineNr"> 920 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L921" class="LineNr"> 921 </span> <span class="muControl">jump</span> <span class="Constant">+finish-event</span> <span id="L922" class="LineNr"> 922 </span> <span class="Delimiter">}</span> <span id="L923" class="LineNr"> 923 </span>] @@ -988,13 +988,13 @@ if ('onhashchange' in window) { <span id="L929" class="LineNr"> 929 </span> <span class="Constant">load-ingredients</span> <span id="L930" class="LineNr"> 930 </span> curr:&:sandbox <span class="Special"><-</span> get *env, <span class="Constant">sandbox:offset</span> <span id="L931" class="LineNr"> 931 </span> <span class="muControl">return-unless</span> curr, <span class="Constant">0/nil</span> -<span id="L932" class="LineNr"> 932 </span> next:&:sandbox <span class="Special"><-</span> get *curr, <span class="Constant">next-sandbox:offset</span> +<span id="L932" class="LineNr"> 932 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:sandbox <span class="Special"><-</span> get *curr, <span class="Constant">next-sandbox:offset</span> <span id="L933" class="LineNr"> 933 </span> <span class="Delimiter">{</span> -<span id="L934" class="LineNr"> 934 </span> <span class="muControl">return-unless</span> next, <span class="Constant">0/nil</span> -<span id="L935" class="LineNr"> 935 </span> found?:bool <span class="Special"><-</span> equal next, in +<span id="L934" class="LineNr"> 934 </span> <span class="muControl">return-unless</span> <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/nil</span> +<span id="L935" class="LineNr"> 935 </span> found?:bool <span class="Special"><-</span> equal <a href='065duplex_list.mu.html#L29'>next</a>, in <span id="L936" class="LineNr"> 936 </span> <span class="muControl">break-if</span> found? -<span id="L937" class="LineNr"> 937 </span> curr <span class="Special"><-</span> copy next -<span id="L938" class="LineNr"> 938 </span> next <span class="Special"><-</span> get *curr, <span class="Constant">next-sandbox:offset</span> +<span id="L937" class="LineNr"> 937 </span> curr <span class="Special"><-</span> copy <a href='065duplex_list.mu.html#L29'>next</a> +<span id="L938" class="LineNr"> 938 </span> <a href='065duplex_list.mu.html#L29'>next</a> <span class="Special"><-</span> get *curr, <span class="Constant">next-sandbox:offset</span> <span id="L939" class="LineNr"> 939 </span> <span class="muControl">loop</span> <span id="L940" class="LineNr"> 940 </span> <span class="Delimiter">}</span> <span id="L941" class="LineNr"> 941 </span> <span class="muControl">return</span> curr @@ -1011,20 +1011,20 @@ if ('onhashchange' in window) { <span id="L952" class="LineNr"> 952 </span> ] <span id="L953" class="LineNr"> 953 </span> ] <span id="L954" class="LineNr"> 954 </span> <span class="Comment"># create a sandbox</span> -<span id="L955" class="LineNr"> 955 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span> -<span id="L956" class="LineNr"> 956 </span> render-all screen, env, render +<span id="L955" class="LineNr"> 955 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[add 2, 2]</span> +<span id="L956" class="LineNr"> 956 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L957" class="LineNr"> 957 </span> assume-console [ <span id="L958" class="LineNr"> 958 </span> press F4 <span id="L959" class="LineNr"> 959 </span> ] -<span id="L960" class="LineNr"> 960 </span> event-loop screen, console, env, resources +<span id="L960" class="LineNr"> 960 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L961" class="LineNr"> 961 </span> <span class="Comment"># hit 'down' in recipe editor</span> <span id="L962" class="LineNr"> 962 </span> assume-console [ <span id="L963" class="LineNr"> 963 </span> press page-down <span id="L964" class="LineNr"> 964 </span> ] <span id="L965" class="LineNr"> 965 </span> run [ -<span id="L966" class="LineNr"> 966 </span> event-loop screen, console, env, resources +<span id="L966" class="LineNr"> 966 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L967" class="LineNr"> 967 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L968" class="LineNr"> 968 </span> print screen, cursor +<span id="L968" class="LineNr"> 968 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L969" class="LineNr"> 969 </span> ] <span id="L970" class="LineNr"> 970 </span> <span class="Comment"># cursor doesn't move when the end is already on-screen</span> <span id="L971" class="LineNr"> 971 </span> screen-should-contain [ @@ -1043,8 +1043,8 @@ if ('onhashchange' in window) { <span id="L984" class="LineNr"> 984 </span> <span class="Comment"># initialize environment</span> <span id="L985" class="LineNr"> 985 </span> assume-resources [ <span id="L986" class="LineNr"> 986 </span> ] -<span id="L987" class="LineNr"> 987 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L988" class="LineNr"> 988 </span> render-all screen, env, render +<span id="L987" class="LineNr"> 987 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L988" class="LineNr"> 988 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L989" class="LineNr"> 989 </span> <span class="Comment"># create 2 sandboxes</span> <span id="L990" class="LineNr"> 990 </span> assume-console [ <span id="L991" class="LineNr"> 991 </span> press ctrl-n @@ -1053,9 +1053,9 @@ if ('onhashchange' in window) { <span id="L994" class="LineNr"> 994 </span> type <span class="Constant">[add 1, 1]</span> <span id="L995" class="LineNr"> 995 </span> press F4 <span id="L996" class="LineNr"> 996 </span> ] -<span id="L997" class="LineNr"> 997 </span> event-loop screen, console, env, resources +<span id="L997" class="LineNr"> 997 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L998" class="LineNr"> 998 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L999" class="LineNr"> 999 </span> print screen, cursor +<span id="L999" class="LineNr"> 999 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L1000" class="LineNr">1000 </span> screen-should-contain [ <span id="L1001" class="LineNr">1001 </span> <span class="Constant"> . run (F4) .</span> <span id="L1002" class="LineNr">1002 </span> <span class="Constant"> . ╎␣ .</span> @@ -1073,9 +1073,9 @@ if ('onhashchange' in window) { <span id="L1014" class="LineNr">1014 </span> press page-down <span id="L1015" class="LineNr">1015 </span> ] <span id="L1016" class="LineNr">1016 </span> run [ -<span id="L1017" class="LineNr">1017 </span> event-loop screen, console, env, resources +<span id="L1017" class="LineNr">1017 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1018" class="LineNr">1018 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L1019" class="LineNr">1019 </span> print screen, cursor +<span id="L1019" class="LineNr">1019 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L1020" class="LineNr">1020 </span> ] <span id="L1021" class="LineNr">1021 </span> <span class="Comment"># sandbox editor hidden; first sandbox displayed</span> <span id="L1022" class="LineNr">1022 </span> <span class="Comment"># cursor moves to first sandbox</span> @@ -1095,7 +1095,7 @@ if ('onhashchange' in window) { <span id="L1036" class="LineNr">1036 </span> press page-down <span id="L1037" class="LineNr">1037 </span> ] <span id="L1038" class="LineNr">1038 </span> run [ -<span id="L1039" class="LineNr">1039 </span> event-loop screen, console, env, resources +<span id="L1039" class="LineNr">1039 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1040" class="LineNr">1040 </span> ] <span id="L1041" class="LineNr">1041 </span> <span class="Comment"># just second sandbox displayed</span> <span id="L1042" class="LineNr">1042 </span> screen-should-contain [ @@ -1112,7 +1112,7 @@ if ('onhashchange' in window) { <span id="L1053" class="LineNr">1053 </span> press page-down <span id="L1054" class="LineNr">1054 </span> ] <span id="L1055" class="LineNr">1055 </span> run [ -<span id="L1056" class="LineNr">1056 </span> event-loop screen, console, env, resources +<span id="L1056" class="LineNr">1056 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1057" class="LineNr">1057 </span> ] <span id="L1058" class="LineNr">1058 </span> <span class="Comment"># no change</span> <span id="L1059" class="LineNr">1059 </span> screen-should-contain [ @@ -1129,7 +1129,7 @@ if ('onhashchange' in window) { <span id="L1070" class="LineNr">1070 </span> press page-up <span id="L1071" class="LineNr">1071 </span> ] <span id="L1072" class="LineNr">1072 </span> run [ -<span id="L1073" class="LineNr">1073 </span> event-loop screen, console, env, resources +<span id="L1073" class="LineNr">1073 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1074" class="LineNr">1074 </span> ] <span id="L1075" class="LineNr">1075 </span> <span class="Comment"># back to displaying both sandboxes without editor</span> <span id="L1076" class="LineNr">1076 </span> screen-should-contain [ @@ -1148,9 +1148,9 @@ if ('onhashchange' in window) { <span id="L1089" class="LineNr">1089 </span> press page-up <span id="L1090" class="LineNr">1090 </span> ] <span id="L1091" class="LineNr">1091 </span> run [ -<span id="L1092" class="LineNr">1092 </span> event-loop screen, console, env, resources +<span id="L1092" class="LineNr">1092 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1093" class="LineNr">1093 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L1094" class="LineNr">1094 </span> print screen, cursor +<span id="L1094" class="LineNr">1094 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L1095" class="LineNr">1095 </span> ] <span id="L1096" class="LineNr">1096 </span> <span class="Comment"># back to displaying both sandboxes as well as editor</span> <span id="L1097" class="LineNr">1097 </span> screen-should-contain [ @@ -1170,9 +1170,9 @@ if ('onhashchange' in window) { <span id="L1111" class="LineNr">1111 </span> press page-up <span id="L1112" class="LineNr">1112 </span> ] <span id="L1113" class="LineNr">1113 </span> run [ -<span id="L1114" class="LineNr">1114 </span> event-loop screen, console, env, resources +<span id="L1114" class="LineNr">1114 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1115" class="LineNr">1115 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L1116" class="LineNr">1116 </span> print screen, cursor +<span id="L1116" class="LineNr">1116 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L1117" class="LineNr">1117 </span> ] <span id="L1118" class="LineNr">1118 </span> <span class="Comment"># no change</span> <span id="L1119" class="LineNr">1119 </span> screen-should-contain [ @@ -1196,15 +1196,15 @@ if ('onhashchange' in window) { <span id="L1137" class="LineNr">1137 </span> <span class="Comment"># initialize environment</span> <span id="L1138" class="LineNr">1138 </span> assume-resources [ <span id="L1139" class="LineNr">1139 </span> ] -<span id="L1140" class="LineNr">1140 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L1141" class="LineNr">1141 </span> render-all screen, env, render +<span id="L1140" class="LineNr">1140 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L1141" class="LineNr">1141 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L1142" class="LineNr">1142 </span> <span class="Comment"># create a sandbox</span> <span id="L1143" class="LineNr">1143 </span> assume-console [ <span id="L1144" class="LineNr">1144 </span> press ctrl-n <span id="L1145" class="LineNr">1145 </span> type <span class="Constant">[add 1, 1]</span> <span id="L1146" class="LineNr">1146 </span> press F4 <span id="L1147" class="LineNr">1147 </span> ] -<span id="L1148" class="LineNr">1148 </span> event-loop screen, console, env, resources +<span id="L1148" class="LineNr">1148 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1149" class="LineNr">1149 </span> screen-should-contain [ <span id="L1150" class="LineNr">1150 </span> <span class="Constant"> . run (F4) .</span> <span id="L1151" class="LineNr">1151 </span> <span class="Constant"> . ╎ .</span> @@ -1220,7 +1220,7 @@ if ('onhashchange' in window) { <span id="L1161" class="LineNr">1161 </span> press page-down <span id="L1162" class="LineNr">1162 </span> ] <span id="L1163" class="LineNr">1163 </span> run [ -<span id="L1164" class="LineNr">1164 </span> event-loop screen, console, env, resources +<span id="L1164" class="LineNr">1164 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1165" class="LineNr">1165 </span> ] <span id="L1166" class="LineNr">1166 </span> <span class="Comment"># sandbox editor hidden; first sandbox displayed</span> <span id="L1167" class="LineNr">1167 </span> <span class="Comment"># cursor moves to first sandbox</span> @@ -1238,7 +1238,7 @@ if ('onhashchange' in window) { <span id="L1179" class="LineNr">1179 </span> press page-up <span id="L1180" class="LineNr">1180 </span> ] <span id="L1181" class="LineNr">1181 </span> run [ -<span id="L1182" class="LineNr">1182 </span> event-loop screen, console, env, resources +<span id="L1182" class="LineNr">1182 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1183" class="LineNr">1183 </span> ] <span id="L1184" class="LineNr">1184 </span> <span class="Comment"># back to displaying both sandboxes as well as editor</span> <span id="L1185" class="LineNr">1185 </span> screen-should-contain [ @@ -1256,7 +1256,7 @@ if ('onhashchange' in window) { <span id="L1197" class="LineNr">1197 </span> press page-down <span id="L1198" class="LineNr">1198 </span> ] <span id="L1199" class="LineNr">1199 </span> run [ -<span id="L1200" class="LineNr">1200 </span> event-loop screen, console, env, resources +<span id="L1200" class="LineNr">1200 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L1201" class="LineNr">1201 </span> ] <span id="L1202" class="LineNr">1202 </span> <span class="Comment"># sandbox editor hidden; first sandbox displayed</span> <span id="L1203" class="LineNr">1203 </span> <span class="Comment"># cursor moves to first sandbox</span> diff --git a/html/edit/006-sandbox-copy.mu.html b/html/edit/006-sandbox-copy.mu.html index 8e95c86a..afe578cf 100644 --- a/html/edit/006-sandbox-copy.mu.html +++ b/html/edit/006-sandbox-copy.mu.html @@ -66,12 +66,12 @@ if ('onhashchange' in window) { <span id="L8" class="LineNr"> 8 </span> <span class="Comment"># empty recipes</span> <span id="L9" class="LineNr"> 9 </span> assume-resources [ <span id="L10" class="LineNr"> 10 </span> ] -<span id="L11" class="LineNr"> 11 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span> <span class="Comment"># contents of sandbox editor</span> +<span id="L11" class="LineNr"> 11 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[add 1, 1]</span> <span class="Comment"># contents of sandbox editor</span> <span id="L12" class="LineNr"> 12 </span> <span class="Comment"># run it</span> <span id="L13" class="LineNr"> 13 </span> assume-console [ <span id="L14" class="LineNr"> 14 </span> press F4 <span id="L15" class="LineNr"> 15 </span> ] -<span id="L16" class="LineNr"> 16 </span> event-loop screen, console, env, resources +<span id="L16" class="LineNr"> 16 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L17" class="LineNr"> 17 </span> screen-should-contain [ <span id="L18" class="LineNr"> 18 </span> <span class="Constant"> . run (F4) .</span> <span id="L19" class="LineNr"> 19 </span> <span class="Constant"> . ╎ .</span> @@ -87,7 +87,7 @@ if ('onhashchange' in window) { <span id="L29" class="LineNr"> 29 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 69</span> <span id="L30" class="LineNr"> 30 </span> ] <span id="L31" class="LineNr"> 31 </span> run [ -<span id="L32" class="LineNr"> 32 </span> event-loop screen, console, env, resources +<span id="L32" class="LineNr"> 32 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L33" class="LineNr"> 33 </span> ] <span id="L34" class="LineNr"> 34 </span> <span class="Comment"># it copies into editor</span> <span id="L35" class="LineNr"> 35 </span> screen-should-contain [ @@ -105,7 +105,7 @@ if ('onhashchange' in window) { <span id="L47" class="LineNr"> 47 </span> type <span class="Constant">[0]</span> <span id="L48" class="LineNr"> 48 </span> ] <span id="L49" class="LineNr"> 49 </span> run [ -<span id="L50" class="LineNr"> 50 </span> event-loop screen, console, env, resources +<span id="L50" class="LineNr"> 50 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L51" class="LineNr"> 51 </span> ] <span id="L52" class="LineNr"> 52 </span> screen-should-contain [ <span id="L53" class="LineNr"> 53 </span> <span class="Constant"> . run (F4) .</span> @@ -126,12 +126,12 @@ if ('onhashchange' in window) { <span id="L68" class="LineNr"> 68 </span> <span class="Comment"># empty recipes</span> <span id="L69" class="LineNr"> 69 </span> assume-resources [ <span id="L70" class="LineNr"> 70 </span> ] -<span id="L71" class="LineNr"> 71 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span> <span class="Comment"># contents of sandbox editor</span> +<span id="L71" class="LineNr"> 71 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[add 1, 1]</span> <span class="Comment"># contents of sandbox editor</span> <span id="L72" class="LineNr"> 72 </span> <span class="Comment"># run it</span> <span id="L73" class="LineNr"> 73 </span> assume-console [ <span id="L74" class="LineNr"> 74 </span> press F4 <span id="L75" class="LineNr"> 75 </span> ] -<span id="L76" class="LineNr"> 76 </span> event-loop screen, console, env, resources +<span id="L76" class="LineNr"> 76 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L77" class="LineNr"> 77 </span> screen-should-contain [ <span id="L78" class="LineNr"> 78 </span> <span class="Constant"> . run (F4) .</span> <span id="L79" class="LineNr"> 79 </span> <span class="Constant"> . ╎ .</span> @@ -147,7 +147,7 @@ if ('onhashchange' in window) { <span id="L89" class="LineNr"> 89 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 84</span> <span id="L90" class="LineNr"> 90 </span> ] <span id="L91" class="LineNr"> 91 </span> run [ -<span id="L92" class="LineNr"> 92 </span> event-loop screen, console, env, resources +<span id="L92" class="LineNr"> 92 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L93" class="LineNr"> 93 </span> ] <span id="L94" class="LineNr"> 94 </span> <span class="Comment"># it copies into editor</span> <span id="L95" class="LineNr"> 95 </span> screen-should-contain [ @@ -165,7 +165,7 @@ if ('onhashchange' in window) { <span id="L107" class="LineNr">107 </span> type <span class="Constant">[0]</span> <span id="L108" class="LineNr">108 </span> ] <span id="L109" class="LineNr">109 </span> run [ -<span id="L110" class="LineNr">110 </span> event-loop screen, console, env, resources +<span id="L110" class="LineNr">110 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L111" class="LineNr">111 </span> ] <span id="L112" class="LineNr">112 </span> screen-should-contain [ <span id="L113" class="LineNr">113 </span> <span class="Constant"> . run (F4) .</span> @@ -186,10 +186,10 @@ if ('onhashchange' in window) { <span id="L128" class="LineNr">128 </span> <span class="muControl">break-unless</span> copy? <span id="L129" class="LineNr">129 </span> copy?, env <span class="Special"><-</span> try-copy-sandbox click-row, env <span id="L130" class="LineNr">130 </span> <span class="muControl">break-unless</span> copy? -<span id="L131" class="LineNr">131 </span> hide-screen screen -<span id="L132" class="LineNr">132 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render -<span id="L133" class="LineNr">133 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env -<span id="L134" class="LineNr">134 </span> show-screen screen +<span id="L131" class="LineNr">131 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L132" class="LineNr">132 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render +<span id="L133" class="LineNr">133 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L134" class="LineNr">134 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L135" class="LineNr">135 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L136" class="LineNr">136 </span> <span class="Delimiter">}</span> <span id="L137" class="LineNr">137 </span>] @@ -262,7 +262,7 @@ if ('onhashchange' in window) { <span id="L204" class="LineNr">204 </span> <span class="Constant">local-scope</span> <span id="L205" class="LineNr">205 </span> <span class="Constant">load-ingredients</span> <span id="L206" class="LineNr">206 </span> head:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">data:offset</span> -<span id="L207" class="LineNr">207 </span> first:&:duplex-list:char <span class="Special"><-</span> next head +<span id="L207" class="LineNr">207 </span> first:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> head <span id="L208" class="LineNr">208 </span> result <span class="Special"><-</span> not first <span id="L209" class="LineNr">209 </span>] <span id="L210" class="LineNr">210 </span> @@ -281,12 +281,12 @@ if ('onhashchange' in window) { <span id="L223" class="LineNr">223 </span> <span class="Comment"># empty recipes</span> <span id="L224" class="LineNr">224 </span> assume-resources [ <span id="L225" class="LineNr">225 </span> ] -<span id="L226" class="LineNr">226 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[add 1, 1]</span> <span class="Comment"># contents of sandbox editor</span> +<span id="L226" class="LineNr">226 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[add 1, 1]</span> <span class="Comment"># contents of sandbox editor</span> <span id="L227" class="LineNr">227 </span> <span class="Comment"># run it</span> <span id="L228" class="LineNr">228 </span> assume-console [ <span id="L229" class="LineNr">229 </span> press F4 <span id="L230" class="LineNr">230 </span> ] -<span id="L231" class="LineNr">231 </span> event-loop screen, console, env, resources +<span id="L231" class="LineNr">231 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L232" class="LineNr">232 </span> screen-should-contain [ <span id="L233" class="LineNr">233 </span> <span class="Constant"> . run (F4) .</span> <span id="L234" class="LineNr">234 </span> <span class="Constant"> . ╎ .</span> @@ -304,7 +304,7 @@ if ('onhashchange' in window) { <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> <span id="L247" class="LineNr">247 </span> ] <span id="L248" class="LineNr">248 </span> run [ -<span id="L249" class="LineNr">249 </span> event-loop screen, console, env, resources +<span id="L249" class="LineNr">249 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L250" class="LineNr">250 </span> ] <span id="L251" class="LineNr">251 </span> <span class="Comment"># copy doesn't happen</span> <span id="L252" class="LineNr">252 </span> screen-should-contain [ @@ -322,7 +322,7 @@ if ('onhashchange' in window) { <span id="L264" class="LineNr">264 </span> type <span class="Constant">[1]</span> <span id="L265" class="LineNr">265 </span> ] <span id="L266" class="LineNr">266 </span> run [ -<span id="L267" class="LineNr">267 </span> event-loop screen, console, env, resources +<span id="L267" class="LineNr">267 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L268" class="LineNr">268 </span> ] <span id="L269" class="LineNr">269 </span> screen-should-contain [ <span id="L270" class="LineNr">270 </span> <span class="Constant"> . run (F4) .</span> diff --git a/html/edit/007-sandbox-delete.mu.html b/html/edit/007-sandbox-delete.mu.html index a4829874..620fc495 100644 --- a/html/edit/007-sandbox-delete.mu.html +++ b/html/edit/007-sandbox-delete.mu.html @@ -64,7 +64,7 @@ if ('onhashchange' in window) { <span id="L6" class="LineNr"> 6 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> <span id="L7" class="LineNr"> 7 </span> assume-resources [ <span id="L8" class="LineNr"> 8 </span> ] -<span id="L9" class="LineNr"> 9 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> +<span id="L9" class="LineNr"> 9 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> <span id="L10" class="LineNr"> 10 </span> <span class="Comment"># run a few commands</span> <span id="L11" class="LineNr"> 11 </span> assume-console [ <span id="L12" class="LineNr"> 12 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 80</span> @@ -73,7 +73,7 @@ if ('onhashchange' in window) { <span id="L15" class="LineNr"> 15 </span> type <span class="Constant">[add 2, 2]</span> <span id="L16" class="LineNr"> 16 </span> press F4 <span id="L17" class="LineNr"> 17 </span> ] -<span id="L18" class="LineNr"> 18 </span> event-loop screen, console, env, resources +<span id="L18" class="LineNr"> 18 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L19" class="LineNr"> 19 </span> screen-should-contain [ <span id="L20" class="LineNr"> 20 </span> <span class="Constant"> . run (F4) .</span> <span id="L21" class="LineNr"> 21 </span> <span class="Constant"> . ╎ .</span> @@ -94,7 +94,7 @@ if ('onhashchange' in window) { <span id="L36" class="LineNr"> 36 </span> left-click<span class="Constant"> 7</span>,<span class="Constant"> 85</span> <span id="L37" class="LineNr"> 37 </span> ] <span id="L38" class="LineNr"> 38 </span> run [ -<span id="L39" class="LineNr"> 39 </span> event-loop screen, console, env, resources +<span id="L39" class="LineNr"> 39 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L40" class="LineNr"> 40 </span> ] <span id="L41" class="LineNr"> 41 </span> screen-should-contain [ <span id="L42" class="LineNr"> 42 </span> <span class="Constant"> . run (F4) .</span> @@ -112,7 +112,7 @@ if ('onhashchange' in window) { <span id="L54" class="LineNr"> 54 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 99</span> <span id="L55" class="LineNr"> 55 </span> ] <span id="L56" class="LineNr"> 56 </span> run [ -<span id="L57" class="LineNr"> 57 </span> event-loop screen, console, env, resources +<span id="L57" class="LineNr"> 57 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L58" class="LineNr"> 58 </span> ] <span id="L59" class="LineNr"> 59 </span> screen-should-contain [ <span id="L60" class="LineNr"> 60 </span> <span class="Constant"> . run (F4) .</span> @@ -130,10 +130,10 @@ if ('onhashchange' in window) { <span id="L72" class="LineNr"> 72 </span> <span class="muControl">break-unless</span> delete? <span id="L73" class="LineNr"> 73 </span> delete?, env <span class="Special"><-</span> try-delete-sandbox click-row, env <span id="L74" class="LineNr"> 74 </span> <span class="muControl">break-unless</span> delete? -<span id="L75" class="LineNr"> 75 </span> hide-screen screen -<span id="L76" class="LineNr"> 76 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render -<span id="L77" class="LineNr"> 77 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env -<span id="L78" class="LineNr"> 78 </span> show-screen screen +<span id="L75" class="LineNr"> 75 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L76" class="LineNr"> 76 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render +<span id="L77" class="LineNr"> 77 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L78" class="LineNr"> 78 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L79" class="LineNr"> 79 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L80" class="LineNr"> 80 </span> <span class="Delimiter">}</span> <span id="L81" class="LineNr"> 81 </span>] @@ -213,8 +213,8 @@ if ('onhashchange' in window) { <span id="L155" class="LineNr">155 </span> <span class="Comment"># initialize environment</span> <span id="L156" class="LineNr">156 </span> assume-resources [ <span id="L157" class="LineNr">157 </span> ] -<span id="L158" class="LineNr">158 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L159" class="LineNr">159 </span> render-all screen, env, render +<span id="L158" class="LineNr">158 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L159" class="LineNr">159 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L160" class="LineNr">160 </span> <span class="Comment"># create 2 sandboxes and scroll to second</span> <span id="L161" class="LineNr">161 </span> assume-console [ <span id="L162" class="LineNr">162 </span> press ctrl-n @@ -224,7 +224,7 @@ if ('onhashchange' in window) { <span id="L166" class="LineNr">166 </span> press F4 <span id="L167" class="LineNr">167 </span> press page-down <span id="L168" class="LineNr">168 </span> ] -<span id="L169" class="LineNr">169 </span> event-loop screen, console, env, resources +<span id="L169" class="LineNr">169 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L170" class="LineNr">170 </span> screen-should-contain [ <span id="L171" class="LineNr">171 </span> <span class="Constant"> . run (F4) .</span> <span id="L172" class="LineNr">172 </span> <span class="Constant"> . ╎─────────────────────────────────────────────────.</span> @@ -239,7 +239,7 @@ if ('onhashchange' in window) { <span id="L181" class="LineNr">181 </span> left-click<span class="Constant"> 6</span>,<span class="Constant"> 99</span> <span id="L182" class="LineNr">182 </span> ] <span id="L183" class="LineNr">183 </span> run [ -<span id="L184" class="LineNr">184 </span> event-loop screen, console, env, resources +<span id="L184" class="LineNr">184 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L185" class="LineNr">185 </span> ] <span id="L186" class="LineNr">186 </span> <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span> <span id="L187" class="LineNr">187 </span> screen-should-contain [ @@ -260,8 +260,8 @@ if ('onhashchange' in window) { <span id="L202" class="LineNr">202 </span> <span class="Comment"># initialize environment</span> <span id="L203" class="LineNr">203 </span> assume-resources [ <span id="L204" class="LineNr">204 </span> ] -<span id="L205" class="LineNr">205 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L206" class="LineNr">206 </span> render-all screen, env, render +<span id="L205" class="LineNr">205 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L206" class="LineNr">206 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L207" class="LineNr">207 </span> <span class="Comment"># create 2 sandboxes and scroll to second</span> <span id="L208" class="LineNr">208 </span> assume-console [ <span id="L209" class="LineNr">209 </span> press ctrl-n @@ -271,7 +271,7 @@ if ('onhashchange' in window) { <span id="L213" class="LineNr">213 </span> press F4 <span id="L214" class="LineNr">214 </span> press page-down <span id="L215" class="LineNr">215 </span> ] -<span id="L216" class="LineNr">216 </span> event-loop screen, console, env, resources +<span id="L216" class="LineNr">216 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L217" class="LineNr">217 </span> screen-should-contain [ <span id="L218" class="LineNr">218 </span> <span class="Constant"> . run (F4) .</span> <span id="L219" class="LineNr">219 </span> <span class="Constant"> . ╎─────────────────────────────────────────────────.</span> @@ -286,7 +286,7 @@ if ('onhashchange' in window) { <span id="L228" class="LineNr">228 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 99</span> <span id="L229" class="LineNr">229 </span> ] <span id="L230" class="LineNr">230 </span> run [ -<span id="L231" class="LineNr">231 </span> event-loop screen, console, env, resources +<span id="L231" class="LineNr">231 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L232" class="LineNr">232 </span> ] <span id="L233" class="LineNr">233 </span> <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span> <span id="L234" class="LineNr">234 </span> screen-should-contain [ @@ -307,8 +307,8 @@ if ('onhashchange' in window) { <span id="L249" class="LineNr">249 </span> <span class="Comment"># initialize environment</span> <span id="L250" class="LineNr">250 </span> assume-resources [ <span id="L251" class="LineNr">251 </span> ] -<span id="L252" class="LineNr">252 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L253" class="LineNr">253 </span> render-all screen, env, render +<span id="L252" class="LineNr">252 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L253" class="LineNr">253 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L254" class="LineNr">254 </span> <span class="Comment"># create 2 sandboxes and scroll to second</span> <span id="L255" class="LineNr">255 </span> assume-console [ <span id="L256" class="LineNr">256 </span> press ctrl-n @@ -319,7 +319,7 @@ if ('onhashchange' in window) { <span id="L261" class="LineNr">261 </span> press page-down <span id="L262" class="LineNr">262 </span> press page-down <span id="L263" class="LineNr">263 </span> ] -<span id="L264" class="LineNr">264 </span> event-loop screen, console, env, resources +<span id="L264" class="LineNr">264 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L265" class="LineNr">265 </span> screen-should-contain [ <span id="L266" class="LineNr">266 </span> <span class="Constant"> . run (F4) .</span> <span id="L267" class="LineNr">267 </span> <span class="Constant"> . ╎─────────────────────────────────────────────────.</span> @@ -334,7 +334,7 @@ if ('onhashchange' in window) { <span id="L276" class="LineNr">276 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 99</span> <span id="L277" class="LineNr">277 </span> ] <span id="L278" class="LineNr">278 </span> run [ -<span id="L279" class="LineNr">279 </span> event-loop screen, console, env, resources +<span id="L279" class="LineNr">279 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L280" class="LineNr">280 </span> ] <span id="L281" class="LineNr">281 </span> <span class="Comment"># implicitly scroll up to first sandbox</span> <span id="L282" class="LineNr">282 </span> screen-should-contain [ @@ -356,8 +356,8 @@ if ('onhashchange' in window) { <span id="L298" class="LineNr">298 </span> <span class="Comment"># initialize environment</span> <span id="L299" class="LineNr">299 </span> assume-resources [ <span id="L300" class="LineNr">300 </span> ] -<span id="L301" class="LineNr">301 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L302" class="LineNr">302 </span> render-all screen, env, render +<span id="L301" class="LineNr">301 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L302" class="LineNr">302 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L303" class="LineNr">303 </span> <span class="Comment"># create 2 sandboxes</span> <span id="L304" class="LineNr">304 </span> assume-console [ <span id="L305" class="LineNr">305 </span> press ctrl-n @@ -366,7 +366,7 @@ if ('onhashchange' in window) { <span id="L308" class="LineNr">308 </span> type <span class="Constant">[add 1, 1]</span> <span id="L309" class="LineNr">309 </span> press F4 <span id="L310" class="LineNr">310 </span> ] -<span id="L311" class="LineNr">311 </span> event-loop screen, console, env, resources +<span id="L311" class="LineNr">311 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L312" class="LineNr">312 </span> screen-should-contain [ <span id="L313" class="LineNr">313 </span> <span class="Constant"> . run (F4) .</span> <span id="L314" class="LineNr">314 </span> <span class="Constant"> . ╎ .</span> @@ -386,7 +386,7 @@ if ('onhashchange' in window) { <span id="L328" class="LineNr">328 </span> press page-down <span id="L329" class="LineNr">329 </span> ] <span id="L330" class="LineNr">330 </span> run [ -<span id="L331" class="LineNr">331 </span> event-loop screen, console, env, resources +<span id="L331" class="LineNr">331 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L332" class="LineNr">332 </span> ] <span id="L333" class="LineNr">333 </span> <span class="Comment"># shouldn't go past last sandbox</span> <span id="L334" class="LineNr">334 </span> screen-should-contain [ diff --git a/html/edit/008-sandbox-edit.mu.html b/html/edit/008-sandbox-edit.mu.html index 218ea106..1085b8ab 100644 --- a/html/edit/008-sandbox-edit.mu.html +++ b/html/edit/008-sandbox-edit.mu.html @@ -65,12 +65,12 @@ if ('onhashchange' in window) { <span id="L7" class="LineNr"> 7 </span> <span class="Comment"># empty recipes</span> <span id="L8" class="LineNr"> 8 </span> assume-resources [ <span id="L9" class="LineNr"> 9 </span> ] -<span id="L10" class="LineNr"> 10 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span> +<span id="L10" class="LineNr"> 10 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[add 2, 2]</span> <span id="L11" class="LineNr"> 11 </span> <span class="Comment"># run it</span> <span id="L12" class="LineNr"> 12 </span> assume-console [ <span id="L13" class="LineNr"> 13 </span> press F4 <span id="L14" class="LineNr"> 14 </span> ] -<span id="L15" class="LineNr"> 15 </span> event-loop screen, console, env, resources +<span id="L15" class="LineNr"> 15 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L16" class="LineNr"> 16 </span> screen-should-contain [ <span id="L17" class="LineNr"> 17 </span> <span class="Constant"> . run (F4) .</span> <span id="L18" class="LineNr"> 18 </span> <span class="Constant"> . ╎ .</span> @@ -86,7 +86,7 @@ if ('onhashchange' in window) { <span id="L28" class="LineNr"> 28 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 55</span> <span id="L29" class="LineNr"> 29 </span> ] <span id="L30" class="LineNr"> 30 </span> run [ -<span id="L31" class="LineNr"> 31 </span> event-loop screen, console, env, resources +<span id="L31" class="LineNr"> 31 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L32" class="LineNr"> 32 </span> ] <span id="L33" class="LineNr"> 33 </span> <span class="Comment"># it pops back into editor</span> <span id="L34" class="LineNr"> 34 </span> screen-should-contain [ @@ -100,7 +100,7 @@ if ('onhashchange' in window) { <span id="L42" class="LineNr"> 42 </span> type <span class="Constant">[0]</span> <span id="L43" class="LineNr"> 43 </span> ] <span id="L44" class="LineNr"> 44 </span> run [ -<span id="L45" class="LineNr"> 45 </span> event-loop screen, console, env, resources +<span id="L45" class="LineNr"> 45 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L46" class="LineNr"> 46 </span> ] <span id="L47" class="LineNr"> 47 </span> screen-should-contain [ <span id="L48" class="LineNr"> 48 </span> <span class="Constant"> . run (F4) .</span> @@ -117,12 +117,12 @@ if ('onhashchange' in window) { <span id="L59" class="LineNr"> 59 </span> <span class="Comment"># empty recipes</span> <span id="L60" class="LineNr"> 60 </span> assume-resources [ <span id="L61" class="LineNr"> 61 </span> ] -<span id="L62" class="LineNr"> 62 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[add 2, 2]</span> +<span id="L62" class="LineNr"> 62 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[add 2, 2]</span> <span id="L63" class="LineNr"> 63 </span> <span class="Comment"># run it</span> <span id="L64" class="LineNr"> 64 </span> assume-console [ <span id="L65" class="LineNr"> 65 </span> press F4 <span id="L66" class="LineNr"> 66 </span> ] -<span id="L67" class="LineNr"> 67 </span> event-loop screen, console, env, resources +<span id="L67" class="LineNr"> 67 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L68" class="LineNr"> 68 </span> screen-should-contain [ <span id="L69" class="LineNr"> 69 </span> <span class="Constant"> . run (F4) .</span> <span id="L70" class="LineNr"> 70 </span> <span class="Constant"> . ╎ .</span> @@ -138,7 +138,7 @@ if ('onhashchange' in window) { <span id="L80" class="LineNr"> 80 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 68</span> <span id="L81" class="LineNr"> 81 </span> ] <span id="L82" class="LineNr"> 82 </span> run [ -<span id="L83" class="LineNr"> 83 </span> event-loop screen, console, env, resources +<span id="L83" class="LineNr"> 83 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L84" class="LineNr"> 84 </span> ] <span id="L85" class="LineNr"> 85 </span> <span class="Comment"># it pops back into editor</span> <span id="L86" class="LineNr"> 86 </span> screen-should-contain [ @@ -152,7 +152,7 @@ if ('onhashchange' in window) { <span id="L94" class="LineNr"> 94 </span> type <span class="Constant">[0]</span> <span id="L95" class="LineNr"> 95 </span> ] <span id="L96" class="LineNr"> 96 </span> run [ -<span id="L97" class="LineNr"> 97 </span> event-loop screen, console, env, resources +<span id="L97" class="LineNr"> 97 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L98" class="LineNr"> 98 </span> ] <span id="L99" class="LineNr"> 99 </span> screen-should-contain [ <span id="L100" class="LineNr">100 </span> <span class="Constant"> . run (F4) .</span> @@ -169,10 +169,10 @@ if ('onhashchange' in window) { <span id="L111" class="LineNr">111 </span> <span class="muControl">break-unless</span> edit? <span id="L112" class="LineNr">112 </span> edit?, env <span class="Special"><-</span> try-edit-sandbox click-row, env <span id="L113" class="LineNr">113 </span> <span class="muControl">break-unless</span> edit? -<span id="L114" class="LineNr">114 </span> hide-screen screen -<span id="L115" class="LineNr">115 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render -<span id="L116" class="LineNr">116 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env -<span id="L117" class="LineNr">117 </span> show-screen screen +<span id="L114" class="LineNr">114 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L115" class="LineNr">115 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render +<span id="L116" class="LineNr">116 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L117" class="LineNr">117 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L118" class="LineNr">118 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L119" class="LineNr">119 </span> <span class="Delimiter">}</span> <span id="L120" class="LineNr">120 </span>] @@ -223,18 +223,18 @@ if ('onhashchange' in window) { <span id="L165" class="LineNr">165 </span> assume-resources [ <span id="L166" class="LineNr">166 </span> ] <span id="L167" class="LineNr">167 </span> <span class="Comment"># right editor contains a print instruction</span> -<span id="L168" class="LineNr">168 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[print-integer screen, 4]</span> +<span id="L168" class="LineNr">168 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[print-integer <a href='081print.mu.html#L4'>screen</a>, 4]</span> <span id="L169" class="LineNr">169 </span> <span class="Comment"># run the sandbox</span> <span id="L170" class="LineNr">170 </span> assume-console [ <span id="L171" class="LineNr">171 </span> press F4 <span id="L172" class="LineNr">172 </span> ] -<span id="L173" class="LineNr">173 </span> event-loop screen, console, env, resources +<span id="L173" class="LineNr">173 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L174" class="LineNr">174 </span> screen-should-contain [ <span id="L175" class="LineNr">175 </span> <span class="Constant"> . run (F4) .</span> <span id="L176" class="LineNr">176 </span> <span class="Constant"> . ╎ .</span> <span id="L177" class="LineNr">177 </span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span> <span id="L178" class="LineNr">178 </span> <span class="Constant"> . ╎0 edit copy delete .</span> -<span id="L179" class="LineNr">179 </span> <span class="Constant"> . ╎print-integer screen, 4 .</span> +<span id="L179" class="LineNr">179 </span> <span class="Constant"> . ╎print-integer <a href='081print.mu.html#L4'>screen</a>, 4 .</span> <span id="L180" class="LineNr">180 </span> <span class="Constant"> . ╎screen: .</span> <span id="L181" class="LineNr">181 </span> <span class="Constant"> . ╎ .4 . .</span> <span id="L182" class="LineNr">182 </span> <span class="Constant"> . ╎ . . .</span> @@ -249,11 +249,11 @@ if ('onhashchange' in window) { <span id="L191" class="LineNr">191 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 65</span> <span id="L192" class="LineNr">192 </span> ] <span id="L193" class="LineNr">193 </span> run [ -<span id="L194" class="LineNr">194 </span> event-loop screen, console, env, resources +<span id="L194" class="LineNr">194 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L195" class="LineNr">195 </span> ] <span id="L196" class="LineNr">196 </span> screen-should-contain [ <span id="L197" class="LineNr">197 </span> <span class="Constant"> . run (F4) .</span> -<span id="L198" class="LineNr">198 </span> <span class="Constant"> . ╎print-integer screen, 4 .</span> +<span id="L198" class="LineNr">198 </span> <span class="Constant"> . ╎print-integer <a href='081print.mu.html#L4'>screen</a>, 4 .</span> <span id="L199" class="LineNr">199 </span><span class="Constant"> .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.</span> <span id="L200" class="LineNr">200 </span> <span class="Constant"> . ╎ .</span> <span id="L201" class="LineNr">201 </span> <span class="Constant"> . ╎ .</span> @@ -267,8 +267,8 @@ if ('onhashchange' in window) { <span id="L209" class="LineNr">209 </span> <span class="Comment"># initialize environment</span> <span id="L210" class="LineNr">210 </span> assume-resources [ <span id="L211" class="LineNr">211 </span> ] -<span id="L212" class="LineNr">212 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L213" class="LineNr">213 </span> render-all screen, env, render +<span id="L212" class="LineNr">212 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L213" class="LineNr">213 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L214" class="LineNr">214 </span> <span class="Comment"># create 2 sandboxes and scroll to second</span> <span id="L215" class="LineNr">215 </span> assume-console [ <span id="L216" class="LineNr">216 </span> press ctrl-n @@ -279,7 +279,7 @@ if ('onhashchange' in window) { <span id="L221" class="LineNr">221 </span> press page-down <span id="L222" class="LineNr">222 </span> press page-down <span id="L223" class="LineNr">223 </span> ] -<span id="L224" class="LineNr">224 </span> event-loop screen, console, env, resources +<span id="L224" class="LineNr">224 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L225" class="LineNr">225 </span> screen-should-contain [ <span id="L226" class="LineNr">226 </span> <span class="Constant"> . run (F4) .</span> <span id="L227" class="LineNr">227 </span> <span class="Constant"> . ╎─────────────────────────────────────────────────.</span> @@ -294,7 +294,7 @@ if ('onhashchange' in window) { <span id="L236" class="LineNr">236 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 55</span> <span id="L237" class="LineNr">237 </span> ] <span id="L238" class="LineNr">238 </span> run [ -<span id="L239" class="LineNr">239 </span> event-loop screen, console, env, resources +<span id="L239" class="LineNr">239 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L240" class="LineNr">240 </span> ] <span id="L241" class="LineNr">241 </span> <span class="Comment"># second sandbox shows in editor; scroll resets to display first sandbox</span> <span id="L242" class="LineNr">242 </span> screen-should-contain [ @@ -316,8 +316,8 @@ if ('onhashchange' in window) { <span id="L258" class="LineNr">258 </span> <span class="Comment"># initialize environment</span> <span id="L259" class="LineNr">259 </span> assume-resources [ <span id="L260" class="LineNr">260 </span> ] -<span id="L261" class="LineNr">261 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> -<span id="L262" class="LineNr">262 </span> render-all screen, env, render +<span id="L261" class="LineNr">261 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> +<span id="L262" class="LineNr">262 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L263" class="LineNr">263 </span> <span class="Comment"># create 2 sandboxes</span> <span id="L264" class="LineNr">264 </span> assume-console [ <span id="L265" class="LineNr">265 </span> press ctrl-n @@ -326,7 +326,7 @@ if ('onhashchange' in window) { <span id="L268" class="LineNr">268 </span> type <span class="Constant">[add 1, 1]</span> <span id="L269" class="LineNr">269 </span> press F4 <span id="L270" class="LineNr">270 </span> ] -<span id="L271" class="LineNr">271 </span> event-loop screen, console, env, resources +<span id="L271" class="LineNr">271 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L272" class="LineNr">272 </span> screen-should-contain [ <span id="L273" class="LineNr">273 </span> <span class="Constant"> . run (F4) .</span> <span id="L274" class="LineNr">274 </span> <span class="Constant"> . ╎ .</span> @@ -345,7 +345,7 @@ if ('onhashchange' in window) { <span id="L287" class="LineNr">287 </span> press F4 <span id="L288" class="LineNr">288 </span> ] <span id="L289" class="LineNr">289 </span> run [ -<span id="L290" class="LineNr">290 </span> event-loop screen, console, env, resources +<span id="L290" class="LineNr">290 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L291" class="LineNr">291 </span> ] <span id="L292" class="LineNr">292 </span> <span class="Comment"># no change in contents</span> <span id="L293" class="LineNr">293 </span> screen-should-contain [ @@ -367,7 +367,7 @@ if ('onhashchange' in window) { <span id="L309" class="LineNr">309 </span> press page-down <span id="L310" class="LineNr">310 </span> ] <span id="L311" class="LineNr">311 </span> run [ -<span id="L312" class="LineNr">312 </span> event-loop screen, console, env, resources +<span id="L312" class="LineNr">312 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L313" class="LineNr">313 </span> ] <span id="L314" class="LineNr">314 </span> <span class="Comment"># screen should show just final sandbox with the right index (1)</span> <span id="L315" class="LineNr">315 </span> screen-should-contain [ diff --git a/html/edit/009-sandbox-test.mu.html b/html/edit/009-sandbox-test.mu.html index 9361df24..52631e6f 100644 --- a/html/edit/009-sandbox-test.mu.html +++ b/html/edit/009-sandbox-test.mu.html @@ -71,12 +71,12 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span><span class="Constant"> |]</span>| <span id="L13" class="LineNr"> 13 </span> ] <span id="L14" class="LineNr"> 14 </span> ] -<span id="L15" class="LineNr"> 15 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L15" class="LineNr"> 15 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L16" class="LineNr"> 16 </span> <span class="Comment"># run it</span> <span id="L17" class="LineNr"> 17 </span> assume-console [ <span id="L18" class="LineNr"> 18 </span> press F4 <span id="L19" class="LineNr"> 19 </span> ] -<span id="L20" class="LineNr"> 20 </span> event-loop screen, console, env, resources +<span id="L20" class="LineNr"> 20 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L21" class="LineNr"> 21 </span> screen-should-contain [ <span id="L22" class="LineNr"> 22 </span> <span class="Constant"> . run (F4) .</span> <span id="L23" class="LineNr"> 23 </span> <span class="Constant"> .recipe foo [ ╎ .</span> @@ -92,7 +92,7 @@ if ('onhashchange' in window) { <span id="L33" class="LineNr"> 33 </span> left-click<span class="Constant"> 5</span>,<span class="Constant"> 51</span> <span id="L34" class="LineNr"> 34 </span> ] <span id="L35" class="LineNr"> 35 </span> run [ -<span id="L36" class="LineNr"> 36 </span> event-loop screen, console, env, resources +<span id="L36" class="LineNr"> 36 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L37" class="LineNr"> 37 </span> ] <span id="L38" class="LineNr"> 38 </span> <span class="Comment"># color toggles to green</span> <span id="L39" class="LineNr"> 39 </span> screen-should-contain-in-color <span class="Constant">2/green</span>, [ @@ -108,7 +108,7 @@ if ('onhashchange' in window) { <span id="L49" class="LineNr"> 49 </span> <span class="Comment"># cursor should remain unmoved</span> <span id="L50" class="LineNr"> 50 </span> run [ <span id="L51" class="LineNr"> 51 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L52" class="LineNr"> 52 </span> print screen, cursor +<span id="L52" class="LineNr"> 52 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L53" class="LineNr"> 53 </span> ] <span id="L54" class="LineNr"> 54 </span> screen-should-contain [ <span id="L55" class="LineNr"> 55 </span> <span class="Constant"> . run (F4) .</span> @@ -129,7 +129,7 @@ if ('onhashchange' in window) { <span id="L70" class="LineNr"> 70 </span> press F4 <span id="L71" class="LineNr"> 71 </span> ] <span id="L72" class="LineNr"> 72 </span> run [ -<span id="L73" class="LineNr"> 73 </span> event-loop screen, console, env, resources +<span id="L73" class="LineNr"> 73 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L74" class="LineNr"> 74 </span> ] <span id="L75" class="LineNr"> 75 </span> <span class="Comment"># result turns red</span> <span id="L76" class="LineNr"> 76 </span> screen-should-contain-in-color <span class="Constant">1/red</span>, [ @@ -156,14 +156,14 @@ if ('onhashchange' in window) { <span id="L97" class="LineNr"> 97 </span> expected-response:text <span class="Special"><-</span> get *curr, <span class="Constant">expected-response:offset</span> <span id="L98" class="LineNr"> 98 </span> <span class="muControl">break-unless</span> expected-response <span id="L99" class="LineNr"> 99 </span> filename <span class="Special"><-</span> append filename, <span class="Constant">[.out]</span> -<span id="L100" class="LineNr">100 </span> resources <span class="Special"><-</span> dump resources, filename, expected-response +<span id="L100" class="LineNr">100 </span> <a href='088file.mu.html#L11'>resources</a> <span class="Special"><-</span> <a href='088file.mu.html#L127'>dump</a> <a href='088file.mu.html#L11'>resources</a>, filename, expected-response <span id="L101" class="LineNr">101 </span> <span class="Delimiter">}</span> <span id="L102" class="LineNr">102 </span>] <span id="L103" class="LineNr">103 </span> <span id="L104" class="LineNr">104 </span><span class="muRecipe">before</span> <span class="Constant"><end-restore-sandbox></span> [ <span id="L105" class="LineNr">105 </span> <span class="Delimiter">{</span> <span id="L106" class="LineNr">106 </span> filename <span class="Special"><-</span> append filename, <span class="Constant">[.out]</span> -<span id="L107" class="LineNr">107 </span> contents <span class="Special"><-</span> slurp resources, filename +<span id="L107" class="LineNr">107 </span> contents <span class="Special"><-</span> <a href='088file.mu.html#L38'>slurp</a> <a href='088file.mu.html#L11'>resources</a>, filename <span id="L108" class="LineNr">108 </span> <span class="muControl">break-unless</span> contents <span id="L109" class="LineNr">109 </span> *curr <span class="Special"><-</span> put *curr, <span class="Constant">expected-response:offset</span>, contents <span id="L110" class="LineNr">110 </span> <span class="Delimiter">}</span> @@ -188,12 +188,12 @@ if ('onhashchange' in window) { <span id="L129" class="LineNr">129 </span> <span class="muControl">break-unless</span> sandbox <span id="L130" class="LineNr">130 </span> <span class="Comment"># toggle its expected-response, and save session</span> <span id="L131" class="LineNr">131 </span> sandbox <span class="Special"><-</span> toggle-expected-response sandbox -<span id="L132" class="LineNr">132 </span> save-sandboxes env, resources -<span id="L133" class="LineNr">133 </span> hide-screen screen -<span id="L134" class="LineNr">134 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render -<span id="L135" class="LineNr">135 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L132" class="LineNr">132 </span> save-sandboxes env, <a href='088file.mu.html#L11'>resources</a> +<span id="L133" class="LineNr">133 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L134" class="LineNr">134 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render +<span id="L135" class="LineNr">135 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env <span id="L136" class="LineNr">136 </span> <span class="Comment"># no change in cursor</span> -<span id="L137" class="LineNr">137 </span> show-screen screen +<span id="L137" class="LineNr">137 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L138" class="LineNr">138 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L139" class="LineNr">139 </span> <span class="Delimiter">}</span> <span id="L140" class="LineNr">140 </span>] @@ -251,11 +251,11 @@ if ('onhashchange' in window) { <span id="L192" class="LineNr">192 </span> response-is-expected?:bool <span class="Special"><-</span> equal expected-response, sandbox-response <span id="L193" class="LineNr">193 </span> <span class="Delimiter">{</span> <span id="L194" class="LineNr">194 </span> <span class="muControl">break-if</span> response-is-expected?:bool -<span id="L195" class="LineNr">195 </span> row, screen <span class="Special"><-</span> render-text screen, sandbox-response, left, right, <span class="Constant">1/red</span>, row +<span id="L195" class="LineNr">195 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-text <a href='081print.mu.html#L4'>screen</a>, sandbox-response, left, right, <span class="Constant">1/red</span>, row <span id="L196" class="LineNr">196 </span> <span class="Delimiter">}</span> <span id="L197" class="LineNr">197 </span> <span class="Delimiter">{</span> <span id="L198" class="LineNr">198 </span> <span class="muControl">break-unless</span> response-is-expected?:bool -<span id="L199" class="LineNr">199 </span> row, screen <span class="Special"><-</span> render-text screen, sandbox-response, left, right, <span class="Constant">2/green</span>, row +<span id="L199" class="LineNr">199 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-text <a href='081print.mu.html#L4'>screen</a>, sandbox-response, left, right, <span class="Constant">2/green</span>, row <span id="L200" class="LineNr">200 </span> <span class="Delimiter">}</span> <span id="L201" class="LineNr">201 </span> <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span> <span id="L202" class="LineNr">202 </span> <span class="Delimiter">}</span> diff --git a/html/edit/010-sandbox-trace.mu.html b/html/edit/010-sandbox-trace.mu.html index deaf6432..1a5147af 100644 --- a/html/edit/010-sandbox-trace.mu.html +++ b/html/edit/010-sandbox-trace.mu.html @@ -71,12 +71,12 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span><span class="Constant"> |]|</span> <span id="L13" class="LineNr"> 13 </span> ] <span id="L14" class="LineNr"> 14 </span> ] -<span id="L15" class="LineNr"> 15 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L15" class="LineNr"> 15 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L16" class="LineNr"> 16 </span> <span class="Comment"># run it</span> <span id="L17" class="LineNr"> 17 </span> assume-console [ <span id="L18" class="LineNr"> 18 </span> press F4 <span id="L19" class="LineNr"> 19 </span> ] -<span id="L20" class="LineNr"> 20 </span> event-loop screen, console, env, resources +<span id="L20" class="LineNr"> 20 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L21" class="LineNr"> 21 </span> screen-should-contain [ <span id="L22" class="LineNr"> 22 </span> <span class="Constant"> . run (F4) .</span> <span id="L23" class="LineNr"> 23 </span> <span class="Constant"> .recipe foo [ ╎ .</span> @@ -91,9 +91,9 @@ if ('onhashchange' in window) { <span id="L32" class="LineNr"> 32 </span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span> <span id="L33" class="LineNr"> 33 </span> ] <span id="L34" class="LineNr"> 34 </span> run [ -<span id="L35" class="LineNr"> 35 </span> event-loop screen, console, env, resources +<span id="L35" class="LineNr"> 35 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L36" class="LineNr"> 36 </span> cursor:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> -<span id="L37" class="LineNr"> 37 </span> print screen, cursor +<span id="L37" class="LineNr"> 37 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L38" class="LineNr"> 38 </span> ] <span id="L39" class="LineNr"> 39 </span> <span class="Comment"># trace now printed and cursor shouldn't have budged</span> <span id="L40" class="LineNr"> 40 </span> screen-should-contain [ @@ -117,8 +117,8 @@ if ('onhashchange' in window) { <span id="L58" class="LineNr"> 58 </span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 55</span> <span id="L59" class="LineNr"> 59 </span> ] <span id="L60" class="LineNr"> 60 </span> run [ -<span id="L61" class="LineNr"> 61 </span> event-loop screen, console, env, resources -<span id="L62" class="LineNr"> 62 </span> print screen, cursor +<span id="L61" class="LineNr"> 61 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> +<span id="L62" class="LineNr"> 62 </span> print <a href='081print.mu.html#L4'>screen</a>, cursor <span id="L63" class="LineNr"> 63 </span> ] <span id="L64" class="LineNr"> 64 </span> <span class="Comment"># trace hidden again</span> <span id="L65" class="LineNr"> 65 </span> screen-should-contain [ @@ -145,12 +145,12 @@ if ('onhashchange' in window) { <span id="L86" class="LineNr"> 86 </span><span class="Constant"> |]|</span> <span id="L87" class="LineNr"> 87 </span> ] <span id="L88" class="LineNr"> 88 </span> ] -<span id="L89" class="LineNr"> 89 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L89" class="LineNr"> 89 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L90" class="LineNr"> 90 </span> <span class="Comment"># run it</span> <span id="L91" class="LineNr"> 91 </span> assume-console [ <span id="L92" class="LineNr"> 92 </span> press F4 <span id="L93" class="LineNr"> 93 </span> ] -<span id="L94" class="LineNr"> 94 </span> event-loop screen, console, env, resources +<span id="L94" class="LineNr"> 94 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L95" class="LineNr"> 95 </span> screen-should-contain [ <span id="L96" class="LineNr"> 96 </span> <span class="Constant"> . run (F4) .</span> <span id="L97" class="LineNr"> 97 </span> <span class="Constant"> .recipe foo [ ╎ .</span> @@ -166,7 +166,7 @@ if ('onhashchange' in window) { <span id="L107" class="LineNr">107 </span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span> <span id="L108" class="LineNr">108 </span> ] <span id="L109" class="LineNr">109 </span> run [ -<span id="L110" class="LineNr">110 </span> event-loop screen, console, env, resources +<span id="L110" class="LineNr">110 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L111" class="LineNr">111 </span> ] <span id="L112" class="LineNr">112 </span> <span class="Comment"># trace now printed above result</span> <span id="L113" class="LineNr">113 </span> screen-should-contain [ @@ -189,13 +189,13 @@ if ('onhashchange' in window) { <span id="L130" class="LineNr">130 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">10/height</span> <span id="L131" class="LineNr">131 </span> assume-resources [ <span id="L132" class="LineNr">132 </span> ] -<span id="L133" class="LineNr">133 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[stash 123456789]</span> +<span id="L133" class="LineNr">133 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[stash 123456789]</span> <span id="L134" class="LineNr">134 </span> <span class="Comment"># create and expand the trace</span> <span id="L135" class="LineNr">135 </span> assume-console [ <span id="L136" class="LineNr">136 </span> press F4 <span id="L137" class="LineNr">137 </span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 51</span> <span id="L138" class="LineNr">138 </span> ] -<span id="L139" class="LineNr">139 </span> event-loop screen, console, env, resources +<span id="L139" class="LineNr">139 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L140" class="LineNr">140 </span> screen-should-contain [ <span id="L141" class="LineNr">141 </span> <span class="Constant"> . run (F4) .</span> <span id="L142" class="LineNr">142 </span> <span class="Constant"> . ╎ .</span> @@ -209,7 +209,7 @@ if ('onhashchange' in window) { <span id="L150" class="LineNr">150 </span> left-click<span class="Constant"> 5</span>,<span class="Constant"> 57</span> <span id="L151" class="LineNr">151 </span> ] <span id="L152" class="LineNr">152 </span> run [ -<span id="L153" class="LineNr">153 </span> event-loop screen, console, env, resources +<span id="L153" class="LineNr">153 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L154" class="LineNr">154 </span> ] <span id="L155" class="LineNr">155 </span> <span class="Comment"># no change; doesn't die</span> <span id="L156" class="LineNr">156 </span> screen-should-contain [ @@ -232,9 +232,9 @@ if ('onhashchange' in window) { <span id="L173" class="LineNr">173 </span> <span class="Constant">local-scope</span> <span id="L174" class="LineNr">174 </span> <span class="Constant">load-ingredients</span> <span id="L175" class="LineNr">175 </span> data:text <span class="Special"><-</span> get *sandbox, <span class="Constant">data:offset</span> -<span id="L176" class="LineNr">176 </span> response:text, _, fake-screen:&:screen, trace:text <span class="Special"><-</span> run-sandboxed data +<span id="L176" class="LineNr">176 </span> response:text, _, fake-screen:&:<a href='081print.mu.html#L4'>screen</a>, trace:text <span class="Special"><-</span> run-sandboxed data <span id="L177" class="LineNr">177 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">response:offset</span>, response -<span id="L178" class="LineNr">178 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen +<span id="L178" class="LineNr">178 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant"><a href='081print.mu.html#L4'>screen</a>:offset</span>, fake-screen <span id="L179" class="LineNr">179 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">trace:offset</span>, trace <span id="L180" class="LineNr">180 </span>] <span id="L181" class="LineNr">181 </span> @@ -259,11 +259,11 @@ if ('onhashchange' in window) { <span id="L200" class="LineNr">200 </span> x:bool <span class="Special"><-</span> get *sandbox, <span class="Constant">display-trace?:offset</span> <span id="L201" class="LineNr">201 </span> x <span class="Special"><-</span> not x <span id="L202" class="LineNr">202 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">display-trace?:offset</span>, x -<span id="L203" class="LineNr">203 </span> hide-screen screen -<span id="L204" class="LineNr">204 </span> screen <span class="Special"><-</span> render-sandbox-side screen, env, render -<span id="L205" class="LineNr">205 </span> screen <span class="Special"><-</span> update-cursor screen, recipes, current-sandbox, sandbox-in-focus?, env +<span id="L203" class="LineNr">203 </span> <a href='081print.mu.html#L623'>hide-screen</a> <a href='081print.mu.html#L4'>screen</a> +<span id="L204" class="LineNr">204 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-sandbox-side <a href='081print.mu.html#L4'>screen</a>, env, render +<span id="L205" class="LineNr">205 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> update-cursor <a href='081print.mu.html#L4'>screen</a>, recipes, current-sandbox, sandbox-in-focus?, env <span id="L206" class="LineNr">206 </span> <span class="Comment"># no change in cursor</span> -<span id="L207" class="LineNr">207 </span> show-screen screen +<span id="L207" class="LineNr">207 </span> <a href='081print.mu.html#L631'>show-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L208" class="LineNr">208 </span> <span class="muControl">loop</span> <span class="Constant">+next-event</span> <span id="L209" class="LineNr">209 </span> <span class="Delimiter">}</span> <span id="L210" class="LineNr">210 </span>] @@ -306,7 +306,7 @@ if ('onhashchange' in window) { <span id="L247" class="LineNr">247 </span> <span class="muControl">break-unless</span> display-trace? <span id="L248" class="LineNr">248 </span> sandbox-trace:text <span class="Special"><-</span> get *sandbox, <span class="Constant">trace:offset</span> <span id="L249" class="LineNr">249 </span> <span class="muControl">break-unless</span> sandbox-trace <span class="Comment"># nothing to print; move on</span> -<span id="L250" class="LineNr">250 </span> row, screen <span class="Special"><-</span> render-text screen, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row +<span id="L250" class="LineNr">250 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-text <a href='081print.mu.html#L4'>screen</a>, sandbox-trace, left, right, <span class="Constant">245/grey</span>, row <span id="L251" class="LineNr">251 </span> <span class="Delimiter">}</span> <span id="L252" class="LineNr">252 </span><span class="Constant"> <render-sandbox-trace-done></span> <span id="L253" class="LineNr">253 </span>] diff --git a/html/edit/011-errors.mu.html b/html/edit/011-errors.mu.html index 73ca5b93..03b629e2 100644 --- a/html/edit/011-errors.mu.html +++ b/html/edit/011-errors.mu.html @@ -64,18 +64,18 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span>] <span id="L6" class="LineNr"> 6 </span> <span id="L7" class="LineNr"> 7 </span><span class="Comment"># copy code from recipe editor, persist to disk, load, save any errors</span> -<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def!</span> update-recipes env:&:environment, resources:&:resources, screen:&:screen<span class="muRecipe"> -> </span>errors-found?:bool, env:&:environment, resources:&:resources, screen:&:screen [ +<span id="L8" class="LineNr"> 8 </span><span class="muRecipe">def!</span> update-recipes env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>errors-found?:bool, env:&:environment, <a href='088file.mu.html#L11'>resources</a>:&:<a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L9" class="LineNr"> 9 </span> <span class="Constant">local-scope</span> <span id="L10" class="LineNr"> 10 </span> <span class="Constant">load-ingredients</span> <span id="L11" class="LineNr"> 11 </span> recipes:&:editor <span class="Special"><-</span> get *env, <span class="Constant">recipes:offset</span> <span id="L12" class="LineNr"> 12 </span> in:text <span class="Special"><-</span> editor-contents recipes -<span id="L13" class="LineNr"> 13 </span> resources <span class="Special"><-</span> dump resources, <span class="Constant">[lesson/recipes.mu]</span>, in +<span id="L13" class="LineNr"> 13 </span> <a href='088file.mu.html#L11'>resources</a> <span class="Special"><-</span> <a href='088file.mu.html#L127'>dump</a> <a href='088file.mu.html#L11'>resources</a>, <span class="Constant">[lesson/recipes.mu]</span>, in <span id="L14" class="LineNr"> 14 </span> recipe-errors:text <span class="Special"><-</span> reload in <span id="L15" class="LineNr"> 15 </span> *env <span class="Special"><-</span> put *env, <span class="Constant">recipe-errors:offset</span>, recipe-errors <span id="L16" class="LineNr"> 16 </span> <span class="Comment"># if recipe editor has errors, stop</span> <span id="L17" class="LineNr"> 17 </span> <span class="Delimiter">{</span> <span id="L18" class="LineNr"> 18 </span> <span class="muControl">break-unless</span> recipe-errors -<span id="L19" class="LineNr"> 19 </span> update-status screen, <span class="Constant">[errors found ]</span>, <span class="Constant">1/red</span> +<span id="L19" class="LineNr"> 19 </span> update-status <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[errors found ]</span>, <span class="Constant">1/red</span> <span id="L20" class="LineNr"> 20 </span> errors-found? <span class="Special"><-</span> copy <span class="Constant">1/true</span> <span id="L21" class="LineNr"> 21 </span> <span class="muControl">return</span> <span id="L22" class="LineNr"> 22 </span> <span class="Delimiter">}</span> @@ -87,7 +87,7 @@ if ('onhashchange' in window) { <span id="L28" class="LineNr"> 28 </span> recipe-errors:text <span class="Special"><-</span> get *env, <span class="Constant">recipe-errors:offset</span> <span id="L29" class="LineNr"> 29 </span> <span class="Delimiter">{</span> <span id="L30" class="LineNr"> 30 </span> <span class="muControl">break-unless</span> recipe-errors -<span id="L31" class="LineNr"> 31 </span> update-status screen, <span class="Constant">[errors found ]</span>, <span class="Constant">1/red</span> +<span id="L31" class="LineNr"> 31 </span> update-status <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[errors found ]</span>, <span class="Constant">1/red</span> <span id="L32" class="LineNr"> 32 </span> <span class="Delimiter">}</span> <span id="L33" class="LineNr"> 33 </span>] <span id="L34" class="LineNr"> 34 </span> @@ -95,7 +95,7 @@ if ('onhashchange' in window) { <span id="L36" class="LineNr"> 36 </span> <span class="Delimiter">{</span> <span id="L37" class="LineNr"> 37 </span> recipe-errors:text <span class="Special"><-</span> get *env, <span class="Constant">recipe-errors:offset</span> <span id="L38" class="LineNr"> 38 </span> <span class="muControl">break-unless</span> recipe-errors -<span id="L39" class="LineNr"> 39 </span> row, screen <span class="Special"><-</span> render-text screen, recipe-errors, left, right, <span class="Constant">1/red</span>, row +<span id="L39" class="LineNr"> 39 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-text <a href='081print.mu.html#L4'>screen</a>, recipe-errors, left, right, <span class="Constant">1/red</span>, row <span id="L40" class="LineNr"> 40 </span> <span class="Delimiter">}</span> <span id="L41" class="LineNr"> 41 </span>] <span id="L42" class="LineNr"> 42 </span> @@ -127,8 +127,8 @@ if ('onhashchange' in window) { <span id="L68" class="LineNr"> 68 </span> sandboxes-completed-successfully?:bool <span class="Special"><-</span> equal error-index,<span class="Constant"> -1</span> <span id="L69" class="LineNr"> 69 </span> <span class="muControl">break-if</span> sandboxes-completed-successfully? <span id="L70" class="LineNr"> 70 </span> error-index-text:text <span class="Special"><-</span> to-text error-index -<span id="L71" class="LineNr"> 71 </span> status:text <span class="Special"><-</span> interpolate <span class="Constant">[errors found (_) ]</span>, error-index-text -<span id="L72" class="LineNr"> 72 </span> update-status screen, status, <span class="Constant">1/red</span> +<span id="L71" class="LineNr"> 71 </span> status:text <span class="Special"><-</span> <a href='061text.mu.html#L506'>interpolate</a> <span class="Constant">[errors found (_) ]</span>, error-index-text +<span id="L72" class="LineNr"> 72 </span> update-status <a href='081print.mu.html#L4'>screen</a>, status, <span class="Constant">1/red</span> <span id="L73" class="LineNr"> 73 </span> <span class="Delimiter">}</span> <span id="L74" class="LineNr"> 74 </span>] <span id="L75" class="LineNr"> 75 </span> @@ -140,10 +140,10 @@ if ('onhashchange' in window) { <span id="L81" class="LineNr"> 81 </span> <span class="Constant">local-scope</span> <span id="L82" class="LineNr"> 82 </span> <span class="Constant">load-ingredients</span> <span id="L83" class="LineNr"> 83 </span> data:text <span class="Special"><-</span> get *sandbox, <span class="Constant">data:offset</span> -<span id="L84" class="LineNr"> 84 </span> response:text, errors:text, fake-screen:&:screen, trace:text, completed?:bool <span class="Special"><-</span> run-sandboxed data +<span id="L84" class="LineNr"> 84 </span> response:text, errors:text, fake-screen:&:<a href='081print.mu.html#L4'>screen</a>, trace:text, completed?:bool <span class="Special"><-</span> run-sandboxed data <span id="L85" class="LineNr"> 85 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">response:offset</span>, response <span id="L86" class="LineNr"> 86 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">errors:offset</span>, errors -<span id="L87" class="LineNr"> 87 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">screen:offset</span>, fake-screen +<span id="L87" class="LineNr"> 87 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant"><a href='081print.mu.html#L4'>screen</a>:offset</span>, fake-screen <span id="L88" class="LineNr"> 88 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">trace:offset</span>, trace <span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">{</span> <span id="L90" class="LineNr"> 90 </span> <span class="muControl">break-if</span> errors @@ -167,7 +167,7 @@ if ('onhashchange' in window) { <span id="L108" class="LineNr">108 </span> sandbox-errors:text <span class="Special"><-</span> get *sandbox, <span class="Constant">errors:offset</span> <span id="L109" class="LineNr">109 </span> <span class="muControl">break-unless</span> sandbox-errors <span id="L110" class="LineNr">110 </span> *sandbox <span class="Special"><-</span> put *sandbox, <span class="Constant">response-starting-row-on-screen:offset</span>,<span class="Constant"> 0</span> <span class="Comment"># no response</span> -<span id="L111" class="LineNr">111 </span> row, screen <span class="Special"><-</span> render-text screen, sandbox-errors, left, right, <span class="Constant">1/red</span>, row +<span id="L111" class="LineNr">111 </span> row, <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> render-text <a href='081print.mu.html#L4'>screen</a>, sandbox-errors, left, right, <span class="Constant">1/red</span>, row <span id="L112" class="LineNr">112 </span> <span class="Comment"># don't try to print anything more for this sandbox</span> <span id="L113" class="LineNr">113 </span> <span class="muControl">jump</span> <span class="Constant">+render-sandbox-end</span> <span id="L114" class="LineNr">114 </span> <span class="Delimiter">}</span> @@ -184,8 +184,8 @@ if ('onhashchange' in window) { <span id="L125" class="LineNr">125 </span><span class="Constant"> |]</span>| <span id="L126" class="LineNr">126 </span> ] <span id="L127" class="LineNr">127 </span> ] -<span id="L128" class="LineNr">128 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> -<span id="L129" class="LineNr">129 </span> render-all screen, env, render +<span id="L128" class="LineNr">128 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> +<span id="L129" class="LineNr">129 </span> render-all <a href='081print.mu.html#L4'>screen</a>, env, render <span id="L130" class="LineNr">130 </span> screen-should-contain [ <span id="L131" class="LineNr">131 </span> <span class="Constant"> . run (F4) .</span> <span id="L132" class="LineNr">132 </span> <span class="Constant"> .recipe foo [ ╎foo .</span> @@ -199,7 +199,7 @@ if ('onhashchange' in window) { <span id="L140" class="LineNr">140 </span> press F4 <span id="L141" class="LineNr">141 </span> ] <span id="L142" class="LineNr">142 </span> run [ -<span id="L143" class="LineNr">143 </span> event-loop screen, console, env, resources +<span id="L143" class="LineNr">143 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L144" class="LineNr">144 </span> ] <span id="L145" class="LineNr">145 </span> screen-should-contain [ <span id="L146" class="LineNr">146 </span> <span class="Constant"> . errors found run (F4) .</span> @@ -232,7 +232,7 @@ if ('onhashchange' in window) { <span id="L173" class="LineNr">173 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> <span id="L174" class="LineNr">174 </span> assume-resources [ <span id="L175" class="LineNr">175 </span> ] -<span id="L176" class="LineNr">176 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> +<span id="L176" class="LineNr">176 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> <span id="L177" class="LineNr">177 </span> assume-console [ <span id="L178" class="LineNr">178 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 80</span> <span id="L179" class="LineNr">179 </span> <span class="Comment"># create invalid sandbox 1</span> @@ -243,7 +243,7 @@ if ('onhashchange' in window) { <span id="L184" class="LineNr">184 </span> press F4 <span id="L185" class="LineNr">185 </span> ] <span id="L186" class="LineNr">186 </span> run [ -<span id="L187" class="LineNr">187 </span> event-loop screen, console, env, resources +<span id="L187" class="LineNr">187 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L188" class="LineNr">188 </span> ] <span id="L189" class="LineNr">189 </span> <span class="Comment"># status line shows that error is in first sandbox</span> <span id="L190" class="LineNr">190 </span> screen-should-contain [ @@ -257,7 +257,7 @@ if ('onhashchange' in window) { <span id="L198" class="LineNr">198 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> <span id="L199" class="LineNr">199 </span> assume-resources [ <span id="L200" class="LineNr">200 </span> ] -<span id="L201" class="LineNr">201 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[]</span> +<span id="L201" class="LineNr">201 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[]</span> <span id="L202" class="LineNr">202 </span> assume-console [ <span id="L203" class="LineNr">203 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 80</span> <span id="L204" class="LineNr">204 </span> <span class="Comment"># create invalid sandbox 2</span> @@ -271,7 +271,7 @@ if ('onhashchange' in window) { <span id="L212" class="LineNr">212 </span> press F4 <span id="L213" class="LineNr">213 </span> ] <span id="L214" class="LineNr">214 </span> run [ -<span id="L215" class="LineNr">215 </span> event-loop screen, console, env, resources +<span id="L215" class="LineNr">215 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L216" class="LineNr">216 </span> ] <span id="L217" class="LineNr">217 </span> <span class="Comment"># status line shows that error is in second sandbox</span> <span id="L218" class="LineNr">218 </span> screen-should-contain [ @@ -285,11 +285,11 @@ if ('onhashchange' in window) { <span id="L226" class="LineNr">226 </span> assume-screen <span class="Constant">100/width</span>, <span class="Constant">15/height</span> <span id="L227" class="LineNr">227 </span> assume-resources [ <span id="L228" class="LineNr">228 </span> ] -<span id="L229" class="LineNr">229 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[get foo, x:offset]</span> <span class="Comment"># invalid</span> +<span id="L229" class="LineNr">229 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[get foo, x:offset]</span> <span class="Comment"># invalid</span> <span id="L230" class="LineNr">230 </span> assume-console [ <span id="L231" class="LineNr">231 </span> press F4 <span class="Comment"># generate error</span> <span id="L232" class="LineNr">232 </span> ] -<span id="L233" class="LineNr">233 </span> event-loop screen, console, env, resources +<span id="L233" class="LineNr">233 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L234" class="LineNr">234 </span> assume-console [ <span id="L235" class="LineNr">235 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 58</span> <span id="L236" class="LineNr">236 </span> press ctrl-k @@ -297,7 +297,7 @@ if ('onhashchange' in window) { <span id="L238" class="LineNr">238 </span> press F4 <span class="Comment"># update sandbox</span> <span id="L239" class="LineNr">239 </span> ] <span id="L240" class="LineNr">240 </span> run [ -<span id="L241" class="LineNr">241 </span> event-loop screen, console, env, resources +<span id="L241" class="LineNr">241 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L242" class="LineNr">242 </span> ] <span id="L243" class="LineNr">243 </span> <span class="Comment"># error should disappear</span> <span id="L244" class="LineNr">244 </span> screen-should-contain [ @@ -327,11 +327,11 @@ if ('onhashchange' in window) { <span id="L268" class="LineNr">268 </span><span class="Constant"> |]</span>| <span id="L269" class="LineNr">269 </span> ] <span id="L270" class="LineNr">270 </span> ] -<span id="L271" class="LineNr">271 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo 2]</span> +<span id="L271" class="LineNr">271 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo 2]</span> <span id="L272" class="LineNr">272 </span> assume-console [ <span id="L273" class="LineNr">273 </span> press F4 <span id="L274" class="LineNr">274 </span> ] -<span id="L275" class="LineNr">275 </span> event-loop screen, console, env, resources +<span id="L275" class="LineNr">275 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L276" class="LineNr">276 </span> screen-should-contain [ <span id="L277" class="LineNr">277 </span> <span class="Constant"> . errors found (0) run (F4) .</span> <span id="L278" class="LineNr">278 </span> <span class="Constant"> .recipe foo x:_elem -> z:_elem [ ╎ .</span> @@ -349,7 +349,7 @@ if ('onhashchange' in window) { <span id="L290" class="LineNr">290 </span> press F4 <span id="L291" class="LineNr">291 </span> ] <span id="L292" class="LineNr">292 </span> run [ -<span id="L293" class="LineNr">293 </span> event-loop screen, console, env, resources +<span id="L293" class="LineNr">293 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L294" class="LineNr">294 </span> ] <span id="L295" class="LineNr">295 </span> <span class="Comment"># error should remain unchanged</span> <span id="L296" class="LineNr">296 </span> screen-should-contain [ @@ -380,12 +380,12 @@ if ('onhashchange' in window) { <span id="L321" class="LineNr">321 </span> <span class="Comment"># call code that uses other variants of it, but not it itself</span> <span id="L322" class="LineNr">322 </span> test-sandbox:text <span class="Special"><-</span> new <span class="Constant">[x:&:list:num <- copy 0</span> <span id="L323" class="LineNr">323 </span><span class="Constant">to-text x]</span> -<span id="L324" class="LineNr">324 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, test-sandbox +<span id="L324" class="LineNr">324 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, test-sandbox <span id="L325" class="LineNr">325 </span> <span class="Comment"># run it once</span> <span id="L326" class="LineNr">326 </span> assume-console [ <span id="L327" class="LineNr">327 </span> press F4 <span id="L328" class="LineNr">328 </span> ] -<span id="L329" class="LineNr">329 </span> event-loop screen, console, env, resources +<span id="L329" class="LineNr">329 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</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> <span id="L331" class="LineNr">331 </span> screen-should-contain-in-color <span class="Constant">1/red</span>, [ <span id="L332" class="LineNr">332 </span> <span class="Constant"> . .</span> @@ -409,7 +409,7 @@ if ('onhashchange' in window) { <span id="L350" class="LineNr">350 </span> press F4 <span id="L351" class="LineNr">351 </span> ] <span id="L352" class="LineNr">352 </span> run [ -<span id="L353" class="LineNr">353 </span> event-loop screen, console, env, resources +<span id="L353" class="LineNr">353 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L354" class="LineNr">354 </span> ] <span id="L355" class="LineNr">355 </span> <span class="Comment"># still no errors</span> <span id="L356" class="LineNr">356 </span> screen-should-contain-in-color <span class="Constant">1/red</span>, [ @@ -442,12 +442,12 @@ if ('onhashchange' in window) { <span id="L383" class="LineNr">383 </span><span class="Constant"> |]</span>| <span id="L384" class="LineNr">384 </span> ] <span id="L385" class="LineNr">385 </span> ] -<span id="L386" class="LineNr">386 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L386" class="LineNr">386 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L387" class="LineNr">387 </span> assume-console [ <span id="L388" class="LineNr">388 </span> press F4 <span id="L389" class="LineNr">389 </span> ] <span id="L390" class="LineNr">390 </span> run [ -<span id="L391" class="LineNr">391 </span> event-loop screen, console, env, resources +<span id="L391" class="LineNr">391 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L392" class="LineNr">392 </span> ] <span id="L393" class="LineNr">393 </span> screen-should-contain [ <span id="L394" class="LineNr">394 </span> <span class="Constant"> . errors found run (F4) .</span> @@ -473,12 +473,12 @@ if ('onhashchange' in window) { <span id="L414" class="LineNr">414 </span><span class="Constant"> | x <- copy 0|</span> <span id="L415" class="LineNr">415 </span><span class="Constant"> ]</span> <span id="L416" class="LineNr">416 </span> ] -<span id="L417" class="LineNr">417 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L417" class="LineNr">417 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L418" class="LineNr">418 </span> assume-console [ <span id="L419" class="LineNr">419 </span> press F4 <span id="L420" class="LineNr">420 </span> ] <span id="L421" class="LineNr">421 </span> run [ -<span id="L422" class="LineNr">422 </span> event-loop screen, console, env, resources +<span id="L422" class="LineNr">422 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L423" class="LineNr">423 </span> ] <span id="L424" class="LineNr">424 </span> screen-should-contain [ <span id="L425" class="LineNr">425 </span> <span class="Constant"> . errors found run (F4) .</span> @@ -504,12 +504,12 @@ if ('onhashchange' in window) { <span id="L445" class="LineNr">445 </span><span class="Constant"> |]</span>| <span id="L446" class="LineNr">446 </span> ] <span id="L447" class="LineNr">447 </span> ] -<span id="L448" class="LineNr">448 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L448" class="LineNr">448 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L449" class="LineNr">449 </span> assume-console [ <span id="L450" class="LineNr">450 </span> press F4 <span id="L451" class="LineNr">451 </span> ] <span id="L452" class="LineNr">452 </span> run [ -<span id="L453" class="LineNr">453 </span> event-loop screen, console, env, resources +<span id="L453" class="LineNr">453 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L454" class="LineNr">454 </span> ] <span id="L455" class="LineNr">455 </span> screen-should-contain [ <span id="L456" class="LineNr">456 </span> <span class="Constant"> . errors found run (F4) .</span> @@ -540,12 +540,12 @@ if ('onhashchange' in window) { <span id="L481" class="LineNr">481 </span><span class="Constant"> |]</span>| <span id="L482" class="LineNr">482 </span> ] <span id="L483" class="LineNr">483 </span> ] -<span id="L484" class="LineNr">484 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L484" class="LineNr">484 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L485" class="LineNr">485 </span> assume-console [ <span id="L486" class="LineNr">486 </span> press F4 <span id="L487" class="LineNr">487 </span> ] <span id="L488" class="LineNr">488 </span> run [ -<span id="L489" class="LineNr">489 </span> event-loop screen, console, env, resources +<span id="L489" class="LineNr">489 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L490" class="LineNr">490 </span> ] <span id="L491" class="LineNr">491 </span> screen-should-contain [ <span id="L492" class="LineNr">492 </span> <span class="Constant"> . errors found run (F4) .</span> @@ -576,11 +576,11 @@ if ('onhashchange' in window) { <span id="L517" class="LineNr">517 </span><span class="Constant"> |]</span>| <span id="L518" class="LineNr">518 </span> ] <span id="L519" class="LineNr">519 </span> ] -<span id="L520" class="LineNr">520 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L520" class="LineNr">520 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L521" class="LineNr">521 </span> assume-console [ <span id="L522" class="LineNr">522 </span> press F4 <span id="L523" class="LineNr">523 </span> ] -<span id="L524" class="LineNr">524 </span> event-loop screen, console, env, resources +<span id="L524" class="LineNr">524 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L525" class="LineNr">525 </span> screen-should-contain [ <span id="L526" class="LineNr">526 </span> <span class="Constant"> . errors found run (F4) .</span> <span id="L527" class="LineNr">527 </span> <span class="Constant"> .recipe foo [ ╎foo .</span> @@ -598,7 +598,7 @@ if ('onhashchange' in window) { <span id="L539" class="LineNr">539 </span> press F4 <span id="L540" class="LineNr">540 </span> ] <span id="L541" class="LineNr">541 </span> run [ -<span id="L542" class="LineNr">542 </span> event-loop screen, console, env, resources +<span id="L542" class="LineNr">542 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L543" class="LineNr">543 </span> ] <span id="L544" class="LineNr">544 </span> screen-should-contain [ <span id="L545" class="LineNr">545 </span> <span class="Constant"> . errors found run (F4) .</span> @@ -621,12 +621,12 @@ if ('onhashchange' in window) { <span id="L562" class="LineNr">562 </span> assume-resources [ <span id="L563" class="LineNr">563 </span> ] <span id="L564" class="LineNr">564 </span> <span class="Comment"># sandbox editor contains an illegal instruction</span> -<span id="L565" class="LineNr">565 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[get 1234:num, foo:offset]</span> +<span id="L565" class="LineNr">565 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[get 1234:num, foo:offset]</span> <span id="L566" class="LineNr">566 </span> assume-console [ <span id="L567" class="LineNr">567 </span> press F4 <span id="L568" class="LineNr">568 </span> ] <span id="L569" class="LineNr">569 </span> run [ -<span id="L570" class="LineNr">570 </span> event-loop screen, console, env, resources +<span id="L570" class="LineNr">570 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L571" class="LineNr">571 </span> ] <span id="L572" class="LineNr">572 </span> <span class="Comment"># check that screen prints error message in red</span> <span id="L573" class="LineNr">573 </span> screen-should-contain [ @@ -683,14 +683,14 @@ if ('onhashchange' in window) { <span id="L624" class="LineNr">624 </span> assume-resources [ <span id="L625" class="LineNr">625 </span> ] <span id="L626" class="LineNr">626 </span> <span class="Comment"># sandbox editor contains an illegal instruction</span> -<span id="L627" class="LineNr">627 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[get 1234:num, foo:offset]</span> +<span id="L627" class="LineNr">627 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[get 1234:num, foo:offset]</span> <span id="L628" class="LineNr">628 </span> <span class="Comment"># run the code in the editors multiple times</span> <span id="L629" class="LineNr">629 </span> assume-console [ <span id="L630" class="LineNr">630 </span> press F4 <span id="L631" class="LineNr">631 </span> press F4 <span id="L632" class="LineNr">632 </span> ] <span id="L633" class="LineNr">633 </span> run [ -<span id="L634" class="LineNr">634 </span> event-loop screen, console, env, resources +<span id="L634" class="LineNr">634 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L635" class="LineNr">635 </span> ] <span id="L636" class="LineNr">636 </span> <span class="Comment"># check that screen prints error message just once</span> <span id="L637" class="LineNr">637 </span> screen-should-contain [ @@ -721,13 +721,13 @@ if ('onhashchange' in window) { <span id="L662" class="LineNr">662 </span><span class="Constant"> |]</span>| <span id="L663" class="LineNr">663 </span> ] <span id="L664" class="LineNr">664 </span> ] -<span id="L665" class="LineNr">665 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo]</span> +<span id="L665" class="LineNr">665 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo]</span> <span id="L666" class="LineNr">666 </span> <span class="Comment"># run the sandbox</span> <span id="L667" class="LineNr">667 </span> assume-console [ <span id="L668" class="LineNr">668 </span> press F4 <span id="L669" class="LineNr">669 </span> ] <span id="L670" class="LineNr">670 </span> run [ -<span id="L671" class="LineNr">671 </span> event-loop screen, console, env, resources +<span id="L671" class="LineNr">671 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L672" class="LineNr">672 </span> ] <span id="L673" class="LineNr">673 </span> screen-should-contain [ <span id="L674" class="LineNr">674 </span> <span class="Constant"> . errors found (0) run (F4) .</span> @@ -759,12 +759,12 @@ if ('onhashchange' in window) { <span id="L700" class="LineNr">700 </span><span class="Constant"> |]|</span> <span id="L701" class="LineNr">701 </span> ] <span id="L702" class="LineNr">702 </span> ] -<span id="L703" class="LineNr">703 </span> env:&:environment <span class="Special"><-</span> new-programming-environment resources, screen, <span class="Constant">[foo 4, 0]</span> +<span id="L703" class="LineNr">703 </span> env:&:environment <span class="Special"><-</span> new-programming-environment <a href='088file.mu.html#L11'>resources</a>, <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[foo 4, 0]</span> <span id="L704" class="LineNr">704 </span> <span class="Comment"># run</span> <span id="L705" class="LineNr">705 </span> assume-console [ <span id="L706" class="LineNr">706 </span> press F4 <span id="L707" class="LineNr">707 </span> ] -<span id="L708" class="LineNr">708 </span> event-loop screen, console, env, resources +<span id="L708" class="LineNr">708 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L709" class="LineNr">709 </span> <span class="Comment"># screen prints error message</span> <span id="L710" class="LineNr">710 </span> screen-should-contain [ <span id="L711" class="LineNr">711 </span> <span class="Constant"> . errors found (0) run (F4) .</span> @@ -783,7 +783,7 @@ if ('onhashchange' in window) { <span id="L724" class="LineNr">724 </span> left-click<span class="Constant"> 4</span>,<span class="Constant"> 55</span> <span id="L725" class="LineNr">725 </span> ] <span id="L726" class="LineNr">726 </span> run [ -<span id="L727" class="LineNr">727 </span> event-loop screen, console, env, resources +<span id="L727" class="LineNr">727 </span> event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, env, <a href='088file.mu.html#L11'>resources</a> <span id="L728" class="LineNr">728 </span> ] <span id="L729" class="LineNr">729 </span> <span class="Comment"># screen should expand trace</span> <span id="L730" class="LineNr">730 </span> screen-should-contain [ diff --git a/html/edit/012-editor-undo.mu.html b/html/edit/012-editor-undo.mu.html index 5f230660..00996c79 100644 --- a/html/edit/012-editor-undo.mu.html +++ b/html/edit/012-editor-undo.mu.html @@ -127,7 +127,7 @@ if ('onhashchange' in window) { <span id="L68" class="LineNr"> 68 </span> undo:&:list:&:operation <span class="Special"><-</span> get *editor, <span class="Constant">undo:offset</span> <span id="L69" class="LineNr"> 69 </span> <span class="muControl">break-unless</span> undo <span id="L70" class="LineNr"> 70 </span> op:&:operation <span class="Special"><-</span> first undo -<span id="L71" class="LineNr"> 71 </span> undo <span class="Special"><-</span> rest undo +<span id="L71" class="LineNr"> 71 </span> undo <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> undo <span id="L72" class="LineNr"> 72 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">undo:offset</span>, undo <span id="L73" class="LineNr"> 73 </span> redo:&:list:&:operation <span class="Special"><-</span> get *editor, <span class="Constant">redo:offset</span> <span id="L74" class="LineNr"> 74 </span> redo <span class="Special"><-</span> push op, redo @@ -145,7 +145,7 @@ if ('onhashchange' in window) { <span id="L86" class="LineNr"> 86 </span> redo:&:list:&:operation <span class="Special"><-</span> get *editor, <span class="Constant">redo:offset</span> <span id="L87" class="LineNr"> 87 </span> <span class="muControl">break-unless</span> redo <span id="L88" class="LineNr"> 88 </span> op:&:operation <span class="Special"><-</span> first redo -<span id="L89" class="LineNr"> 89 </span> redo <span class="Special"><-</span> rest redo +<span id="L89" class="LineNr"> 89 </span> redo <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> redo <span id="L90" class="LineNr"> 90 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">redo:offset</span>, redo <span id="L91" class="LineNr"> 91 </span> undo:&:list:&:operation <span class="Special"><-</span> get *editor, <span class="Constant">undo:offset</span> <span id="L92" class="LineNr"> 92 </span> undo <span class="Special"><-</span> push op, undo @@ -162,17 +162,17 @@ if ('onhashchange' in window) { <span id="L103" class="LineNr"> 103 </span> <span class="Comment"># create an editor and type a character</span> <span id="L104" class="LineNr"> 104 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L105" class="LineNr"> 105 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L106" class="LineNr"> 106 </span> editor-render screen, e +<span id="L106" class="LineNr"> 106 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L107" class="LineNr"> 107 </span> assume-console [ <span id="L108" class="LineNr"> 108 </span> type <span class="Constant">[0]</span> <span id="L109" class="LineNr"> 109 </span> ] -<span id="L110" class="LineNr"> 110 </span> editor-event-loop screen, console, e +<span id="L110" class="LineNr"> 110 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L111" class="LineNr"> 111 </span> <span class="Comment"># undo</span> <span id="L112" class="LineNr"> 112 </span> assume-console [ <span id="L113" class="LineNr"> 113 </span> press ctrl-z <span id="L114" class="LineNr"> 114 </span> ] <span id="L115" class="LineNr"> 115 </span> run [ -<span id="L116" class="LineNr"> 116 </span> editor-event-loop screen, console, e +<span id="L116" class="LineNr"> 116 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L117" class="LineNr"> 117 </span> ] <span id="L118" class="LineNr"> 118 </span> <span class="Comment"># character should be gone</span> <span id="L119" class="LineNr"> 119 </span> screen-should-contain [ @@ -186,7 +186,7 @@ if ('onhashchange' in window) { <span id="L127" class="LineNr"> 127 </span> type <span class="Constant">[1]</span> <span id="L128" class="LineNr"> 128 </span> ] <span id="L129" class="LineNr"> 129 </span> run [ -<span id="L130" class="LineNr"> 130 </span> editor-event-loop screen, console, e +<span id="L130" class="LineNr"> 130 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L131" class="LineNr"> 131 </span> ] <span id="L132" class="LineNr"> 132 </span> screen-should-contain [ <span id="L133" class="LineNr"> 133 </span> <span class="Constant"> . .</span> @@ -215,7 +215,7 @@ if ('onhashchange' in window) { <span id="L156" class="LineNr"> 156 </span> previous-coalesce-tag:num <span class="Special"><-</span> get typing, <span class="Constant">tag:offset</span> <span id="L157" class="LineNr"> 157 </span> <span class="muControl">break-unless</span> previous-coalesce-tag <span id="L158" class="LineNr"> 158 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> -<span id="L159" class="LineNr"> 159 </span> insert-until:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L159" class="LineNr"> 159 </span> insert-until:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L160" class="LineNr"> 160 </span> typing <span class="Special"><-</span> put typing, <span class="Constant">insert-until:offset</span>, insert-until <span id="L161" class="LineNr"> 161 </span> typing <span class="Special"><-</span> put typing, <span class="Constant">after-row:offset</span>, cursor-row <span id="L162" class="LineNr"> 162 </span> typing <span class="Special"><-</span> put typing, <span class="Constant">after-column:offset</span>, cursor-column @@ -224,8 +224,8 @@ if ('onhashchange' in window) { <span id="L165" class="LineNr"> 165 </span> <span class="muControl">break</span> <span class="Constant">+done-adding-insert-operation</span> <span id="L166" class="LineNr"> 166 </span> <span class="Delimiter">}</span> <span id="L167" class="LineNr"> 167 </span> <span class="Comment"># if not, create a new operation</span> -<span id="L168" class="LineNr"> 168 </span> insert-from:&:duplex-list:char <span class="Special"><-</span> next cursor-before -<span id="L169" class="LineNr"> 169 </span> insert-to:&:duplex-list:char <span class="Special"><-</span> next insert-from +<span id="L168" class="LineNr"> 168 </span> insert-from:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> cursor-before +<span id="L169" class="LineNr"> 169 </span> insert-to:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> insert-from <span id="L170" class="LineNr"> 170 </span> op:&:operation <span class="Special"><-</span> new <span class="Constant">operation:type</span> <span id="L171" class="LineNr"> 171 </span> *op <span class="Special"><-</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> <span id="L172" class="LineNr"> 172 </span> editor <span class="Special"><-</span> add-operation editor, op @@ -244,9 +244,9 @@ if ('onhashchange' in window) { <span id="L185" class="LineNr"> 185 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L186" class="LineNr"> 186 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L187" class="LineNr"> 187 </span> <span class="Comment"># never coalesce</span> -<span id="L188" class="LineNr"> 188 </span> insert-from:&:duplex-list:char <span class="Special"><-</span> next cursor-before +<span id="L188" class="LineNr"> 188 </span> insert-from:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> cursor-before <span id="L189" class="LineNr"> 189 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> -<span id="L190" class="LineNr"> 190 </span> insert-to:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L190" class="LineNr"> 190 </span> insert-to:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L191" class="LineNr"> 191 </span> op:&:operation <span class="Special"><-</span> new <span class="Constant">operation:type</span> <span id="L192" class="LineNr"> 192 </span> *op <span class="Special"><-</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> <span id="L193" class="LineNr"> 193 </span> editor <span class="Special"><-</span> add-operation editor, op @@ -274,9 +274,9 @@ if ('onhashchange' in window) { <span id="L215" class="LineNr"> 215 </span> start:&:duplex-list:char <span class="Special"><-</span> get typing, <span class="Constant">insert-from:offset</span> <span id="L216" class="LineNr"> 216 </span> end:&:duplex-list:char <span class="Special"><-</span> get typing, <span class="Constant">insert-until:offset</span> <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> -<span id="L218" class="LineNr"> 218 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> prev start +<span id="L218" class="LineNr"> 218 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L36'>prev</a> start <span id="L219" class="LineNr"> 219 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">before-cursor:offset</span>, before-cursor -<span id="L220" class="LineNr"> 220 </span> remove-between before-cursor, end +<span id="L220" class="LineNr"> 220 </span> <a href='065duplex_list.mu.html#L345'>remove-between</a> before-cursor, end <span id="L221" class="LineNr"> 221 </span> cursor-row <span class="Special"><-</span> get typing, <span class="Constant">before-row:offset</span> <span id="L222" class="LineNr"> 222 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row <span id="L223" class="LineNr"> 223 </span> cursor-column <span class="Special"><-</span> get typing, <span class="Constant">before-column:offset</span> @@ -291,17 +291,17 @@ if ('onhashchange' in window) { <span id="L232" class="LineNr"> 232 </span> <span class="Comment"># create an editor and type multiple characters</span> <span id="L233" class="LineNr"> 233 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L234" class="LineNr"> 234 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L235" class="LineNr"> 235 </span> editor-render screen, e +<span id="L235" class="LineNr"> 235 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L236" class="LineNr"> 236 </span> assume-console [ <span id="L237" class="LineNr"> 237 </span> type <span class="Constant">[012]</span> <span id="L238" class="LineNr"> 238 </span> ] -<span id="L239" class="LineNr"> 239 </span> editor-event-loop screen, console, e +<span id="L239" class="LineNr"> 239 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L240" class="LineNr"> 240 </span> <span class="Comment"># undo</span> <span id="L241" class="LineNr"> 241 </span> assume-console [ <span id="L242" class="LineNr"> 242 </span> press ctrl-z <span id="L243" class="LineNr"> 243 </span> ] <span id="L244" class="LineNr"> 244 </span> run [ -<span id="L245" class="LineNr"> 245 </span> editor-event-loop screen, console, e +<span id="L245" class="LineNr"> 245 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L246" class="LineNr"> 246 </span> ] <span id="L247" class="LineNr"> 247 </span> <span class="Comment"># all characters must be gone</span> <span id="L248" class="LineNr"> 248 </span> screen-should-contain [ @@ -317,12 +317,12 @@ if ('onhashchange' in window) { <span id="L258" class="LineNr"> 258 </span> <span class="Comment"># create an editor with some text</span> <span id="L259" class="LineNr"> 259 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L260" class="LineNr"> 260 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[a]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L261" class="LineNr"> 261 </span> editor-render screen, e +<span id="L261" class="LineNr"> 261 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L262" class="LineNr"> 262 </span> <span class="Comment"># type some characters</span> <span id="L263" class="LineNr"> 263 </span> assume-console [ <span id="L264" class="LineNr"> 264 </span> type <span class="Constant">[012]</span> <span id="L265" class="LineNr"> 265 </span> ] -<span id="L266" class="LineNr"> 266 </span> editor-event-loop screen, console, e +<span id="L266" class="LineNr"> 266 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L267" class="LineNr"> 267 </span> screen-should-contain [ <span id="L268" class="LineNr"> 268 </span> <span class="Constant"> . .</span> <span id="L269" class="LineNr"> 269 </span> <span class="Constant"> .012a .</span> @@ -334,7 +334,7 @@ if ('onhashchange' in window) { <span id="L275" class="LineNr"> 275 </span> press ctrl-z <span id="L276" class="LineNr"> 276 </span> ] <span id="L277" class="LineNr"> 277 </span> run [ -<span id="L278" class="LineNr"> 278 </span> editor-event-loop screen, console, e +<span id="L278" class="LineNr"> 278 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L279" class="LineNr"> 279 </span> ] <span id="L280" class="LineNr"> 280 </span> <span class="Comment"># back to original text</span> <span id="L281" class="LineNr"> 281 </span> screen-should-contain [ @@ -348,7 +348,7 @@ if ('onhashchange' in window) { <span id="L289" class="LineNr"> 289 </span> type <span class="Constant">[3]</span> <span id="L290" class="LineNr"> 290 </span> ] <span id="L291" class="LineNr"> 291 </span> run [ -<span id="L292" class="LineNr"> 292 </span> editor-event-loop screen, console, e +<span id="L292" class="LineNr"> 292 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L293" class="LineNr"> 293 </span> ] <span id="L294" class="LineNr"> 294 </span> screen-should-contain [ <span id="L295" class="LineNr"> 295 </span> <span class="Constant"> . .</span> @@ -363,13 +363,13 @@ if ('onhashchange' in window) { <span id="L304" class="LineNr"> 304 </span> <span class="Comment"># create an editor with some text</span> <span id="L305" class="LineNr"> 305 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L306" class="LineNr"> 306 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[ abc]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L307" class="LineNr"> 307 </span> editor-render screen, e +<span id="L307" class="LineNr"> 307 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L308" class="LineNr"> 308 </span> <span class="Comment"># new line</span> <span id="L309" class="LineNr"> 309 </span> assume-console [ <span id="L310" class="LineNr"> 310 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 8</span> <span id="L311" class="LineNr"> 311 </span> press enter <span id="L312" class="LineNr"> 312 </span> ] -<span id="L313" class="LineNr"> 313 </span> editor-event-loop screen, console, e +<span id="L313" class="LineNr"> 313 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L314" class="LineNr"> 314 </span> screen-should-contain [ <span id="L315" class="LineNr"> 315 </span> <span class="Constant"> . .</span> <span id="L316" class="LineNr"> 316 </span> <span class="Constant"> . abc .</span> @@ -389,7 +389,7 @@ if ('onhashchange' in window) { <span id="L330" class="LineNr"> 330 </span> press ctrl-z <span id="L331" class="LineNr"> 331 </span> ] <span id="L332" class="LineNr"> 332 </span> run [ -<span id="L333" class="LineNr"> 333 </span> editor-event-loop screen, console, e +<span id="L333" class="LineNr"> 333 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L334" class="LineNr"> 334 </span> ] <span id="L335" class="LineNr"> 335 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L336" class="LineNr"> 336 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> @@ -409,7 +409,7 @@ if ('onhashchange' in window) { <span id="L350" class="LineNr"> 350 </span> type <span class="Constant">[1]</span> <span id="L351" class="LineNr"> 351 </span> ] <span id="L352" class="LineNr"> 352 </span> run [ -<span id="L353" class="LineNr"> 353 </span> editor-event-loop screen, console, e +<span id="L353" class="LineNr"> 353 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L354" class="LineNr"> 354 </span> ] <span id="L355" class="LineNr"> 355 </span> screen-should-contain [ <span id="L356" class="LineNr"> 356 </span> <span class="Constant"> . .</span> @@ -426,12 +426,12 @@ if ('onhashchange' in window) { <span id="L367" class="LineNr"> 367 </span> <span class="Comment"># create an editor, type something, undo</span> <span id="L368" class="LineNr"> 368 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L369" class="LineNr"> 369 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[a]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L370" class="LineNr"> 370 </span> editor-render screen, e +<span id="L370" class="LineNr"> 370 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L371" class="LineNr"> 371 </span> assume-console [ <span id="L372" class="LineNr"> 372 </span> type <span class="Constant">[012]</span> <span id="L373" class="LineNr"> 373 </span> press ctrl-z <span id="L374" class="LineNr"> 374 </span> ] -<span id="L375" class="LineNr"> 375 </span> editor-event-loop screen, console, e +<span id="L375" class="LineNr"> 375 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L376" class="LineNr"> 376 </span> screen-should-contain [ <span id="L377" class="LineNr"> 377 </span> <span class="Constant"> . .</span> <span id="L378" class="LineNr"> 378 </span> <span class="Constant"> .a .</span> @@ -443,7 +443,7 @@ if ('onhashchange' in window) { <span id="L384" class="LineNr"> 384 </span> press ctrl-y <span id="L385" class="LineNr"> 385 </span> ] <span id="L386" class="LineNr"> 386 </span> run [ -<span id="L387" class="LineNr"> 387 </span> editor-event-loop screen, console, e +<span id="L387" class="LineNr"> 387 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L388" class="LineNr"> 388 </span> ] <span id="L389" class="LineNr"> 389 </span> <span class="Comment"># all characters must be back</span> <span id="L390" class="LineNr"> 390 </span> screen-should-contain [ @@ -457,7 +457,7 @@ if ('onhashchange' in window) { <span id="L398" class="LineNr"> 398 </span> type <span class="Constant">[3]</span> <span id="L399" class="LineNr"> 399 </span> ] <span id="L400" class="LineNr"> 400 </span> run [ -<span id="L401" class="LineNr"> 401 </span> editor-event-loop screen, console, e +<span id="L401" class="LineNr"> 401 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L402" class="LineNr"> 402 </span> ] <span id="L403" class="LineNr"> 403 </span> screen-should-contain [ <span id="L404" class="LineNr"> 404 </span> <span class="Constant"> . .</span> @@ -474,7 +474,7 @@ if ('onhashchange' in window) { <span id="L415" class="LineNr"> 415 </span> before-cursor <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> <span id="L416" class="LineNr"> 416 </span> insert-from:&:duplex-list:char <span class="Special"><-</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 id="L417" class="LineNr"> 417 </span> <span class="Comment"># assert insert-to matches next(before-cursor)</span> -<span id="L418" class="LineNr"> 418 </span> insert-range before-cursor, insert-from +<span id="L418" class="LineNr"> 418 </span> <a href='065duplex_list.mu.html#L485'>insert-range</a> before-cursor, insert-from <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> <span id="L420" class="LineNr"> 420 </span> cursor-row <span class="Special"><-</span> get typing, <span class="Constant">after-row:offset</span> <span id="L421" class="LineNr"> 421 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row @@ -490,12 +490,12 @@ if ('onhashchange' in window) { <span id="L431" class="LineNr"> 431 </span> <span class="Comment"># create an editor, type something, undo</span> <span id="L432" class="LineNr"> 432 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L433" class="LineNr"> 433 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L434" class="LineNr"> 434 </span> editor-render screen, e +<span id="L434" class="LineNr"> 434 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L435" class="LineNr"> 435 </span> assume-console [ <span id="L436" class="LineNr"> 436 </span> type <span class="Constant">[012]</span> <span id="L437" class="LineNr"> 437 </span> press ctrl-z <span id="L438" class="LineNr"> 438 </span> ] -<span id="L439" class="LineNr"> 439 </span> editor-event-loop screen, console, e +<span id="L439" class="LineNr"> 439 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L440" class="LineNr"> 440 </span> screen-should-contain [ <span id="L441" class="LineNr"> 441 </span> <span class="Constant"> . .</span> <span id="L442" class="LineNr"> 442 </span> <span class="Constant"> . .</span> @@ -507,7 +507,7 @@ if ('onhashchange' in window) { <span id="L448" class="LineNr"> 448 </span> press ctrl-y <span id="L449" class="LineNr"> 449 </span> ] <span id="L450" class="LineNr"> 450 </span> run [ -<span id="L451" class="LineNr"> 451 </span> editor-event-loop screen, console, e +<span id="L451" class="LineNr"> 451 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L452" class="LineNr"> 452 </span> ] <span id="L453" class="LineNr"> 453 </span> <span class="Comment"># all characters must be back</span> <span id="L454" class="LineNr"> 454 </span> screen-should-contain [ @@ -521,7 +521,7 @@ if ('onhashchange' in window) { <span id="L462" class="LineNr"> 462 </span> type <span class="Constant">[3]</span> <span id="L463" class="LineNr"> 463 </span> ] <span id="L464" class="LineNr"> 464 </span> run [ -<span id="L465" class="LineNr"> 465 </span> editor-event-loop screen, console, e +<span id="L465" class="LineNr"> 465 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L466" class="LineNr"> 466 </span> ] <span id="L467" class="LineNr"> 467 </span> screen-should-contain [ <span id="L468" class="LineNr"> 468 </span> <span class="Constant"> . .</span> @@ -539,17 +539,17 @@ if ('onhashchange' in window) { <span id="L480" class="LineNr"> 480 </span><span class="Constant">def</span> <span id="L481" class="LineNr"> 481 </span><span class="Constant">ghi]</span> <span id="L482" class="LineNr"> 482 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L483" class="LineNr"> 483 </span> editor-render screen, e +<span id="L483" class="LineNr"> 483 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L484" class="LineNr"> 484 </span> assume-console [ <span id="L485" class="LineNr"> 485 </span> type <span class="Constant">[1]</span> <span id="L486" class="LineNr"> 486 </span> press ctrl-z <span id="L487" class="LineNr"> 487 </span> ] -<span id="L488" class="LineNr"> 488 </span> editor-event-loop screen, console, e +<span id="L488" class="LineNr"> 488 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L489" class="LineNr"> 489 </span> <span class="Comment"># do some more work</span> <span id="L490" class="LineNr"> 490 </span> assume-console [ <span id="L491" class="LineNr"> 491 </span> type <span class="Constant">[0]</span> <span id="L492" class="LineNr"> 492 </span> ] -<span id="L493" class="LineNr"> 493 </span> editor-event-loop screen, console, e +<span id="L493" class="LineNr"> 493 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L494" class="LineNr"> 494 </span> screen-should-contain [ <span id="L495" class="LineNr"> 495 </span> <span class="Constant"> . .</span> <span id="L496" class="LineNr"> 496 </span> <span class="Constant"> .0abc .</span> @@ -562,7 +562,7 @@ if ('onhashchange' in window) { <span id="L503" class="LineNr"> 503 </span> press ctrl-y <span id="L504" class="LineNr"> 504 </span> ] <span id="L505" class="LineNr"> 505 </span> run [ -<span id="L506" class="LineNr"> 506 </span> editor-event-loop screen, console, e +<span id="L506" class="LineNr"> 506 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L507" class="LineNr"> 507 </span> ] <span id="L508" class="LineNr"> 508 </span> <span class="Comment"># nothing should happen</span> <span id="L509" class="LineNr"> 509 </span> screen-should-contain [ @@ -579,7 +579,7 @@ if ('onhashchange' in window) { <span id="L520" class="LineNr"> 520 </span> <span class="Comment"># create an editor</span> <span id="L521" class="LineNr"> 521 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L522" class="LineNr"> 522 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L523" class="LineNr"> 523 </span> editor-render screen, e +<span id="L523" class="LineNr"> 523 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L524" class="LineNr"> 524 </span> <span class="Comment"># insert some text and tabs, hit enter, some more text and tabs</span> <span id="L525" class="LineNr"> 525 </span> assume-console [ <span id="L526" class="LineNr"> 526 </span> press tab @@ -590,7 +590,7 @@ if ('onhashchange' in window) { <span id="L531" class="LineNr"> 531 </span> press tab <span id="L532" class="LineNr"> 532 </span> type <span class="Constant">[efg]</span> <span id="L533" class="LineNr"> 533 </span> ] -<span id="L534" class="LineNr"> 534 </span> editor-event-loop screen, console, e +<span id="L534" class="LineNr"> 534 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L535" class="LineNr"> 535 </span> screen-should-contain [ <span id="L536" class="LineNr"> 536 </span> <span class="Constant"> . .</span> <span id="L537" class="LineNr"> 537 </span> <span class="Constant"> . ab cd .</span> @@ -609,7 +609,7 @@ if ('onhashchange' in window) { <span id="L550" class="LineNr"> 550 </span> press ctrl-z <span id="L551" class="LineNr"> 551 </span> ] <span id="L552" class="LineNr"> 552 </span> run [ -<span id="L553" class="LineNr"> 553 </span> editor-event-loop screen, console, e +<span id="L553" class="LineNr"> 553 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L554" class="LineNr"> 554 </span> ] <span id="L555" class="LineNr"> 555 </span> <span class="Comment"># typing in second line deleted, but not indent</span> <span id="L556" class="LineNr"> 556 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -630,7 +630,7 @@ if ('onhashchange' in window) { <span id="L571" class="LineNr"> 571 </span> press ctrl-z <span id="L572" class="LineNr"> 572 </span> ] <span id="L573" class="LineNr"> 573 </span> run [ -<span id="L574" class="LineNr"> 574 </span> editor-event-loop screen, console, e +<span id="L574" class="LineNr"> 574 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L575" class="LineNr"> 575 </span> ] <span id="L576" class="LineNr"> 576 </span> <span class="Comment"># indent and newline deleted</span> <span id="L577" class="LineNr"> 577 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -650,7 +650,7 @@ if ('onhashchange' in window) { <span id="L591" class="LineNr"> 591 </span> press ctrl-z <span id="L592" class="LineNr"> 592 </span> ] <span id="L593" class="LineNr"> 593 </span> run [ -<span id="L594" class="LineNr"> 594 </span> editor-event-loop screen, console, e +<span id="L594" class="LineNr"> 594 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L595" class="LineNr"> 595 </span> ] <span id="L596" class="LineNr"> 596 </span> <span class="Comment"># empty screen</span> <span id="L597" class="LineNr"> 597 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -670,7 +670,7 @@ if ('onhashchange' in window) { <span id="L611" class="LineNr"> 611 </span> press ctrl-y <span id="L612" class="LineNr"> 612 </span> ] <span id="L613" class="LineNr"> 613 </span> run [ -<span id="L614" class="LineNr"> 614 </span> editor-event-loop screen, console, e +<span id="L614" class="LineNr"> 614 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L615" class="LineNr"> 615 </span> ] <span id="L616" class="LineNr"> 616 </span> <span class="Comment"># first line inserted</span> <span id="L617" class="LineNr"> 617 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -690,7 +690,7 @@ if ('onhashchange' in window) { <span id="L631" class="LineNr"> 631 </span> press ctrl-y <span id="L632" class="LineNr"> 632 </span> ] <span id="L633" class="LineNr"> 633 </span> run [ -<span id="L634" class="LineNr"> 634 </span> editor-event-loop screen, console, e +<span id="L634" class="LineNr"> 634 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L635" class="LineNr"> 635 </span> ] <span id="L636" class="LineNr"> 636 </span> <span class="Comment"># newline and indent inserted</span> <span id="L637" class="LineNr"> 637 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -711,7 +711,7 @@ if ('onhashchange' in window) { <span id="L652" class="LineNr"> 652 </span> press ctrl-y <span id="L653" class="LineNr"> 653 </span> ] <span id="L654" class="LineNr"> 654 </span> run [ -<span id="L655" class="LineNr"> 655 </span> editor-event-loop screen, console, e +<span id="L655" class="LineNr"> 655 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L656" class="LineNr"> 656 </span> ] <span id="L657" class="LineNr"> 657 </span> <span class="Comment"># indent and newline deleted</span> <span id="L658" class="LineNr"> 658 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -739,18 +739,18 @@ if ('onhashchange' in window) { <span id="L680" class="LineNr"> 680 </span><span class="Constant">def</span> <span id="L681" class="LineNr"> 681 </span><span class="Constant">ghi]</span> <span id="L682" class="LineNr"> 682 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L683" class="LineNr"> 683 </span> editor-render screen, e +<span id="L683" class="LineNr"> 683 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L684" class="LineNr"> 684 </span> <span class="Comment"># move the cursor</span> <span id="L685" class="LineNr"> 685 </span> assume-console [ <span id="L686" class="LineNr"> 686 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span> <span id="L687" class="LineNr"> 687 </span> ] -<span id="L688" class="LineNr"> 688 </span> editor-event-loop screen, console, e +<span id="L688" class="LineNr"> 688 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L689" class="LineNr"> 689 </span> <span class="Comment"># undo</span> <span id="L690" class="LineNr"> 690 </span> assume-console [ <span id="L691" class="LineNr"> 691 </span> press ctrl-z <span id="L692" class="LineNr"> 692 </span> ] <span id="L693" class="LineNr"> 693 </span> run [ -<span id="L694" class="LineNr"> 694 </span> editor-event-loop screen, console, e +<span id="L694" class="LineNr"> 694 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L695" class="LineNr"> 695 </span> ] <span id="L696" class="LineNr"> 696 </span> <span class="Comment"># click undone</span> <span id="L697" class="LineNr"> 697 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -764,7 +764,7 @@ if ('onhashchange' in window) { <span id="L705" class="LineNr"> 705 </span> type <span class="Constant">[1]</span> <span id="L706" class="LineNr"> 706 </span> ] <span id="L707" class="LineNr"> 707 </span> run [ -<span id="L708" class="LineNr"> 708 </span> editor-event-loop screen, console, e +<span id="L708" class="LineNr"> 708 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L709" class="LineNr"> 709 </span> ] <span id="L710" class="LineNr"> 710 </span> screen-should-contain [ <span id="L711" class="LineNr"> 711 </span> <span class="Constant"> . .</span> @@ -836,7 +836,7 @@ if ('onhashchange' in window) { <span id="L777" class="LineNr"> 777 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 3</span> <span id="L778" class="LineNr"> 778 </span> press right-arrow <span id="L779" class="LineNr"> 779 </span> ] -<span id="L780" class="LineNr"> 780 </span> editor-event-loop screen, console, e +<span id="L780" class="LineNr"> 780 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L781" class="LineNr"> 781 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L782" class="LineNr"> 782 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L783" class="LineNr"> 783 </span> <span class="Comment"># screen scrolls</span> @@ -855,7 +855,7 @@ if ('onhashchange' in window) { <span id="L796" class="LineNr"> 796 </span> press ctrl-z <span id="L797" class="LineNr"> 797 </span> ] <span id="L798" class="LineNr"> 798 </span> run [ -<span id="L799" class="LineNr"> 799 </span> editor-event-loop screen, console, e +<span id="L799" class="LineNr"> 799 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L800" class="LineNr"> 800 </span> ] <span id="L801" class="LineNr"> 801 </span> <span class="Comment"># cursor moved back</span> <span id="L802" class="LineNr"> 802 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -876,7 +876,7 @@ if ('onhashchange' in window) { <span id="L817" class="LineNr"> 817 </span> type <span class="Constant">[1]</span> <span id="L818" class="LineNr"> 818 </span> ] <span id="L819" class="LineNr"> 819 </span> run [ -<span id="L820" class="LineNr"> 820 </span> editor-event-loop screen, console, e +<span id="L820" class="LineNr"> 820 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L821" class="LineNr"> 821 </span> ] <span id="L822" class="LineNr"> 822 </span> screen-should-contain [ <span id="L823" class="LineNr"> 823 </span> <span class="Constant"> . .</span> @@ -894,19 +894,19 @@ if ('onhashchange' in window) { <span id="L835" class="LineNr"> 835 </span><span class="Constant">def</span> <span id="L836" class="LineNr"> 836 </span><span class="Constant">ghi]</span> <span id="L837" class="LineNr"> 837 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L838" class="LineNr"> 838 </span> editor-render screen, e +<span id="L838" class="LineNr"> 838 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L839" class="LineNr"> 839 </span> <span class="Comment"># move the cursor</span> <span id="L840" class="LineNr"> 840 </span> assume-console [ <span id="L841" class="LineNr"> 841 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span> <span id="L842" class="LineNr"> 842 </span> press left-arrow <span id="L843" class="LineNr"> 843 </span> ] -<span id="L844" class="LineNr"> 844 </span> editor-event-loop screen, console, e +<span id="L844" class="LineNr"> 844 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L845" class="LineNr"> 845 </span> <span class="Comment"># undo</span> <span id="L846" class="LineNr"> 846 </span> assume-console [ <span id="L847" class="LineNr"> 847 </span> press ctrl-z <span id="L848" class="LineNr"> 848 </span> ] <span id="L849" class="LineNr"> 849 </span> run [ -<span id="L850" class="LineNr"> 850 </span> editor-event-loop screen, console, e +<span id="L850" class="LineNr"> 850 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L851" class="LineNr"> 851 </span> ] <span id="L852" class="LineNr"> 852 </span> <span class="Comment"># cursor moves back</span> <span id="L853" class="LineNr"> 853 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -920,7 +920,7 @@ if ('onhashchange' in window) { <span id="L861" class="LineNr"> 861 </span> type <span class="Constant">[1]</span> <span id="L862" class="LineNr"> 862 </span> ] <span id="L863" class="LineNr"> 863 </span> run [ -<span id="L864" class="LineNr"> 864 </span> editor-event-loop screen, console, e +<span id="L864" class="LineNr"> 864 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L865" class="LineNr"> 865 </span> ] <span id="L866" class="LineNr"> 866 </span> screen-should-contain [ <span id="L867" class="LineNr"> 867 </span> <span class="Constant"> . .</span> @@ -939,13 +939,13 @@ if ('onhashchange' in window) { <span id="L880" class="LineNr"> 880 </span><span class="Constant">def</span> <span id="L881" class="LineNr"> 881 </span><span class="Constant">ghi]</span> <span id="L882" class="LineNr"> 882 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L883" class="LineNr"> 883 </span> editor-render screen, e +<span id="L883" class="LineNr"> 883 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L884" class="LineNr"> 884 </span> <span class="Comment"># move the cursor</span> <span id="L885" class="LineNr"> 885 </span> assume-console [ <span id="L886" class="LineNr"> 886 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span> <span id="L887" class="LineNr"> 887 </span> press up-arrow <span id="L888" class="LineNr"> 888 </span> ] -<span id="L889" class="LineNr"> 889 </span> editor-event-loop screen, console, e +<span id="L889" class="LineNr"> 889 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L890" class="LineNr"> 890 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L891" class="LineNr"> 891 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L892" class="LineNr"> 892 </span> memory-should-contain [ @@ -957,7 +957,7 @@ if ('onhashchange' in window) { <span id="L898" class="LineNr"> 898 </span> press ctrl-z <span id="L899" class="LineNr"> 899 </span> ] <span id="L900" class="LineNr"> 900 </span> run [ -<span id="L901" class="LineNr"> 901 </span> editor-event-loop screen, console, e +<span id="L901" class="LineNr"> 901 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L902" class="LineNr"> 902 </span> ] <span id="L903" class="LineNr"> 903 </span> <span class="Comment"># cursor moves back</span> <span id="L904" class="LineNr"> 904 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -971,7 +971,7 @@ if ('onhashchange' in window) { <span id="L912" class="LineNr"> 912 </span> type <span class="Constant">[1]</span> <span id="L913" class="LineNr"> 913 </span> ] <span id="L914" class="LineNr"> 914 </span> run [ -<span id="L915" class="LineNr"> 915 </span> editor-event-loop screen, console, e +<span id="L915" class="LineNr"> 915 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L916" class="LineNr"> 916 </span> ] <span id="L917" class="LineNr"> 917 </span> screen-should-contain [ <span id="L918" class="LineNr"> 918 </span> <span class="Constant"> . .</span> @@ -990,19 +990,19 @@ if ('onhashchange' in window) { <span id="L931" class="LineNr"> 931 </span><span class="Constant">def</span> <span id="L932" class="LineNr"> 932 </span><span class="Constant">ghi]</span> <span id="L933" class="LineNr"> 933 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L934" class="LineNr"> 934 </span> editor-render screen, e +<span id="L934" class="LineNr"> 934 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L935" class="LineNr"> 935 </span> <span class="Comment"># move the cursor</span> <span id="L936" class="LineNr"> 936 </span> assume-console [ <span id="L937" class="LineNr"> 937 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span> <span id="L938" class="LineNr"> 938 </span> press down-arrow <span id="L939" class="LineNr"> 939 </span> ] -<span id="L940" class="LineNr"> 940 </span> editor-event-loop screen, console, e +<span id="L940" class="LineNr"> 940 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L941" class="LineNr"> 941 </span> <span class="Comment"># undo</span> <span id="L942" class="LineNr"> 942 </span> assume-console [ <span id="L943" class="LineNr"> 943 </span> press ctrl-z <span id="L944" class="LineNr"> 944 </span> ] <span id="L945" class="LineNr"> 945 </span> run [ -<span id="L946" class="LineNr"> 946 </span> editor-event-loop screen, console, e +<span id="L946" class="LineNr"> 946 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L947" class="LineNr"> 947 </span> ] <span id="L948" class="LineNr"> 948 </span> <span class="Comment"># cursor moves back</span> <span id="L949" class="LineNr"> 949 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1016,7 +1016,7 @@ if ('onhashchange' in window) { <span id="L957" class="LineNr"> 957 </span> type <span class="Constant">[1]</span> <span id="L958" class="LineNr"> 958 </span> ] <span id="L959" class="LineNr"> 959 </span> run [ -<span id="L960" class="LineNr"> 960 </span> editor-event-loop screen, console, e +<span id="L960" class="LineNr"> 960 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L961" class="LineNr"> 961 </span> ] <span id="L962" class="LineNr"> 962 </span> screen-should-contain [ <span id="L963" class="LineNr"> 963 </span> <span class="Constant"> . .</span> @@ -1038,18 +1038,18 @@ if ('onhashchange' in window) { <span id="L979" class="LineNr"> 979 </span><span class="Constant">e</span> <span id="L980" class="LineNr"> 980 </span><span class="Constant">f]</span> <span id="L981" class="LineNr"> 981 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L982" class="LineNr"> 982 </span> editor-render screen, e +<span id="L982" class="LineNr"> 982 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L983" class="LineNr"> 983 </span> <span class="Comment"># scroll the page</span> <span id="L984" class="LineNr"> 984 </span> assume-console [ <span id="L985" class="LineNr"> 985 </span> press ctrl-f <span id="L986" class="LineNr"> 986 </span> ] -<span id="L987" class="LineNr"> 987 </span> editor-event-loop screen, console, e +<span id="L987" class="LineNr"> 987 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L988" class="LineNr"> 988 </span> <span class="Comment"># undo</span> <span id="L989" class="LineNr"> 989 </span> assume-console [ <span id="L990" class="LineNr"> 990 </span> press ctrl-z <span id="L991" class="LineNr"> 991 </span> ] <span id="L992" class="LineNr"> 992 </span> run [ -<span id="L993" class="LineNr"> 993 </span> editor-event-loop screen, console, e +<span id="L993" class="LineNr"> 993 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L994" class="LineNr"> 994 </span> ] <span id="L995" class="LineNr"> 995 </span> <span class="Comment"># screen should again show page 1</span> <span id="L996" class="LineNr"> 996 </span> screen-should-contain [ @@ -1072,18 +1072,18 @@ if ('onhashchange' in window) { <span id="L1013" class="LineNr">1013 </span><span class="Constant">e</span> <span id="L1014" class="LineNr">1014 </span><span class="Constant">f]</span> <span id="L1015" class="LineNr">1015 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1016" class="LineNr">1016 </span> editor-render screen, e +<span id="L1016" class="LineNr">1016 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1017" class="LineNr">1017 </span> <span class="Comment"># scroll the page</span> <span id="L1018" class="LineNr">1018 </span> assume-console [ <span id="L1019" class="LineNr">1019 </span> press page-down <span id="L1020" class="LineNr">1020 </span> ] -<span id="L1021" class="LineNr">1021 </span> editor-event-loop screen, console, e +<span id="L1021" class="LineNr">1021 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1022" class="LineNr">1022 </span> <span class="Comment"># undo</span> <span id="L1023" class="LineNr">1023 </span> assume-console [ <span id="L1024" class="LineNr">1024 </span> press ctrl-z <span id="L1025" class="LineNr">1025 </span> ] <span id="L1026" class="LineNr">1026 </span> run [ -<span id="L1027" class="LineNr">1027 </span> editor-event-loop screen, console, e +<span id="L1027" class="LineNr">1027 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1028" class="LineNr">1028 </span> ] <span id="L1029" class="LineNr">1029 </span> <span class="Comment"># screen should again show page 1</span> <span id="L1030" class="LineNr">1030 </span> screen-should-contain [ @@ -1106,19 +1106,19 @@ if ('onhashchange' in window) { <span id="L1047" class="LineNr">1047 </span><span class="Constant">e</span> <span id="L1048" class="LineNr">1048 </span><span class="Constant">f]</span> <span id="L1049" class="LineNr">1049 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1050" class="LineNr">1050 </span> editor-render screen, e +<span id="L1050" class="LineNr">1050 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1051" class="LineNr">1051 </span> <span class="Comment"># scroll the page down and up</span> <span id="L1052" class="LineNr">1052 </span> assume-console [ <span id="L1053" class="LineNr">1053 </span> press page-down <span id="L1054" class="LineNr">1054 </span> press ctrl-b <span id="L1055" class="LineNr">1055 </span> ] -<span id="L1056" class="LineNr">1056 </span> editor-event-loop screen, console, e +<span id="L1056" class="LineNr">1056 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1057" class="LineNr">1057 </span> <span class="Comment"># undo</span> <span id="L1058" class="LineNr">1058 </span> assume-console [ <span id="L1059" class="LineNr">1059 </span> press ctrl-z <span id="L1060" class="LineNr">1060 </span> ] <span id="L1061" class="LineNr">1061 </span> run [ -<span id="L1062" class="LineNr">1062 </span> editor-event-loop screen, console, e +<span id="L1062" class="LineNr">1062 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1063" class="LineNr">1063 </span> ] <span id="L1064" class="LineNr">1064 </span> <span class="Comment"># screen should again show page 2</span> <span id="L1065" class="LineNr">1065 </span> screen-should-contain [ @@ -1141,19 +1141,19 @@ if ('onhashchange' in window) { <span id="L1082" class="LineNr">1082 </span><span class="Constant">e</span> <span id="L1083" class="LineNr">1083 </span><span class="Constant">f]</span> <span id="L1084" class="LineNr">1084 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1085" class="LineNr">1085 </span> editor-render screen, e +<span id="L1085" class="LineNr">1085 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1086" class="LineNr">1086 </span> <span class="Comment"># scroll the page down and up</span> <span id="L1087" class="LineNr">1087 </span> assume-console [ <span id="L1088" class="LineNr">1088 </span> press page-down <span id="L1089" class="LineNr">1089 </span> press page-up <span id="L1090" class="LineNr">1090 </span> ] -<span id="L1091" class="LineNr">1091 </span> editor-event-loop screen, console, e +<span id="L1091" class="LineNr">1091 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1092" class="LineNr">1092 </span> <span class="Comment"># undo</span> <span id="L1093" class="LineNr">1093 </span> assume-console [ <span id="L1094" class="LineNr">1094 </span> press ctrl-z <span id="L1095" class="LineNr">1095 </span> ] <span id="L1096" class="LineNr">1096 </span> run [ -<span id="L1097" class="LineNr">1097 </span> editor-event-loop screen, console, e +<span id="L1097" class="LineNr">1097 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1098" class="LineNr">1098 </span> ] <span id="L1099" class="LineNr">1099 </span> <span class="Comment"># screen should again show page 2</span> <span id="L1100" class="LineNr">1100 </span> screen-should-contain [ @@ -1173,19 +1173,19 @@ if ('onhashchange' in window) { <span id="L1114" class="LineNr">1114 </span><span class="Constant">def</span> <span id="L1115" class="LineNr">1115 </span><span class="Constant">ghi]</span> <span id="L1116" class="LineNr">1116 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1117" class="LineNr">1117 </span> editor-render screen, e +<span id="L1117" class="LineNr">1117 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1118" class="LineNr">1118 </span> <span class="Comment"># move the cursor, then to start of line</span> <span id="L1119" class="LineNr">1119 </span> assume-console [ <span id="L1120" class="LineNr">1120 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span> <span id="L1121" class="LineNr">1121 </span> press ctrl-a <span id="L1122" class="LineNr">1122 </span> ] -<span id="L1123" class="LineNr">1123 </span> editor-event-loop screen, console, e +<span id="L1123" class="LineNr">1123 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1124" class="LineNr">1124 </span> <span class="Comment"># undo</span> <span id="L1125" class="LineNr">1125 </span> assume-console [ <span id="L1126" class="LineNr">1126 </span> press ctrl-z <span id="L1127" class="LineNr">1127 </span> ] <span id="L1128" class="LineNr">1128 </span> run [ -<span id="L1129" class="LineNr">1129 </span> editor-event-loop screen, console, e +<span id="L1129" class="LineNr">1129 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1130" class="LineNr">1130 </span> ] <span id="L1131" class="LineNr">1131 </span> <span class="Comment"># cursor moves back</span> <span id="L1132" class="LineNr">1132 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1199,7 +1199,7 @@ if ('onhashchange' in window) { <span id="L1140" class="LineNr">1140 </span> type <span class="Constant">[1]</span> <span id="L1141" class="LineNr">1141 </span> ] <span id="L1142" class="LineNr">1142 </span> run [ -<span id="L1143" class="LineNr">1143 </span> editor-event-loop screen, console, e +<span id="L1143" class="LineNr">1143 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1144" class="LineNr">1144 </span> ] <span id="L1145" class="LineNr">1145 </span> screen-should-contain [ <span id="L1146" class="LineNr">1146 </span> <span class="Constant"> . .</span> @@ -1218,19 +1218,19 @@ if ('onhashchange' in window) { <span id="L1159" class="LineNr">1159 </span><span class="Constant">def</span> <span id="L1160" class="LineNr">1160 </span><span class="Constant">ghi]</span> <span id="L1161" class="LineNr">1161 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1162" class="LineNr">1162 </span> editor-render screen, e +<span id="L1162" class="LineNr">1162 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1163" class="LineNr">1163 </span> <span class="Comment"># move the cursor, then to start of line</span> <span id="L1164" class="LineNr">1164 </span> assume-console [ <span id="L1165" class="LineNr">1165 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span> <span id="L1166" class="LineNr">1166 </span> press home <span id="L1167" class="LineNr">1167 </span> ] -<span id="L1168" class="LineNr">1168 </span> editor-event-loop screen, console, e +<span id="L1168" class="LineNr">1168 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1169" class="LineNr">1169 </span> <span class="Comment"># undo</span> <span id="L1170" class="LineNr">1170 </span> assume-console [ <span id="L1171" class="LineNr">1171 </span> press ctrl-z <span id="L1172" class="LineNr">1172 </span> ] <span id="L1173" class="LineNr">1173 </span> run [ -<span id="L1174" class="LineNr">1174 </span> editor-event-loop screen, console, e +<span id="L1174" class="LineNr">1174 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1175" class="LineNr">1175 </span> ] <span id="L1176" class="LineNr">1176 </span> <span class="Comment"># cursor moves back</span> <span id="L1177" class="LineNr">1177 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1244,7 +1244,7 @@ if ('onhashchange' in window) { <span id="L1185" class="LineNr">1185 </span> type <span class="Constant">[1]</span> <span id="L1186" class="LineNr">1186 </span> ] <span id="L1187" class="LineNr">1187 </span> run [ -<span id="L1188" class="LineNr">1188 </span> editor-event-loop screen, console, e +<span id="L1188" class="LineNr">1188 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1189" class="LineNr">1189 </span> ] <span id="L1190" class="LineNr">1190 </span> screen-should-contain [ <span id="L1191" class="LineNr">1191 </span> <span class="Constant"> . .</span> @@ -1263,19 +1263,19 @@ if ('onhashchange' in window) { <span id="L1204" class="LineNr">1204 </span><span class="Constant">def</span> <span id="L1205" class="LineNr">1205 </span><span class="Constant">ghi]</span> <span id="L1206" class="LineNr">1206 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1207" class="LineNr">1207 </span> editor-render screen, e +<span id="L1207" class="LineNr">1207 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1208" class="LineNr">1208 </span> <span class="Comment"># move the cursor, then to start of line</span> <span id="L1209" class="LineNr">1209 </span> assume-console [ <span id="L1210" class="LineNr">1210 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span> <span id="L1211" class="LineNr">1211 </span> press ctrl-e <span id="L1212" class="LineNr">1212 </span> ] -<span id="L1213" class="LineNr">1213 </span> editor-event-loop screen, console, e +<span id="L1213" class="LineNr">1213 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1214" class="LineNr">1214 </span> <span class="Comment"># undo</span> <span id="L1215" class="LineNr">1215 </span> assume-console [ <span id="L1216" class="LineNr">1216 </span> press ctrl-z <span id="L1217" class="LineNr">1217 </span> ] <span id="L1218" class="LineNr">1218 </span> run [ -<span id="L1219" class="LineNr">1219 </span> editor-event-loop screen, console, e +<span id="L1219" class="LineNr">1219 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1220" class="LineNr">1220 </span> ] <span id="L1221" class="LineNr">1221 </span> <span class="Comment"># cursor moves back</span> <span id="L1222" class="LineNr">1222 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1289,7 +1289,7 @@ if ('onhashchange' in window) { <span id="L1230" class="LineNr">1230 </span> type <span class="Constant">[1]</span> <span id="L1231" class="LineNr">1231 </span> ] <span id="L1232" class="LineNr">1232 </span> run [ -<span id="L1233" class="LineNr">1233 </span> editor-event-loop screen, console, e +<span id="L1233" class="LineNr">1233 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1234" class="LineNr">1234 </span> ] <span id="L1235" class="LineNr">1235 </span> screen-should-contain [ <span id="L1236" class="LineNr">1236 </span> <span class="Constant"> . .</span> @@ -1308,19 +1308,19 @@ if ('onhashchange' in window) { <span id="L1249" class="LineNr">1249 </span><span class="Constant">def</span> <span id="L1250" class="LineNr">1250 </span><span class="Constant">ghi]</span> <span id="L1251" class="LineNr">1251 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1252" class="LineNr">1252 </span> editor-render screen, e +<span id="L1252" class="LineNr">1252 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1253" class="LineNr">1253 </span> <span class="Comment"># move the cursor, then to start of line</span> <span id="L1254" class="LineNr">1254 </span> assume-console [ <span id="L1255" class="LineNr">1255 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span> <span id="L1256" class="LineNr">1256 </span> press end <span id="L1257" class="LineNr">1257 </span> ] -<span id="L1258" class="LineNr">1258 </span> editor-event-loop screen, console, e +<span id="L1258" class="LineNr">1258 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1259" class="LineNr">1259 </span> <span class="Comment"># undo</span> <span id="L1260" class="LineNr">1260 </span> assume-console [ <span id="L1261" class="LineNr">1261 </span> press ctrl-z <span id="L1262" class="LineNr">1262 </span> ] <span id="L1263" class="LineNr">1263 </span> run [ -<span id="L1264" class="LineNr">1264 </span> editor-event-loop screen, console, e +<span id="L1264" class="LineNr">1264 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1265" class="LineNr">1265 </span> ] <span id="L1266" class="LineNr">1266 </span> <span class="Comment"># cursor moves back</span> <span id="L1267" class="LineNr">1267 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1334,7 +1334,7 @@ if ('onhashchange' in window) { <span id="L1275" class="LineNr">1275 </span> type <span class="Constant">[1]</span> <span id="L1276" class="LineNr">1276 </span> ] <span id="L1277" class="LineNr">1277 </span> run [ -<span id="L1278" class="LineNr">1278 </span> editor-event-loop screen, console, e +<span id="L1278" class="LineNr">1278 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1279" class="LineNr">1279 </span> ] <span id="L1280" class="LineNr">1280 </span> screen-should-contain [ <span id="L1281" class="LineNr">1281 </span> <span class="Constant"> . .</span> @@ -1353,7 +1353,7 @@ if ('onhashchange' in window) { <span id="L1294" class="LineNr">1294 </span><span class="Constant">def</span> <span id="L1295" class="LineNr">1295 </span><span class="Constant">ghi]</span> <span id="L1296" class="LineNr">1296 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1297" class="LineNr">1297 </span> editor-render screen, e +<span id="L1297" class="LineNr">1297 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1298" class="LineNr">1298 </span> <span class="Comment"># move the cursor</span> <span id="L1299" class="LineNr">1299 </span> assume-console [ <span id="L1300" class="LineNr">1300 </span> left-click<span class="Constant"> 2</span>,<span class="Constant"> 1</span> @@ -1361,7 +1361,7 @@ if ('onhashchange' in window) { <span id="L1302" class="LineNr">1302 </span> press right-arrow <span id="L1303" class="LineNr">1303 </span> press up-arrow <span id="L1304" class="LineNr">1304 </span> ] -<span id="L1305" class="LineNr">1305 </span> editor-event-loop screen, console, e +<span id="L1305" class="LineNr">1305 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1306" class="LineNr">1306 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1307" class="LineNr">1307 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1308" class="LineNr">1308 </span> memory-should-contain [ @@ -1373,7 +1373,7 @@ if ('onhashchange' in window) { <span id="L1314" class="LineNr">1314 </span> press ctrl-z <span id="L1315" class="LineNr">1315 </span> ] <span id="L1316" class="LineNr">1316 </span> run [ -<span id="L1317" class="LineNr">1317 </span> editor-event-loop screen, console, e +<span id="L1317" class="LineNr">1317 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1318" class="LineNr">1318 </span> ] <span id="L1319" class="LineNr">1319 </span> <span class="Comment"># up-arrow is undone</span> <span id="L1320" class="LineNr">1320 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1387,7 +1387,7 @@ if ('onhashchange' in window) { <span id="L1328" class="LineNr">1328 </span> press ctrl-z <span id="L1329" class="LineNr">1329 </span> ] <span id="L1330" class="LineNr">1330 </span> run [ -<span id="L1331" class="LineNr">1331 </span> editor-event-loop screen, console, e +<span id="L1331" class="LineNr">1331 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1332" class="LineNr">1332 </span> ] <span id="L1333" class="LineNr">1333 </span> <span class="Comment"># both right-arrows are undone</span> <span id="L1334" class="LineNr">1334 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1408,18 +1408,18 @@ if ('onhashchange' in window) { <span id="L1349" class="LineNr">1349 </span><span class="Constant">def</span> <span id="L1350" class="LineNr">1350 </span><span class="Constant">ghi]</span> <span id="L1351" class="LineNr">1351 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1352" class="LineNr">1352 </span> editor-render screen, e +<span id="L1352" class="LineNr">1352 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1353" class="LineNr">1353 </span> assume-console [ <span id="L1354" class="LineNr">1354 </span> left-click<span class="Constant"> 3</span>,<span class="Constant"> 1</span> <span id="L1355" class="LineNr">1355 </span> press ctrl-z <span id="L1356" class="LineNr">1356 </span> ] -<span id="L1357" class="LineNr">1357 </span> editor-event-loop screen, console, e +<span id="L1357" class="LineNr">1357 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1358" class="LineNr">1358 </span> <span class="Comment"># redo</span> <span id="L1359" class="LineNr">1359 </span> assume-console [ <span id="L1360" class="LineNr">1360 </span> press ctrl-y <span id="L1361" class="LineNr">1361 </span> ] <span id="L1362" class="LineNr">1362 </span> run [ -<span id="L1363" class="LineNr">1363 </span> editor-event-loop screen, console, e +<span id="L1363" class="LineNr">1363 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1364" class="LineNr">1364 </span> ] <span id="L1365" class="LineNr">1365 </span> <span class="Comment"># cursor moves to left-click</span> <span id="L1366" class="LineNr">1366 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1433,7 +1433,7 @@ if ('onhashchange' in window) { <span id="L1374" class="LineNr">1374 </span> type <span class="Constant">[1]</span> <span id="L1375" class="LineNr">1375 </span> ] <span id="L1376" class="LineNr">1376 </span> run [ -<span id="L1377" class="LineNr">1377 </span> editor-event-loop screen, console, e +<span id="L1377" class="LineNr">1377 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1378" class="LineNr">1378 </span> ] <span id="L1379" class="LineNr">1379 </span> screen-should-contain [ <span id="L1380" class="LineNr">1380 </span> <span class="Constant"> . .</span> @@ -1463,13 +1463,13 @@ if ('onhashchange' in window) { <span id="L1404" class="LineNr">1404 </span> <span class="Comment"># create an editor, type some text, move the cursor, type some more text</span> <span id="L1405" class="LineNr">1405 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L1406" class="LineNr">1406 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1407" class="LineNr">1407 </span> editor-render screen, e +<span id="L1407" class="LineNr">1407 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1408" class="LineNr">1408 </span> assume-console [ <span id="L1409" class="LineNr">1409 </span> type <span class="Constant">[abc]</span> <span id="L1410" class="LineNr">1410 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span> <span id="L1411" class="LineNr">1411 </span> type <span class="Constant">[d]</span> <span id="L1412" class="LineNr">1412 </span> ] -<span id="L1413" class="LineNr">1413 </span> editor-event-loop screen, console, e +<span id="L1413" class="LineNr">1413 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1414" class="LineNr">1414 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1415" class="LineNr">1415 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1416" class="LineNr">1416 </span> screen-should-contain [ @@ -1487,7 +1487,7 @@ if ('onhashchange' in window) { <span id="L1428" class="LineNr">1428 </span> press ctrl-z <span id="L1429" class="LineNr">1429 </span> ] <span id="L1430" class="LineNr">1430 </span> run [ -<span id="L1431" class="LineNr">1431 </span> editor-event-loop screen, console, e +<span id="L1431" class="LineNr">1431 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1432" class="LineNr">1432 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1433" class="LineNr">1433 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1434" class="LineNr">1434 </span> ] @@ -1507,7 +1507,7 @@ if ('onhashchange' in window) { <span id="L1448" class="LineNr">1448 </span> press ctrl-z <span id="L1449" class="LineNr">1449 </span> ] <span id="L1450" class="LineNr">1450 </span> run [ -<span id="L1451" class="LineNr">1451 </span> editor-event-loop screen, console, e +<span id="L1451" class="LineNr">1451 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1452" class="LineNr">1452 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1453" class="LineNr">1453 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1454" class="LineNr">1454 </span> ] @@ -1527,7 +1527,7 @@ if ('onhashchange' in window) { <span id="L1468" class="LineNr">1468 </span> press ctrl-z <span id="L1469" class="LineNr">1469 </span> ] <span id="L1470" class="LineNr">1470 </span> run [ -<span id="L1471" class="LineNr">1471 </span> editor-event-loop screen, console, e +<span id="L1471" class="LineNr">1471 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1472" class="LineNr">1472 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1473" class="LineNr">1473 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1474" class="LineNr">1474 </span> ] @@ -1547,7 +1547,7 @@ if ('onhashchange' in window) { <span id="L1488" class="LineNr">1488 </span> press ctrl-y <span id="L1489" class="LineNr">1489 </span> ] <span id="L1490" class="LineNr">1490 </span> run [ -<span id="L1491" class="LineNr">1491 </span> editor-event-loop screen, console, e +<span id="L1491" class="LineNr">1491 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1492" class="LineNr">1492 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1493" class="LineNr">1493 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1494" class="LineNr">1494 </span> ] @@ -1567,7 +1567,7 @@ if ('onhashchange' in window) { <span id="L1508" class="LineNr">1508 </span> press ctrl-y <span id="L1509" class="LineNr">1509 </span> ] <span id="L1510" class="LineNr">1510 </span> run [ -<span id="L1511" class="LineNr">1511 </span> editor-event-loop screen, console, e +<span id="L1511" class="LineNr">1511 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1512" class="LineNr">1512 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1513" class="LineNr">1513 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1514" class="LineNr">1514 </span> ] @@ -1588,7 +1588,7 @@ if ('onhashchange' in window) { <span id="L1529" class="LineNr">1529 </span> press ctrl-y <span id="L1530" class="LineNr">1530 </span> ] <span id="L1531" class="LineNr">1531 </span> run [ -<span id="L1532" class="LineNr">1532 </span> editor-event-loop screen, console, e +<span id="L1532" class="LineNr">1532 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1533" class="LineNr">1533 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1534" class="LineNr">1534 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> <span id="L1535" class="LineNr">1535 </span> ] @@ -1612,14 +1612,14 @@ if ('onhashchange' in window) { <span id="L1553" class="LineNr">1553 </span> <span class="Comment"># create an editor</span> <span id="L1554" class="LineNr">1554 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L1555" class="LineNr">1555 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1556" class="LineNr">1556 </span> editor-render screen, e +<span id="L1556" class="LineNr">1556 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1557" class="LineNr">1557 </span> <span class="Comment"># insert some text and hit backspace</span> <span id="L1558" class="LineNr">1558 </span> assume-console [ <span id="L1559" class="LineNr">1559 </span> type <span class="Constant">[abc]</span> <span id="L1560" class="LineNr">1560 </span> press backspace <span id="L1561" class="LineNr">1561 </span> press backspace <span id="L1562" class="LineNr">1562 </span> ] -<span id="L1563" class="LineNr">1563 </span> editor-event-loop screen, console, e +<span id="L1563" class="LineNr">1563 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1564" class="LineNr">1564 </span> screen-should-contain [ <span id="L1565" class="LineNr">1565 </span> <span class="Constant"> . .</span> <span id="L1566" class="LineNr">1566 </span> <span class="Constant"> .a .</span> @@ -1637,7 +1637,7 @@ if ('onhashchange' in window) { <span id="L1578" class="LineNr">1578 </span> press ctrl-z <span id="L1579" class="LineNr">1579 </span> ] <span id="L1580" class="LineNr">1580 </span> run [ -<span id="L1581" class="LineNr">1581 </span> editor-event-loop screen, console, e +<span id="L1581" class="LineNr">1581 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1582" class="LineNr">1582 </span> ] <span id="L1583" class="LineNr">1583 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1584" class="LineNr">1584 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> @@ -1656,7 +1656,7 @@ if ('onhashchange' in window) { <span id="L1597" class="LineNr">1597 </span> press ctrl-y <span id="L1598" class="LineNr">1598 </span> ] <span id="L1599" class="LineNr">1599 </span> run [ -<span id="L1600" class="LineNr">1600 </span> editor-event-loop screen, console, e +<span id="L1600" class="LineNr">1600 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1601" class="LineNr">1601 </span> ] <span id="L1602" class="LineNr">1602 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1603" class="LineNr">1603 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> @@ -1695,7 +1695,7 @@ if ('onhashchange' in window) { <span id="L1636" class="LineNr">1636 </span> <span class="muControl">break-unless</span> coalesce? <span id="L1637" class="LineNr">1637 </span> deletion <span class="Special"><-</span> put deletion, <span class="Constant">delete-from:offset</span>, before-cursor <span id="L1638" class="LineNr">1638 </span> backspaced-so-far:&:duplex-list:char <span class="Special"><-</span> get deletion, <span class="Constant">deleted-text:offset</span> -<span id="L1639" class="LineNr">1639 </span> insert-range backspaced-cell, backspaced-so-far +<span id="L1639" class="LineNr">1639 </span> <a href='065duplex_list.mu.html#L485'>insert-range</a> backspaced-cell, backspaced-so-far <span id="L1640" class="LineNr">1640 </span> deletion <span class="Special"><-</span> put deletion, <span class="Constant">deleted-text:offset</span>, backspaced-cell <span id="L1641" class="LineNr">1641 </span> deletion <span class="Special"><-</span> put deletion, <span class="Constant">after-row:offset</span>, cursor-row <span id="L1642" class="LineNr">1642 </span> deletion <span class="Special"><-</span> put deletion, <span class="Constant">after-column:offset</span>, cursor-column @@ -1705,7 +1705,7 @@ if ('onhashchange' in window) { <span id="L1646" class="LineNr">1646 </span> <span class="Delimiter">}</span> <span id="L1647" class="LineNr">1647 </span> <span class="Comment"># if not, create a new operation</span> <span id="L1648" class="LineNr">1648 </span> op:&:operation <span class="Special"><-</span> new <span class="Constant">operation:type</span> -<span id="L1649" class="LineNr">1649 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L1649" class="LineNr">1649 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L1650" class="LineNr">1650 </span> *op <span class="Special"><-</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> <span id="L1651" class="LineNr">1651 </span> editor <span class="Special"><-</span> add-operation editor, op <span id="L1652" class="LineNr">1652 </span><span class="Constant"> +done-adding-backspace-operation</span> @@ -1719,8 +1719,8 @@ if ('onhashchange' in window) { <span id="L1660" class="LineNr">1660 </span> anchor:&:duplex-list:char <span class="Special"><-</span> get deletion, <span class="Constant">delete-from:offset</span> <span id="L1661" class="LineNr">1661 </span> <span class="muControl">break-unless</span> anchor <span id="L1662" class="LineNr">1662 </span> deleted:&:duplex-list:char <span class="Special"><-</span> get deletion, <span class="Constant">deleted-text:offset</span> -<span id="L1663" class="LineNr">1663 </span> old-cursor:&:duplex-list:char <span class="Special"><-</span> last deleted -<span id="L1664" class="LineNr">1664 </span> insert-range anchor, deleted +<span id="L1663" class="LineNr">1663 </span> old-cursor:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L516'>last</a> deleted +<span id="L1664" class="LineNr">1664 </span> <a href='065duplex_list.mu.html#L485'>insert-range</a> anchor, deleted <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> <span id="L1666" class="LineNr">1666 </span> before-cursor <span class="Special"><-</span> copy old-cursor <span id="L1667" class="LineNr">1667 </span> cursor-row <span class="Special"><-</span> get deletion, <span class="Constant">before-row:offset</span> @@ -1739,7 +1739,7 @@ if ('onhashchange' in window) { <span id="L1680" class="LineNr">1680 </span> start:&:duplex-list:char <span class="Special"><-</span> get deletion, <span class="Constant">delete-from:offset</span> <span id="L1681" class="LineNr">1681 </span> end:&:duplex-list:char <span class="Special"><-</span> get deletion, <span class="Constant">delete-until:offset</span> <span id="L1682" class="LineNr">1682 </span> data:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">data:offset</span> -<span id="L1683" class="LineNr">1683 </span> remove-between start, end +<span id="L1683" class="LineNr">1683 </span> <a href='065duplex_list.mu.html#L345'>remove-between</a> start, end <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> <span id="L1685" class="LineNr">1685 </span> cursor-row <span class="Special"><-</span> get deletion, <span class="Constant">after-row:offset</span> <span id="L1686" class="LineNr">1686 </span> *editor <span class="Special"><-</span> put *editor, <span class="Constant">cursor-row:offset</span>, cursor-row @@ -1757,7 +1757,7 @@ if ('onhashchange' in window) { <span id="L1698" class="LineNr">1698 </span> <span class="Comment"># create an editor</span> <span id="L1699" class="LineNr">1699 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L1700" class="LineNr">1700 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1701" class="LineNr">1701 </span> editor-render screen, e +<span id="L1701" class="LineNr">1701 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1702" class="LineNr">1702 </span> <span class="Comment"># insert some text and hit delete and backspace a few times</span> <span id="L1703" class="LineNr">1703 </span> assume-console [ <span id="L1704" class="LineNr">1704 </span> type <span class="Constant">[abcdef]</span> @@ -1767,7 +1767,7 @@ if ('onhashchange' in window) { <span id="L1708" class="LineNr">1708 </span> press delete <span id="L1709" class="LineNr">1709 </span> press delete <span id="L1710" class="LineNr">1710 </span> ] -<span id="L1711" class="LineNr">1711 </span> editor-event-loop screen, console, e +<span id="L1711" class="LineNr">1711 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1712" class="LineNr">1712 </span> screen-should-contain [ <span id="L1713" class="LineNr">1713 </span> <span class="Constant"> . .</span> <span id="L1714" class="LineNr">1714 </span> <span class="Constant"> .af .</span> @@ -1785,7 +1785,7 @@ if ('onhashchange' in window) { <span id="L1726" class="LineNr">1726 </span> press ctrl-z <span id="L1727" class="LineNr">1727 </span> ] <span id="L1728" class="LineNr">1728 </span> run [ -<span id="L1729" class="LineNr">1729 </span> editor-event-loop screen, console, e +<span id="L1729" class="LineNr">1729 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1730" class="LineNr">1730 </span> ] <span id="L1731" class="LineNr">1731 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1732" class="LineNr">1732 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> @@ -1804,7 +1804,7 @@ if ('onhashchange' in window) { <span id="L1745" class="LineNr">1745 </span> press ctrl-z <span id="L1746" class="LineNr">1746 </span> ] <span id="L1747" class="LineNr">1747 </span> run [ -<span id="L1748" class="LineNr">1748 </span> editor-event-loop screen, console, e +<span id="L1748" class="LineNr">1748 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1749" class="LineNr">1749 </span> ] <span id="L1750" class="LineNr">1750 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1751" class="LineNr">1751 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> @@ -1823,7 +1823,7 @@ if ('onhashchange' in window) { <span id="L1764" class="LineNr">1764 </span> press ctrl-z <span id="L1765" class="LineNr">1765 </span> ] <span id="L1766" class="LineNr">1766 </span> run [ -<span id="L1767" class="LineNr">1767 </span> editor-event-loop screen, console, e +<span id="L1767" class="LineNr">1767 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1768" class="LineNr">1768 </span> ] <span id="L1769" class="LineNr">1769 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> <span id="L1770" class="LineNr">1770 </span> 4:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-column:offset</span> @@ -1842,7 +1842,7 @@ if ('onhashchange' in window) { <span id="L1783" class="LineNr">1783 </span> press ctrl-y <span id="L1784" class="LineNr">1784 </span> ] <span id="L1785" class="LineNr">1785 </span> run [ -<span id="L1786" class="LineNr">1786 </span> editor-event-loop screen, console, e +<span id="L1786" class="LineNr">1786 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1787" class="LineNr">1787 </span> ] <span id="L1788" class="LineNr">1788 </span> <span class="Comment"># first line inserted</span> <span id="L1789" class="LineNr">1789 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1862,7 +1862,7 @@ if ('onhashchange' in window) { <span id="L1803" class="LineNr">1803 </span> press ctrl-y <span id="L1804" class="LineNr">1804 </span> ] <span id="L1805" class="LineNr">1805 </span> run [ -<span id="L1806" class="LineNr">1806 </span> editor-event-loop screen, console, e +<span id="L1806" class="LineNr">1806 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1807" class="LineNr">1807 </span> ] <span id="L1808" class="LineNr">1808 </span> <span class="Comment"># first line inserted</span> <span id="L1809" class="LineNr">1809 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1882,7 +1882,7 @@ if ('onhashchange' in window) { <span id="L1823" class="LineNr">1823 </span> press ctrl-y <span id="L1824" class="LineNr">1824 </span> ] <span id="L1825" class="LineNr">1825 </span> run [ -<span id="L1826" class="LineNr">1826 </span> editor-event-loop screen, console, e +<span id="L1826" class="LineNr">1826 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1827" class="LineNr">1827 </span> ] <span id="L1828" class="LineNr">1828 </span> <span class="Comment"># first line inserted</span> <span id="L1829" class="LineNr">1829 </span> 3:num/<span class="Special">raw</span> <span class="Special"><-</span> get *e, <span class="Constant">cursor-row:offset</span> @@ -1919,7 +1919,7 @@ if ('onhashchange' in window) { <span id="L1860" class="LineNr">1860 </span> previous-coalesce-tag:num <span class="Special"><-</span> get deletion, <span class="Constant">tag:offset</span> <span id="L1861" class="LineNr">1861 </span> coalesce?:bool <span class="Special"><-</span> equal previous-coalesce-tag, <span class="Constant">2/coalesce-delete</span> <span id="L1862" class="LineNr">1862 </span> <span class="muControl">break-unless</span> coalesce? -<span id="L1863" class="LineNr">1863 </span> delete-until:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L1863" class="LineNr">1863 </span> delete-until:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L1864" class="LineNr">1864 </span> deletion <span class="Special"><-</span> put deletion, <span class="Constant">delete-until:offset</span>, delete-until <span id="L1865" class="LineNr">1865 </span> deleted-so-far:&:duplex-list:char <span class="Special"><-</span> get deletion, <span class="Constant">deleted-text:offset</span> <span id="L1866" class="LineNr">1866 </span> deleted-so-far <span class="Special"><-</span> append deleted-so-far, deleted-cell @@ -1932,7 +1932,7 @@ if ('onhashchange' in window) { <span id="L1873" class="LineNr">1873 </span> <span class="Delimiter">}</span> <span id="L1874" class="LineNr">1874 </span> <span class="Comment"># if not, create a new operation</span> <span id="L1875" class="LineNr">1875 </span> op:&:operation <span class="Special"><-</span> new <span class="Constant">operation:type</span> -<span id="L1876" class="LineNr">1876 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L1876" class="LineNr">1876 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L1877" class="LineNr">1877 </span> *op <span class="Special"><-</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> <span id="L1878" class="LineNr">1878 </span> editor <span class="Special"><-</span> add-operation editor, op <span id="L1879" class="LineNr">1879 </span><span class="Constant"> +done-adding-delete-operation</span> @@ -1948,13 +1948,13 @@ if ('onhashchange' in window) { <span id="L1889" class="LineNr">1889 </span> contents:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L1890" class="LineNr">1890 </span><span class="Constant">def]</span> <span id="L1891" class="LineNr">1891 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1892" class="LineNr">1892 </span> editor-render screen, e +<span id="L1892" class="LineNr">1892 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1893" class="LineNr">1893 </span> <span class="Comment"># insert some text and hit delete and backspace a few times</span> <span id="L1894" class="LineNr">1894 </span> assume-console [ <span id="L1895" class="LineNr">1895 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 1</span> <span id="L1896" class="LineNr">1896 </span> press ctrl-k <span id="L1897" class="LineNr">1897 </span> ] -<span id="L1898" class="LineNr">1898 </span> editor-event-loop screen, console, e +<span id="L1898" class="LineNr">1898 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1899" class="LineNr">1899 </span> screen-should-contain [ <span id="L1900" class="LineNr">1900 </span> <span class="Constant"> . .</span> <span id="L1901" class="LineNr">1901 </span> <span class="Constant"> .a .</span> @@ -1973,7 +1973,7 @@ if ('onhashchange' in window) { <span id="L1914" class="LineNr">1914 </span> press ctrl-z <span id="L1915" class="LineNr">1915 </span> ] <span id="L1916" class="LineNr">1916 </span> run [ -<span id="L1917" class="LineNr">1917 </span> editor-event-loop screen, console, e +<span id="L1917" class="LineNr">1917 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1918" class="LineNr">1918 </span> ] <span id="L1919" class="LineNr">1919 </span> screen-should-contain [ <span id="L1920" class="LineNr">1920 </span> <span class="Constant"> . .</span> @@ -1993,7 +1993,7 @@ if ('onhashchange' in window) { <span id="L1934" class="LineNr">1934 </span> press ctrl-y <span id="L1935" class="LineNr">1935 </span> ] <span id="L1936" class="LineNr">1936 </span> run [ -<span id="L1937" class="LineNr">1937 </span> editor-event-loop screen, console, e +<span id="L1937" class="LineNr">1937 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1938" class="LineNr">1938 </span> ] <span id="L1939" class="LineNr">1939 </span> <span class="Comment"># first line inserted</span> <span id="L1940" class="LineNr">1940 </span> screen-should-contain [ @@ -2014,7 +2014,7 @@ if ('onhashchange' in window) { <span id="L1955" class="LineNr">1955 </span> type <span class="Constant">[1]</span> <span id="L1956" class="LineNr">1956 </span> ] <span id="L1957" class="LineNr">1957 </span> run [ -<span id="L1958" class="LineNr">1958 </span> editor-event-loop screen, console, e +<span id="L1958" class="LineNr">1958 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L1959" class="LineNr">1959 </span> ] <span id="L1960" class="LineNr">1960 </span> screen-should-contain [ <span id="L1961" class="LineNr">1961 </span> <span class="Constant"> . .</span> @@ -2034,7 +2034,7 @@ if ('onhashchange' in window) { <span id="L1975" class="LineNr">1975 </span> top-after:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> <span id="L1976" class="LineNr">1976 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L1977" class="LineNr">1977 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> -<span id="L1978" class="LineNr">1978 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L1978" class="LineNr">1978 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L1979" class="LineNr">1979 </span> op:&:operation <span class="Special"><-</span> new <span class="Constant">operation:type</span> <span id="L1980" class="LineNr">1980 </span> *op <span class="Special"><-</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> <span id="L1981" class="LineNr">1981 </span> editor <span class="Special"><-</span> add-operation editor, op @@ -2051,13 +2051,13 @@ if ('onhashchange' in window) { <span id="L1992" class="LineNr">1992 </span> contents:text <span class="Special"><-</span> new <span class="Constant">[abc</span> <span id="L1993" class="LineNr">1993 </span><span class="Constant">def]</span> <span id="L1994" class="LineNr">1994 </span> e:&:editor <span class="Special"><-</span> new-editor contents, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L1995" class="LineNr">1995 </span> editor-render screen, e +<span id="L1995" class="LineNr">1995 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L1996" class="LineNr">1996 </span> <span class="Comment"># insert some text and hit delete and backspace a few times</span> <span id="L1997" class="LineNr">1997 </span> assume-console [ <span id="L1998" class="LineNr">1998 </span> left-click<span class="Constant"> 1</span>,<span class="Constant"> 2</span> <span id="L1999" class="LineNr">1999 </span> press ctrl-u <span id="L2000" class="LineNr">2000 </span> ] -<span id="L2001" class="LineNr">2001 </span> editor-event-loop screen, console, e +<span id="L2001" class="LineNr">2001 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2002" class="LineNr">2002 </span> screen-should-contain [ <span id="L2003" class="LineNr">2003 </span> <span class="Constant"> . .</span> <span id="L2004" class="LineNr">2004 </span> <span class="Constant"> .c .</span> @@ -2076,7 +2076,7 @@ if ('onhashchange' in window) { <span id="L2017" class="LineNr">2017 </span> press ctrl-z <span id="L2018" class="LineNr">2018 </span> ] <span id="L2019" class="LineNr">2019 </span> run [ -<span id="L2020" class="LineNr">2020 </span> editor-event-loop screen, console, e +<span id="L2020" class="LineNr">2020 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2021" class="LineNr">2021 </span> ] <span id="L2022" class="LineNr">2022 </span> screen-should-contain [ <span id="L2023" class="LineNr">2023 </span> <span class="Constant"> . .</span> @@ -2096,7 +2096,7 @@ if ('onhashchange' in window) { <span id="L2037" class="LineNr">2037 </span> press ctrl-y <span id="L2038" class="LineNr">2038 </span> ] <span id="L2039" class="LineNr">2039 </span> run [ -<span id="L2040" class="LineNr">2040 </span> editor-event-loop screen, console, e +<span id="L2040" class="LineNr">2040 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2041" class="LineNr">2041 </span> ] <span id="L2042" class="LineNr">2042 </span> <span class="Comment"># first line inserted</span> <span id="L2043" class="LineNr">2043 </span> screen-should-contain [ @@ -2117,7 +2117,7 @@ if ('onhashchange' in window) { <span id="L2058" class="LineNr">2058 </span> type <span class="Constant">[1]</span> <span id="L2059" class="LineNr">2059 </span> ] <span id="L2060" class="LineNr">2060 </span> run [ -<span id="L2061" class="LineNr">2061 </span> editor-event-loop screen, console, e +<span id="L2061" class="LineNr">2061 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2062" class="LineNr">2062 </span> ] <span id="L2063" class="LineNr">2063 </span> screen-should-contain [ <span id="L2064" class="LineNr">2064 </span> <span class="Constant"> . .</span> @@ -2137,7 +2137,7 @@ if ('onhashchange' in window) { <span id="L2078" class="LineNr">2078 </span> top-after:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">top-of-screen:offset</span> <span id="L2079" class="LineNr">2079 </span> op:&:operation <span class="Special"><-</span> new <span class="Constant">operation:type</span> <span id="L2080" class="LineNr">2080 </span> before-cursor:&:duplex-list:char <span class="Special"><-</span> get *editor, <span class="Constant">before-cursor:offset</span> -<span id="L2081" class="LineNr">2081 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> next before-cursor +<span id="L2081" class="LineNr">2081 </span> deleted-until:&:duplex-list:char <span class="Special"><-</span> <a href='065duplex_list.mu.html#L29'>next</a> before-cursor <span id="L2082" class="LineNr">2082 </span> cursor-row:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-row:offset</span> <span id="L2083" class="LineNr">2083 </span> cursor-column:num <span class="Special"><-</span> get *editor, <span class="Constant">cursor-column:offset</span> <span id="L2084" class="LineNr">2084 </span> *op <span class="Special"><-</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> @@ -2151,14 +2151,14 @@ if ('onhashchange' in window) { <span id="L2092" class="LineNr">2092 </span> <span class="Comment"># create an editor</span> <span id="L2093" class="LineNr">2093 </span> assume-screen <span class="Constant">10/width</span>, <span class="Constant">5/height</span> <span id="L2094" class="LineNr">2094 </span> e:&:editor <span class="Special"><-</span> new-editor <span class="Constant">[]</span>, <span class="Constant">0/left</span>, <span class="Constant">10/right</span> -<span id="L2095" class="LineNr">2095 </span> editor-render screen, e +<span id="L2095" class="LineNr">2095 </span> editor-render <a href='081print.mu.html#L4'>screen</a>, e <span id="L2096" class="LineNr">2096 </span> <span class="Comment"># insert some text and hit delete and backspace a few times</span> <span id="L2097" class="LineNr">2097 </span> assume-console [ <span id="L2098" class="LineNr">2098 </span> type <span class="Constant">[abc]</span> <span id="L2099" class="LineNr">2099 </span> press ctrl-u <span id="L2100" class="LineNr">2100 </span> press ctrl-z <span id="L2101" class="LineNr">2101 </span> ] -<span id="L2102" class="LineNr">2102 </span> editor-event-loop screen, console, e +<span id="L2102" class="LineNr">2102 </span> editor-event-loop <a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>, e <span id="L2103" class="LineNr">2103 </span> screen-should-contain [ <span id="L2104" class="LineNr">2104 </span> <span class="Constant"> . .</span> <span id="L2105" class="LineNr">2105 </span> <span class="Constant"> .abc .</span> diff --git a/html/filesystem.mu.html b/html/filesystem.mu.html index 22714e7f..802fde4e 100644 --- a/html/filesystem.mu.html +++ b/html/filesystem.mu.html @@ -61,12 +61,12 @@ if ('onhashchange' in window) { <span id="L5" class="LineNr"> 5 </span> <span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [ <span id="L7" class="LineNr"> 7 </span> <span class="Constant">local-scope</span> -<span id="L8" class="LineNr"> 8 </span> source-file:&:source:char <span class="Special"><-</span> start-reading <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-x]</span> -<span id="L9" class="LineNr"> 9 </span> sink-file:&:sink:char, write-routine:num <span class="Special"><-</span> start-writing <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-y]</span> +<span id="L8" class="LineNr"> 8 </span> source-file:&:source:char <span class="Special"><-</span> <a href='088file.mu.html#L21'>start-reading</a> <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-x]</span> +<span id="L9" class="LineNr"> 9 </span> sink-file:&:sink:char, write-routine:num <span class="Special"><-</span> <a href='088file.mu.html#L105'>start-writing</a> <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-y]</span> <span id="L10" class="LineNr">10 </span> <span class="Delimiter">{</span> <span id="L11" class="LineNr">11 </span> c:char, done?:bool, source-file <span class="Special"><-</span> read source-file <span id="L12" class="LineNr">12 </span> <span class="muControl">break-if</span> done? -<span id="L13" class="LineNr">13 </span> sink-file <span class="Special"><-</span> write sink-file, c +<span id="L13" class="LineNr">13 </span> sink-file <span class="Special"><-</span> <a href='075channel.mu.html#L66'>write</a> sink-file, c <span id="L14" class="LineNr">14 </span> <span class="muControl">loop</span> <span id="L15" class="LineNr">15 </span> <span class="Delimiter">}</span> <span id="L16" class="LineNr">16 </span> close sink-file diff --git a/html/http-client.mu.html b/html/http-client.mu.html index 687790fa..cd71e1ac 100644 --- a/html/http-client.mu.html +++ b/html/http-client.mu.html @@ -58,9 +58,9 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ <span id="L4" class="LineNr"> 4 </span> <span class="Constant">local-scope</span> -<span id="L5" class="LineNr"> 5 </span> google:&:source:char <span class="Special"><-</span> start-reading-from-network <span class="Constant">0/real-resources</span>, <span class="Constant">[google.com/]</span> +<span id="L5" class="LineNr"> 5 </span> google:&:source:char <span class="Special"><-</span> <a href='092socket.mu.html#L69'>start-reading-from-network</a> <span class="Constant">0/real-resources</span>, <span class="Constant">[google.com/]</span> <span id="L6" class="LineNr"> 6 </span> n:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> -<span id="L7" class="LineNr"> 7 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> +<span id="L7" class="LineNr"> 7 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> <span id="L8" class="LineNr"> 8 </span> <span class="Delimiter">{</span> <span id="L9" class="LineNr"> 9 </span> c:char, done?:bool <span class="Special"><-</span> read google <span id="L10" class="LineNr">10 </span> <span class="muControl">break-if</span> done? @@ -68,7 +68,7 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr">12 </span> buf <span class="Special"><-</span> append buf, c <span id="L13" class="LineNr">13 </span> <span class="muControl">loop</span> <span id="L14" class="LineNr">14 </span> <span class="Delimiter">}</span> -<span id="L15" class="LineNr">15 </span> result:text <span class="Special"><-</span> buffer-to-array buf +<span id="L15" class="LineNr">15 </span> result:text <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L16" class="LineNr">16 </span> open-console <span id="L17" class="LineNr">17 </span> len:num <span class="Special"><-</span> length *result <span id="L18" class="LineNr">18 </span> print <span class="Constant">0/real-screen</span>, result diff --git a/html/http-server.mu.html b/html/http-server.mu.html index 27b56980..5b4dab4a 100644 --- a/html/http-server.mu.html +++ b/html/http-server.mu.html @@ -68,11 +68,11 @@ if ('onhashchange' in window) { <span id="L13" class="LineNr">13 </span> $print <span class="Constant">[Mu socket creation returned ]</span>, socket, <span class="Constant">10/newline</span> <span id="L14" class="LineNr">14 </span> <span class="muControl">return-unless</span> socket <span id="L15" class="LineNr">15 </span> session:num <span class="Special"><-</span> $accept socket -<span id="L16" class="LineNr">16 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> new-channel<span class="Constant"> 30</span> -<span id="L17" class="LineNr">17 </span> sink <span class="Special"><-</span> start-running receive-from-socket session, sink -<span id="L18" class="LineNr">18 </span> query:text <span class="Special"><-</span> drain contents +<span id="L16" class="LineNr">16 </span> contents:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a><span class="Constant"> 30</span> +<span id="L17" class="LineNr">17 </span> sink <span class="Special"><-</span> start-running <a href='092socket.mu.html#L104'>receive-from-socket</a> session, sink +<span id="L18" class="LineNr">18 </span> query:text <span class="Special"><-</span> <a href='075channel.mu.html#L487'>drain</a> contents <span id="L19" class="LineNr">19 </span> $print <span class="Constant">[Done reading from socket.]</span>, <span class="Constant">10/newline</span> -<span id="L20" class="LineNr">20 </span> write-to-socket session, <span class="Constant">[HTTP/1.0 200 OK</span> +<span id="L20" class="LineNr">20 </span> <a href='092socket.mu.html#L132'>write-to-socket</a> session, <span class="Constant">[HTTP/1.0 200 OK</span> <span id="L21" class="LineNr">21 </span><span class="Constant">Content-type: text/plain</span> <span id="L22" class="LineNr">22 </span> <span id="L23" class="LineNr">23 </span><span class="Constant">SUCCESS!</span> diff --git a/html/lambda-to-mu.mu.html b/html/lambda-to-mu.mu.html index 5041b306..2e0feb74 100644 --- a/html/lambda-to-mu.mu.html +++ b/html/lambda-to-mu.mu.html @@ -96,7 +96,7 @@ if ('onhashchange' in window) { <span id="L36" class="LineNr"> 36 </span><span class="Comment"># printed below as < first | rest ></span> <span id="L37" class="LineNr"> 37 </span><span class="muData">container</span> pair [ <span id="L38" class="LineNr"> 38 </span> first:&:cell -<span id="L39" class="LineNr"> 39 </span> rest:&:cell +<span id="L39" class="LineNr"> 39 </span> <a href='064list.mu.html#L25'>rest</a>:&:cell <span id="L40" class="LineNr"> 40 </span>] <span id="L41" class="LineNr"> 41 </span> <span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> new-atom name:text<span class="muRecipe"> -> </span>result:&:cell [ @@ -178,12 +178,12 @@ if ('onhashchange' in window) { <span id="L118" class="LineNr">118 </span> result <span class="Special"><-</span> get pair, <span class="Constant">first:offset</span> <span id="L119" class="LineNr">119 </span>] <span id="L120" class="LineNr">120 </span> -<span id="L121" class="LineNr">121 </span><span class="muRecipe">def</span> rest x:&:cell<span class="muRecipe"> -> </span>result:&:cell [ +<span id="L121" class="LineNr">121 </span><span class="muRecipe">def</span> <a href='064list.mu.html#L25'>rest</a> x:&:cell<span class="muRecipe"> -> </span>result:&:cell [ <span id="L122" class="LineNr">122 </span> <span class="Constant">local-scope</span> <span id="L123" class="LineNr">123 </span> <span class="Constant">load-ingredients</span> <span id="L124" class="LineNr">124 </span> pair:pair, pair?:bool <span class="Special"><-</span> maybe-convert *x, <span class="Constant">pair:variant</span> <span id="L125" class="LineNr">125 </span> <span class="muControl">return-unless</span> pair?, <span class="Constant">0/nil</span> -<span id="L126" class="LineNr">126 </span> result <span class="Special"><-</span> get pair, <span class="Constant">rest:offset</span> +<span id="L126" class="LineNr">126 </span> result <span class="Special"><-</span> get pair, <span class="Constant"><a href='064list.mu.html#L25'>rest</a>:offset</span> <span id="L127" class="LineNr">127 </span>] <span id="L128" class="LineNr">128 </span> <span id="L129" class="LineNr">129 </span><span class="muRecipe">def</span> set-first base:&:cell, new-first:&:cell<span class="muRecipe"> -> </span>base:&:cell [ @@ -200,7 +200,7 @@ if ('onhashchange' in window) { <span id="L140" class="LineNr">140 </span> <span class="Constant">load-ingredients</span> <span id="L141" class="LineNr">141 </span> pair:pair, is-pair?:bool <span class="Special"><-</span> maybe-convert *base, <span class="Constant">pair:variant</span> <span id="L142" class="LineNr">142 </span> <span class="muControl">return-unless</span> is-pair? -<span id="L143" class="LineNr">143 </span> pair <span class="Special"><-</span> put pair, <span class="Constant">rest:offset</span>, new-rest +<span id="L143" class="LineNr">143 </span> pair <span class="Special"><-</span> put pair, <span class="Constant"><a href='064list.mu.html#L25'>rest</a>:offset</span>, new-rest <span id="L144" class="LineNr">144 </span> *base <span class="Special"><-</span> merge <span class="Constant">1/pair</span>, pair <span id="L145" class="LineNr">145 </span>] <span id="L146" class="LineNr">146 </span> @@ -209,7 +209,7 @@ if ('onhashchange' in window) { <span id="L149" class="LineNr">149 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a]</span> <span id="L150" class="LineNr">150 </span> x:&:cell <span class="Special"><-</span> new-atom s <span id="L151" class="LineNr">151 </span> 10:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> first x -<span id="L152" class="LineNr">152 </span> 11:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x +<span id="L152" class="LineNr">152 </span> 11:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L153" class="LineNr">153 </span> memory-should-contain [ <span id="L154" class="LineNr">154 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># first is nil</span> <span id="L155" class="LineNr">155 </span> <span class="Constant"> 11</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># rest is nil</span> @@ -224,7 +224,7 @@ if ('onhashchange' in window) { <span id="L164" class="LineNr">164 </span> y:&:cell <span class="Special"><-</span> new-pair x, <span class="Constant">0/nil</span> <span id="L165" class="LineNr">165 </span> x2:&:cell <span class="Special"><-</span> first y <span id="L166" class="LineNr">166 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal x, x2 -<span id="L167" class="LineNr">167 </span> 11:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest y +<span id="L167" class="LineNr">167 </span> 11:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> y <span id="L168" class="LineNr">168 </span> memory-should-contain [ <span id="L169" class="LineNr">169 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># first is correct</span> <span id="L170" class="LineNr">170 </span> <span class="Constant"> 11</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># rest is nil</span> @@ -236,7 +236,7 @@ if ('onhashchange' in window) { <span id="L176" class="LineNr">176 </span><span class="muRecipe">def</span> parse in:text<span class="muRecipe"> -> </span>out:&:cell [ <span id="L177" class="LineNr">177 </span> <span class="Constant">local-scope</span> <span id="L178" class="LineNr">178 </span> <span class="Constant">load-ingredients</span> -<span id="L179" class="LineNr">179 </span> s:&:stream:char <span class="Special"><-</span> new-stream in +<span id="L179" class="LineNr">179 </span> s:&:stream:char <span class="Special"><-</span> <a href='066stream.mu.html#L7'>new-stream</a> in <span id="L180" class="LineNr">180 </span> out, s <span class="Special"><-</span> parse s <span id="L181" class="LineNr">181 </span> trace<span class="Constant"> 2</span>, <span class="Constant">[app/parse]</span>, out <span id="L182" class="LineNr">182 </span>] @@ -246,27 +246,27 @@ if ('onhashchange' in window) { <span id="L186" class="LineNr">186 </span> <span class="Constant">load-ingredients</span> <span id="L187" class="LineNr">187 </span> <span class="Comment"># skip whitespace</span> <span id="L188" class="LineNr">188 </span> in <span class="Special"><-</span> skip-whitespace in -<span id="L189" class="LineNr">189 </span> c:char, eof?:bool <span class="Special"><-</span> peek in +<span id="L189" class="LineNr">189 </span> c:char, eof?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L190" class="LineNr">190 </span> <span class="muControl">return-if</span> eof?, <span class="Constant">0/nil</span> <span id="L191" class="LineNr">191 </span> pair?:bool <span class="Special"><-</span> equal c, <span class="Constant">40/open-paren</span> <span id="L192" class="LineNr">192 </span> <span class="Delimiter">{</span> <span id="L193" class="LineNr">193 </span> <span class="muControl">break-if</span> pair? <span id="L194" class="LineNr">194 </span> <span class="Comment"># atom</span> -<span id="L195" class="LineNr">195 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> +<span id="L195" class="LineNr">195 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> <span id="L196" class="LineNr">196 </span> <span class="Delimiter">{</span> -<span id="L197" class="LineNr">197 </span> done?:bool <span class="Special"><-</span> end-of-stream? in +<span id="L197" class="LineNr">197 </span> done?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L67'>end-of-stream?</a> in <span id="L198" class="LineNr">198 </span> <span class="muControl">break-if</span> done? <span id="L199" class="LineNr">199 </span> <span class="Comment"># stop before close paren or space</span> -<span id="L200" class="LineNr">200 </span> c:char <span class="Special"><-</span> peek in +<span id="L200" class="LineNr">200 </span> c:char <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L201" class="LineNr">201 </span> done? <span class="Special"><-</span> equal c, <span class="Constant">41/close-paren</span> <span id="L202" class="LineNr">202 </span> <span class="muControl">break-if</span> done? -<span id="L203" class="LineNr">203 </span> done? <span class="Special"><-</span> space? c +<span id="L203" class="LineNr">203 </span> done? <span class="Special"><-</span> <a href='061text.mu.html#L620'>space?</a> c <span id="L204" class="LineNr">204 </span> <span class="muControl">break-if</span> done? <span id="L205" class="LineNr">205 </span> c <span class="Special"><-</span> read in <span id="L206" class="LineNr">206 </span> buf <span class="Special"><-</span> append buf, c <span id="L207" class="LineNr">207 </span> <span class="muControl">loop</span> <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> -<span id="L209" class="LineNr">209 </span> s:text <span class="Special"><-</span> buffer-to-array buf +<span id="L209" class="LineNr">209 </span> s:text <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L210" class="LineNr">210 </span> out <span class="Special"><-</span> new-atom s <span id="L211" class="LineNr">211 </span> <span class="Delimiter">}</span> <span id="L212" class="LineNr">212 </span> <span class="Delimiter">{</span> @@ -276,10 +276,10 @@ if ('onhashchange' in window) { <span id="L216" class="LineNr">216 </span> out <span class="Special"><-</span> new <span class="Constant">cell:type</span> <span class="Comment"># start out with nil</span> <span id="L217" class="LineNr">217 </span> <span class="Comment"># read in first element of pair</span> <span id="L218" class="LineNr">218 </span> <span class="Delimiter">{</span> -<span id="L219" class="LineNr">219 </span> end?:bool <span class="Special"><-</span> end-of-stream? in +<span id="L219" class="LineNr">219 </span> end?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L67'>end-of-stream?</a> in <span id="L220" class="LineNr">220 </span> not-end?:bool <span class="Special"><-</span> not end? <span id="L221" class="LineNr">221 </span> assert not-end?, <span class="Constant">[unbalanced '(' in expression]</span> -<span id="L222" class="LineNr">222 </span> c <span class="Special"><-</span> peek in +<span id="L222" class="LineNr">222 </span> c <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L223" class="LineNr">223 </span> close-paren?:bool <span class="Special"><-</span> equal c, <span class="Constant">41/close-paren</span> <span id="L224" class="LineNr">224 </span> <span class="muControl">break-if</span> close-paren? <span id="L225" class="LineNr">225 </span> first:&:cell, in <span class="Special"><-</span> parse in @@ -289,11 +289,11 @@ if ('onhashchange' in window) { <span id="L229" class="LineNr">229 </span> curr:&:cell <span class="Special"><-</span> copy out <span id="L230" class="LineNr">230 </span> <span class="Delimiter">{</span> <span id="L231" class="LineNr">231 </span> in <span class="Special"><-</span> skip-whitespace in -<span id="L232" class="LineNr">232 </span> end?:bool <span class="Special"><-</span> end-of-stream? in +<span id="L232" class="LineNr">232 </span> end?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L67'>end-of-stream?</a> in <span id="L233" class="LineNr">233 </span> not-end?:bool <span class="Special"><-</span> not end? <span id="L234" class="LineNr">234 </span> assert not-end?, <span class="Constant">[unbalanced '(' in expression]</span> <span id="L235" class="LineNr">235 </span> <span class="Comment"># termination check: ')'</span> -<span id="L236" class="LineNr">236 </span> c <span class="Special"><-</span> peek in +<span id="L236" class="LineNr">236 </span> c <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L237" class="LineNr">237 </span> <span class="Delimiter">{</span> <span id="L238" class="LineNr">238 </span> close-paren?:bool <span class="Special"><-</span> equal c, <span class="Constant">41/close-paren</span> <span id="L239" class="LineNr">239 </span> <span class="muControl">break-unless</span> close-paren? @@ -301,19 +301,19 @@ if ('onhashchange' in window) { <span id="L241" class="LineNr">241 </span> <span class="muControl">break</span> <span class="Constant">+end-pair</span> <span id="L242" class="LineNr">242 </span> <span class="Delimiter">}</span> <span id="L243" class="LineNr">243 </span> <span class="Comment"># still here? read next element of pair</span> -<span id="L244" class="LineNr">244 </span> next:&:cell, in <span class="Special"><-</span> parse in -<span id="L245" class="LineNr">245 </span> is-dot?:bool <span class="Special"><-</span> atom-match? next, <span class="Constant">[.]</span> +<span id="L244" class="LineNr">244 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:cell, in <span class="Special"><-</span> parse in +<span id="L245" class="LineNr">245 </span> is-dot?:bool <span class="Special"><-</span> atom-match? <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">[.]</span> <span id="L246" class="LineNr">246 </span> <span class="Delimiter">{</span> <span id="L247" class="LineNr">247 </span> <span class="muControl">break-if</span> is-dot? -<span id="L248" class="LineNr">248 </span> next-curr:&:cell <span class="Special"><-</span> new-pair next, <span class="Constant">0/nil</span> +<span id="L248" class="LineNr">248 </span> next-curr:&:cell <span class="Special"><-</span> new-pair <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/nil</span> <span id="L249" class="LineNr">249 </span> curr <span class="Special"><-</span> set-rest curr, next-curr -<span id="L250" class="LineNr">250 </span> curr <span class="Special"><-</span> rest curr +<span id="L250" class="LineNr">250 </span> curr <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> curr <span id="L251" class="LineNr">251 </span> <span class="Delimiter">}</span> <span id="L252" class="LineNr">252 </span> <span class="Delimiter">{</span> <span id="L253" class="LineNr">253 </span> <span class="muControl">break-unless</span> is-dot? <span id="L254" class="LineNr">254 </span> <span class="Comment"># deal with dotted pair</span> <span id="L255" class="LineNr">255 </span> in <span class="Special"><-</span> skip-whitespace in -<span id="L256" class="LineNr">256 </span> c <span class="Special"><-</span> peek in +<span id="L256" class="LineNr">256 </span> c <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L257" class="LineNr">257 </span> not-close-paren?:bool <span class="Special"><-</span> not-equal c, <span class="Constant">41/close-paren</span> <span id="L258" class="LineNr">258 </span> assert not-close-paren?, <span class="Constant">[')' cannot immediately follow '.']</span> <span id="L259" class="LineNr">259 </span> final:&:cell <span class="Special"><-</span> parse in @@ -321,7 +321,7 @@ if ('onhashchange' in window) { <span id="L261" class="LineNr">261 </span> <span class="Comment"># we're not gonna update curr, so better make sure the next iteration</span> <span id="L262" class="LineNr">262 </span> <span class="Comment"># is going to end the pair</span> <span id="L263" class="LineNr">263 </span> in <span class="Special"><-</span> skip-whitespace in -<span id="L264" class="LineNr">264 </span> c <span class="Special"><-</span> peek in +<span id="L264" class="LineNr">264 </span> c <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L265" class="LineNr">265 </span> close-paren?:bool <span class="Special"><-</span> equal c, <span class="Constant">41/close-paren</span> <span id="L266" class="LineNr">266 </span> assert close-paren?, <span class="Constant">['.' must be followed by exactly one expression before ')']</span> <span id="L267" class="LineNr">267 </span> <span class="Delimiter">}</span> @@ -335,11 +335,11 @@ if ('onhashchange' in window) { <span id="L275" class="LineNr">275 </span> <span class="Constant">local-scope</span> <span id="L276" class="LineNr">276 </span> <span class="Constant">load-ingredients</span> <span id="L277" class="LineNr">277 </span> <span class="Delimiter">{</span> -<span id="L278" class="LineNr">278 </span> done?:bool <span class="Special"><-</span> end-of-stream? in +<span id="L278" class="LineNr">278 </span> done?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L67'>end-of-stream?</a> in <span id="L279" class="LineNr">279 </span> <span class="muControl">return-if</span> done?, <span class="Constant">0/null</span> -<span id="L280" class="LineNr">280 </span> c:char <span class="Special"><-</span> peek in -<span id="L281" class="LineNr">281 </span> space?:bool <span class="Special"><-</span> space? c -<span id="L282" class="LineNr">282 </span> <span class="muControl">break-unless</span> space? +<span id="L280" class="LineNr">280 </span> c:char <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in +<span id="L281" class="LineNr">281 </span> <a href='061text.mu.html#L620'>space?</a>:bool <span class="Special"><-</span> <a href='061text.mu.html#L620'>space?</a> c +<span id="L282" class="LineNr">282 </span> <span class="muControl">break-unless</span> <a href='061text.mu.html#L620'>space?</a> <span id="L283" class="LineNr">283 </span> read in <span class="Comment"># skip</span> <span id="L284" class="LineNr">284 </span> <span class="muControl">loop</span> <span id="L285" class="LineNr">285 </span> <span class="Delimiter">}</span> @@ -348,12 +348,12 @@ if ('onhashchange' in window) { <span id="L288" class="LineNr">288 </span><span class="muRecipe">def</span> to-text x:&:cell<span class="muRecipe"> -> </span>out:text [ <span id="L289" class="LineNr">289 </span> <span class="Constant">local-scope</span> <span id="L290" class="LineNr">290 </span> <span class="Constant">load-ingredients</span> -<span id="L291" class="LineNr">291 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> -<span id="L292" class="LineNr">292 </span> buf <span class="Special"><-</span> to-buffer x, buf -<span id="L293" class="LineNr">293 </span> out <span class="Special"><-</span> buffer-to-array buf +<span id="L291" class="LineNr">291 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> +<span id="L292" class="LineNr">292 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> x, buf +<span id="L293" class="LineNr">293 </span> out <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L294" class="LineNr">294 </span>] <span id="L295" class="LineNr">295 </span> -<span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> to-buffer x:&:cell, buf:&:buffer<span class="muRecipe"> -> </span>buf:&:buffer [ +<span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> <a href='064list.mu.html#L307'>to-buffer</a> x:&:cell, buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L297" class="LineNr">297 </span> <span class="Constant">local-scope</span> <span id="L298" class="LineNr">298 </span> <span class="Constant">load-ingredients</span> <span id="L299" class="LineNr">299 </span> <span class="Comment"># base case: empty cell</span> @@ -372,10 +372,10 @@ if ('onhashchange' in window) { <span id="L312" class="LineNr">312 </span> <span class="Comment"># recursive case: pair</span> <span id="L313" class="LineNr">313 </span> buf <span class="Special"><-</span> append buf, <span class="Constant">[< ]</span> <span id="L314" class="LineNr">314 </span> first:&:cell <span class="Special"><-</span> first x -<span id="L315" class="LineNr">315 </span> buf <span class="Special"><-</span> to-buffer first, buf +<span id="L315" class="LineNr">315 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> first, buf <span id="L316" class="LineNr">316 </span> buf <span class="Special"><-</span> append buf, <span class="Constant">[ | ]</span> -<span id="L317" class="LineNr">317 </span> rest:&:cell <span class="Special"><-</span> rest x -<span id="L318" class="LineNr">318 </span> buf <span class="Special"><-</span> to-buffer rest, buf +<span id="L317" class="LineNr">317 </span> <a href='064list.mu.html#L25'>rest</a>:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L318" class="LineNr">318 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> <a href='064list.mu.html#L25'>rest</a>, buf <span id="L319" class="LineNr">319 </span> buf <span class="Special"><-</span> append buf, <span class="Constant">[ >]</span> <span id="L320" class="LineNr">320 </span>] <span id="L321" class="LineNr">321 </span> @@ -412,12 +412,12 @@ if ('onhashchange' in window) { <span id="L352" class="LineNr">352 </span> ] <span id="L353" class="LineNr">353 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x <span id="L354" class="LineNr">354 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L355" class="LineNr">355 </span> x2:&:cell <span class="Special"><-</span> rest x +<span id="L355" class="LineNr">355 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L356" class="LineNr">356 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> <span id="L357" class="LineNr">357 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 <span id="L358" class="LineNr">358 </span> x3:&:cell <span class="Special"><-</span> first x2 <span id="L359" class="LineNr">359 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L360" class="LineNr">360 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x2 +<span id="L360" class="LineNr">360 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 <span id="L361" class="LineNr">361 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L362" class="LineNr">362 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L363" class="LineNr">363 </span> memory-should-contain [ @@ -440,12 +440,12 @@ if ('onhashchange' in window) { <span id="L380" class="LineNr">380 </span> ] <span id="L381" class="LineNr">381 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x <span id="L382" class="LineNr">382 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L383" class="LineNr">383 </span> x2:&:cell <span class="Special"><-</span> rest x +<span id="L383" class="LineNr">383 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L384" class="LineNr">384 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> <span id="L385" class="LineNr">385 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 <span id="L386" class="LineNr">386 </span> x3:&:cell <span class="Special"><-</span> first x2 <span id="L387" class="LineNr">387 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L388" class="LineNr">388 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x2 +<span id="L388" class="LineNr">388 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 <span id="L389" class="LineNr">389 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L390" class="LineNr">390 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L391" class="LineNr">391 </span> memory-should-contain [ @@ -468,16 +468,16 @@ if ('onhashchange' in window) { <span id="L408" class="LineNr">408 </span> ] <span id="L409" class="LineNr">409 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x <span id="L410" class="LineNr">410 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L411" class="LineNr">411 </span> x2:&:cell <span class="Special"><-</span> rest x +<span id="L411" class="LineNr">411 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L412" class="LineNr">412 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> <span id="L413" class="LineNr">413 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 <span id="L414" class="LineNr">414 </span> x3:&:cell <span class="Special"><-</span> first x2 <span id="L415" class="LineNr">415 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L416" class="LineNr">416 </span> x4:&:cell <span class="Special"><-</span> rest x2 +<span id="L416" class="LineNr">416 </span> x4:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 <span id="L417" class="LineNr">417 </span> 14:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x4 <span id="L418" class="LineNr">418 </span> x5:&:cell <span class="Special"><-</span> first x4 <span id="L419" class="LineNr">419 </span> s3:text, 15:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x5, <span class="Constant">atom:variant</span> -<span id="L420" class="LineNr">420 </span> 16:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x4 +<span id="L420" class="LineNr">420 </span> 16:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x4 <span id="L421" class="LineNr">421 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L422" class="LineNr">422 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L423" class="LineNr">423 </span> 40:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s3 @@ -507,8 +507,8 @@ if ('onhashchange' in window) { <span id="L447" class="LineNr">447 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x <span id="L448" class="LineNr">448 </span> x2:&:cell <span class="Special"><-</span> first x1 <span id="L449" class="LineNr">449 </span> s1:text, 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x2, <span class="Constant">atom:variant</span> -<span id="L450" class="LineNr">450 </span> 13:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x1 -<span id="L451" class="LineNr">451 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x +<span id="L450" class="LineNr">450 </span> 13:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x1 +<span id="L451" class="LineNr">451 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L452" class="LineNr">452 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L453" class="LineNr">453 </span> memory-should-contain [ <span id="L454" class="LineNr">454 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># parse result is a pair</span> @@ -532,11 +532,11 @@ if ('onhashchange' in window) { <span id="L472" class="LineNr">472 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x <span id="L473" class="LineNr">473 </span> x2:&:cell <span class="Special"><-</span> first x1 <span id="L474" class="LineNr">474 </span> s1:text, 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x2, <span class="Constant">atom:variant</span> -<span id="L475" class="LineNr">475 </span> 13:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x1 -<span id="L476" class="LineNr">476 </span> x3:&:cell <span class="Special"><-</span> rest x +<span id="L475" class="LineNr">475 </span> 13:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x1 +<span id="L476" class="LineNr">476 </span> x3:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L477" class="LineNr">477 </span> x4:&:cell <span class="Special"><-</span> first x3 <span id="L478" class="LineNr">478 </span> s2:text, 14:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x4, <span class="Constant">atom:variant</span> -<span id="L479" class="LineNr">479 </span> 15:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> rest x3 +<span id="L479" class="LineNr">479 </span> 15:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x3 <span id="L480" class="LineNr">480 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L481" class="LineNr">481 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L482" class="LineNr">482 </span> memory-should-contain [ @@ -584,7 +584,7 @@ if ('onhashchange' in window) { <span id="L524" class="LineNr">524 </span> ] <span id="L525" class="LineNr">525 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x <span id="L526" class="LineNr">526 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L527" class="LineNr">527 </span> x2:&:cell <span class="Special"><-</span> rest x +<span id="L527" class="LineNr">527 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L528" class="LineNr">528 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> <span id="L529" class="LineNr">529 </span> s2:text, 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x2, <span class="Constant">atom:variant</span> <span id="L530" class="LineNr">530 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 @@ -608,12 +608,12 @@ if ('onhashchange' in window) { <span id="L548" class="LineNr">548 </span> ] <span id="L549" class="LineNr">549 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x <span id="L550" class="LineNr">550 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L551" class="LineNr">551 </span> x2:&:cell <span class="Special"><-</span> rest x +<span id="L551" class="LineNr">551 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x <span id="L552" class="LineNr">552 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> <span id="L553" class="LineNr">553 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 <span id="L554" class="LineNr">554 </span> x3:&:cell <span class="Special"><-</span> first x2 <span id="L555" class="LineNr">555 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L556" class="LineNr">556 </span> x4:&:cell <span class="Special"><-</span> rest x2 +<span id="L556" class="LineNr">556 </span> x4:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 <span id="L557" class="LineNr">557 </span> s3:text, 14:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x4, <span class="Constant">atom:variant</span> <span id="L558" class="LineNr">558 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L559" class="LineNr">559 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 @@ -635,12 +635,12 @@ if ('onhashchange' in window) { <span id="L575" class="LineNr">575 </span><span class="muRecipe">def</span> to-mu in:&:cell<span class="muRecipe"> -> </span>out:text [ <span id="L576" class="LineNr">576 </span> <span class="Constant">local-scope</span> <span id="L577" class="LineNr">577 </span> <span class="Constant">load-ingredients</span> -<span id="L578" class="LineNr">578 </span> buf:&:buffer <span class="Special"><-</span> new-buffer<span class="Constant"> 30</span> +<span id="L578" class="LineNr">578 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> <span id="L579" class="LineNr">579 </span> buf <span class="Special"><-</span> to-mu in, buf -<span id="L580" class="LineNr">580 </span> out <span class="Special"><-</span> buffer-to-array buf +<span id="L580" class="LineNr">580 </span> out <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L581" class="LineNr">581 </span>] <span id="L582" class="LineNr">582 </span> -<span id="L583" class="LineNr">583 </span><span class="muRecipe">def</span> to-mu in:&:cell, buf:&:buffer<span class="muRecipe"> -> </span>buf:&:buffer, result-name:text [ +<span id="L583" class="LineNr">583 </span><span class="muRecipe">def</span> to-mu in:&:cell, buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a>, result-name:text [ <span id="L584" class="LineNr">584 </span> <span class="Constant">local-scope</span> <span id="L585" class="LineNr">585 </span> <span class="Constant">load-ingredients</span> <span id="L586" class="LineNr">586 </span> <span class="Comment"># null cell? no change.</span> diff --git a/html/nqueens.mu.html b/html/nqueens.mu.html index 46828fd8..a8015e25 100644 --- a/html/nqueens.mu.html +++ b/html/nqueens.mu.html @@ -96,7 +96,7 @@ if ('onhashchange' in window) { <span id="L39" class="LineNr">39 </span> queens:&:list:square <span class="Special"><-</span> push curr, queens <span id="L40" class="LineNr">40 </span> sub-result:num <span class="Special"><-</span> nqueens n, queens <span id="L41" class="LineNr">41 </span> result <span class="Special"><-</span> add result, sub-result -<span id="L42" class="LineNr">42 </span> queens <span class="Special"><-</span> rest queens +<span id="L42" class="LineNr">42 </span> queens <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> queens <span id="L43" class="LineNr">43 </span> <span class="Delimiter">}</span> <span id="L44" class="LineNr">44 </span> next-file <span class="Special"><-</span> add next-file,<span class="Constant"> 1</span> <span id="L45" class="LineNr">45 </span> <span class="muControl">loop</span> @@ -122,7 +122,7 @@ if ('onhashchange' in window) { <span id="L65" class="LineNr">65 </span> qfile:num <span class="Special"><-</span> get q, <span class="Constant">file:offset</span> <span id="L66" class="LineNr">66 </span> file-match?:bool <span class="Special"><-</span> equal curr-file, qfile <span id="L67" class="LineNr">67 </span> <span class="muControl">return-if</span> file-match?, <span class="Constant">1/conflict-found</span> -<span id="L68" class="LineNr">68 </span> queens <span class="Special"><-</span> rest queens +<span id="L68" class="LineNr">68 </span> queens <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> queens <span id="L69" class="LineNr">69 </span> <span class="muControl">loop</span> <span id="L70" class="LineNr">70 </span> <span class="Delimiter">}</span> <span id="L71" class="LineNr">71 </span> <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span> @@ -140,11 +140,11 @@ if ('onhashchange' in window) { <span id="L83" class="LineNr">83 </span> qfile:num <span class="Special"><-</span> get q, <span class="Constant">file:offset</span> <span id="L84" class="LineNr">84 </span> rank-delta:num <span class="Special"><-</span> subtract qrank, curr-rank <span id="L85" class="LineNr">85 </span> file-delta:num <span class="Special"><-</span> subtract qfile, curr-file -<span id="L86" class="LineNr">86 </span> rank-delta <span class="Special"><-</span> abs rank-delta -<span id="L87" class="LineNr">87 </span> file-delta <span class="Special"><-</span> abs file-delta +<span id="L86" class="LineNr">86 </span> rank-delta <span class="Special"><-</span> <a href='070table.mu.html#L103'>abs</a> rank-delta +<span id="L87" class="LineNr">87 </span> file-delta <span class="Special"><-</span> <a href='070table.mu.html#L103'>abs</a> file-delta <span id="L88" class="LineNr">88 </span> diagonal-match?:bool <span class="Special"><-</span> equal rank-delta, file-delta <span id="L89" class="LineNr">89 </span> <span class="muControl">return-if</span> diagonal-match?, <span class="Constant">1/conflict-found</span> -<span id="L90" class="LineNr">90 </span> queens <span class="Special"><-</span> rest queens +<span id="L90" class="LineNr">90 </span> queens <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> queens <span id="L91" class="LineNr">91 </span> <span class="muControl">loop</span> <span id="L92" class="LineNr">92 </span> <span class="Delimiter">}</span> <span id="L93" class="LineNr">93 </span> <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span> diff --git a/html/real-files.mu.html b/html/real-files.mu.html index 2a02237c..b53070db 100644 --- a/html/real-files.mu.html +++ b/html/real-files.mu.html @@ -66,7 +66,7 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr">12 </span> f <span class="Special"><-</span> $close-file f <span id="L13" class="LineNr">13 </span> $print <span class="Constant">[file after closing: ]</span>, f, <span class="Constant">10/newline</span> <span id="L14" class="LineNr">14 </span> f <span class="Special"><-</span> $open-file-for-writing <span class="Constant">[/tmp/mu-y]</span> -<span id="L15" class="LineNr">15 </span> $print <span class="Constant">[file to write to: ]</span>, f, <span class="Constant">10/newline</span> +<span id="L15" class="LineNr">15 </span> $print <span class="Constant">[file to <a href='075channel.mu.html#L66'>write</a> to: ]</span>, f, <span class="Constant">10/newline</span> <span id="L16" class="LineNr">16 </span> $write-to-file f, c <span id="L17" class="LineNr">17 </span> f <span class="Special"><-</span> $close-file f <span id="L18" class="LineNr">18 </span>] diff --git a/html/screen.mu.html b/html/screen.mu.html index 58b90824..2853d77c 100644 --- a/html/screen.mu.html +++ b/html/screen.mu.html @@ -60,24 +60,24 @@ if ('onhashchange' in window) { <span id="L6" class="LineNr"> 6 </span> open-console <span id="L7" class="LineNr"> 7 </span> 10:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L8" class="LineNr"> 8 </span> print <span class="Constant">0/screen</span>, 10:char/a, <span class="Constant">2/red</span> -<span id="L9" class="LineNr"> 9 </span> 1:num/<span class="Special">raw</span>, 2:num/<span class="Special">raw</span> <span class="Special"><-</span> cursor-position <span class="Constant">0/screen</span> -<span id="L10" class="LineNr">10 </span> wait-for-event <span class="Constant">0/console</span> -<span id="L11" class="LineNr">11 </span> clear-screen <span class="Constant">0/screen</span> -<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> +<span id="L9" class="LineNr"> 9 </span> 1:num/<span class="Special">raw</span>, 2:num/<span class="Special">raw</span> <span class="Special"><-</span> <a href='081print.mu.html#L428'>cursor-position</a> <span class="Constant">0/screen</span> +<span id="L10" class="LineNr">10 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> +<span id="L11" class="LineNr">11 </span> <a href='081print.mu.html#L27'>clear-screen</a> <span class="Constant">0/screen</span> +<span id="L12" class="LineNr">12 </span> <a href='081print.mu.html#L442'>move-cursor</a> <span class="Constant">0/screen</span>, <span class="Constant">0/row</span>, <span class="Constant">4/column</span> <span id="L13" class="LineNr">13 </span> 10:char <span class="Special"><-</span> copy <span class="Constant">98/b</span> <span id="L14" class="LineNr">14 </span> print <span class="Constant">0/screen</span>, 10:char -<span id="L15" class="LineNr">15 </span> wait-for-event <span class="Constant">0/console</span> -<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> -<span id="L17" class="LineNr">17 </span> clear-line <span class="Constant">0/screen</span> -<span id="L18" class="LineNr">18 </span> wait-for-event <span class="Constant">0/console</span> -<span id="L19" class="LineNr">19 </span> cursor-down <span class="Constant">0/screen</span> -<span id="L20" class="LineNr">20 </span> wait-for-event <span class="Constant">0/console</span> -<span id="L21" class="LineNr">21 </span> cursor-right <span class="Constant">0/screen</span> -<span id="L22" class="LineNr">22 </span> wait-for-event <span class="Constant">0/console</span> -<span id="L23" class="LineNr">23 </span> cursor-left <span class="Constant">0/screen</span> -<span id="L24" class="LineNr">24 </span> wait-for-event <span class="Constant">0/console</span> -<span id="L25" class="LineNr">25 </span> cursor-up <span class="Constant">0/screen</span> -<span id="L26" class="LineNr">26 </span> wait-for-event <span class="Constant">0/console</span> +<span id="L15" class="LineNr">15 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> +<span id="L16" class="LineNr">16 </span> <a href='081print.mu.html#L442'>move-cursor</a> <span class="Constant">0/screen</span>, <span class="Constant">0/row</span>, <span class="Constant">0/column</span> +<span id="L17" class="LineNr">17 </span> <a href='081print.mu.html#L381'>clear-line</a> <span class="Constant">0/screen</span> +<span id="L18" class="LineNr">18 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> +<span id="L19" class="LineNr">19 </span> <a href='081print.mu.html#L487'>cursor-down</a> <span class="Constant">0/screen</span> +<span id="L20" class="LineNr">20 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> +<span id="L21" class="LineNr">21 </span> <a href='081print.mu.html#L523'>cursor-right</a> <span class="Constant">0/screen</span> +<span id="L22" class="LineNr">22 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> +<span id="L23" class="LineNr">23 </span> <a href='081print.mu.html#L542'>cursor-left</a> <span class="Constant">0/screen</span> +<span id="L24" class="LineNr">24 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> +<span id="L25" class="LineNr">25 </span> <a href='081print.mu.html#L506'>cursor-up</a> <span class="Constant">0/screen</span> +<span id="L26" class="LineNr">26 </span> <a href='084console.mu.html#L88'>wait-for-event</a> <span class="Constant">0/console</span> <span id="L27" class="LineNr">27 </span> close-console <span id="L28" class="LineNr">28 </span>] </pre> |