about summary refs log tree commit diff stats
path: root/arc
ModeNameSize
d---------.traces12326log stats plain
-rw-r--r--Readme435log stats plain blame
-rw-r--r--blocking.arc.t900log stats plain blame
-rw-r--r--buffered-stdin.mu1263log stats plain blame
-rw-r--r--callcc.mu599log stats plain blame
-rw-r--r--channel.mu1941log stats plain blame
d---------charterm268log stats plain
-rw-r--r--chessboard.arc.t12726log stats plain blame
-rw-r--r--chessboard.mu11850log stats plain blame
-rw-r--r--color-repl.mu23324log stats plain blame
-rw-r--r--counters.mu1190log stats plain blame
-rw-r--r--edit.arc.t1161log stats plain blame
-rw-r--r--edit.mu813log stats plain blame
-rw-r--r--exuberant-ctags-rc298log stats plain blame
-rw-r--r--factorial.mu629log stats plain blame
-rw-r--r--fork.mu408log stats plain blame
-rw-r--r--generic.mu898log stats plain blame
-rw-r--r--graphics.mu889log stats plain blame
-rw-r--r--highlights969log stats plain blame
-rw-r--r--load.arc775log stats plain blame
-rwxr-xr-xmu615log stats plain blame
-rw-r--r--mu.arc127823log stats plain blame
-rw-r--r--mu.arc.t171613log stats plain blame
-rw-r--r--mu.arc.t.html562366log stats plain blame
-rw-r--r--render.vim5000log stats plain blame
-rw-r--r--scratch.vim1558log stats plain blame
-rw-r--r--stdin.mu1091log stats plain blame
-rw-r--r--tangle.mu963log stats plain blame
-rw-r--r--trace.arc.t73475log stats plain blame
-rw-r--r--trace.mu49823log stats plain blame
-rw-r--r--vimrc.vim270log stats plain blame
-rw-r--r--x.mu142log stats plain blame
ass="p"></script> </head> <body> <pre id='vimCodeElement'> <span class="Comment">//: Support jumps to special labels called 'targets'. Targets must be in the</span> <span class="Comment">//: same recipe as the jump, and must be unique in that recipe. Targets always</span> <span class="Comment">//: start with a '+'.</span> <span class="Comment">//:</span> <span class="Comment">//: We'll also treat 'break' and 'loop' as jumps. The choice of name is</span> <span class="Comment">//: just documentation about intent; use 'break' to indicate you're exiting</span> <span class="Comment">//: one or more loop nests, and 'loop' to indicate you're skipping to the next</span> <span class="Comment">//: iteration of some containing loop nest.</span> <span class="Delimiter">:(scenario jump_to_label)</span> def main [ jump +target:label <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> +target ] <span class="traceAbsent">-mem: storing 0 in location 1</span> <span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span> put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;label&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span class="Delimiter">:(before &quot;End Instruction Modifying Transforms&quot;)</span> Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>transform_labels<span class="Delimiter">);</span> <span class="Comment">// idempotent</span> <span class="Delimiter">:(code)</span> <span class="Normal">void</span> transform_labels<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt; offset<span class="Delimiter">;</span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Normal">const</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span class="Normal">if</span> <span class="Delimiter">(</span>starts_with<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>label<span class="Delimiter">,</span> <span class="Constant">&quot;+&quot;</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">))</span> <span class="Delimiter">{</span> put<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">,</span> i<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Normal">else</span> <span class="Delimiter">{</span> raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;duplicate label '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>label &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> <span class="Comment">// have all jumps skip some random but noticeable and deterministic amount of code</span> put<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>label<span class="Delimiter">,</span> <span class="Constant">9999</span><span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> instruction&amp; inst = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'jump' expects an ingredient but got none</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;jump-unless&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt; <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' expects 2 ingredients but got &quot;</span> &lt;&lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break&quot;</span><span class="Delimiter">)</span> &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Normal">if</span> <span class="Delimiter">((</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;loop-unless&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break-if&quot;</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;break-unless&quot;</span><span class="Delimiter">)</span> &amp;&amp; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt;= <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> replace_offset<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">),</span> offset<span class="Delimiter">,</span> i<span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> <span class="Delimiter">:(code)</span> <span class="Normal">void</span> replace_offset<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">int</span>&gt;&amp; offset<span class="Delimiter">,</span> <span class="Normal">const</span> <span class="Normal">int</span> current_offset<span class="Delimiter">,</span> <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Delimiter">{</span> raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;jump target must be offset or label but is '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// no jump by default</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// non-labels will be handled like other number operands</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_jump_target<span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't jump to label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// no jump by default</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;can't find label '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// no jump by default</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Delimiter">}</span> x<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>get<span class="Delimiter">(</span>offset<span class="Delimiter">,</span> x<span class="Delimiter">.</span>name<span class="Delimiter">)</span> - current_offset<span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Normal">bool</span> is_jump_target<span class="Delimiter">(</span>string label<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Identifier">return</span> starts_with<span class="Delimiter">(</span>label<span class="Delimiter">,</span> <span class="Constant">&quot;+&quot;</span><span class="Delimiter">);</span> <span class="Delimiter">}</span> <span class="Delimiter">:(scenario break_to_label)</span> def main [ <span class="Delimiter">{</span> <span class="Delimiter">{</span> <span class="Identifier">break</span> +target:label <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> +target ] <span class="traceAbsent">-mem: storing 0 in location 1</span> <span class="Delimiter">:(scenario jump_if_to_label)</span> def main [ <span class="Delimiter">{</span> <span class="Delimiter">{</span> jump-<span class="Normal">if</span> <span class="Constant">1</span><span class="Delimiter">,</span> +target:label <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> +target ] <span class="traceAbsent">-mem: storing 0 in location 1</span> <span class="Delimiter">:(scenario loop_unless_to_label)</span> def main [ <span class="Delimiter">{</span> <span class="Delimiter">{</span> loop-unless <span class="Constant">0</span><span class="Delimiter">,</span> +target:label <span class="Comment"># loop/break with a label don't care about braces</span> <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Delimiter">}</span> <span class="Delimiter">}</span> +target ] <span class="traceAbsent">-mem: storing 0 in location 1</span> <span class="Delimiter">:(scenario jump_runs_code_after_label)</span> def main [ <span class="Comment"># first a few lines of padding to exercise the offset computation</span> <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> jump +target:label <span class="Constant">4</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> +target <span class="Constant">5</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> ] <span class="traceContains">+mem: storing 0 in location 5</span> <span class="traceAbsent">-mem: storing 0 in location 4</span> <span class="Delimiter">:(scenario jump_fails_without_target)</span> <span class="Special">% Hide_errors = true;</span> def main [ jump ] <span class="traceContains">+error: main: 'jump' expects an ingredient but got none</span> <span class="Delimiter">:(scenario jump_fails_without_target_2)</span> <span class="Special">% Hide_errors = true;</span> def main [ jump-<span class="Normal">if</span> <span class="Constant">1</span>/<span class="Constant">true</span> ] <span class="traceContains">+error: main: 'jump-if' expects 2 ingredients but got 1</span> <span class="Delimiter">:(scenario recipe_fails_on_duplicate_jump_target)</span> <span class="Special">% Hide_errors = true;</span> def main [ +label <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> +label <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> ] <span class="traceContains">+error: main: duplicate label '+label'</span> <span class="Delimiter">:(scenario jump_ignores_nontarget_label)</span> <span class="Special">% Hide_errors = true;</span> def main [ <span class="Comment"># first a few lines of padding to exercise the offset computation</span> <span class="Constant">1</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Constant">2</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> <span class="Constant">3</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> jump $target:label <span class="Constant">4</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> $target <span class="Constant">5</span>:number<span class="Special"> &lt;- </span>copy <span class="Constant">0</span> ] <span class="traceContains">+error: main: can't jump to label '$target'</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->