about summary refs log tree commit diff stats
path: root/apps/ex1.mu
blob: 41609fac35066ea693c28985f90a18fee0d84498 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
# First example: return the answer to the Ultimate Question of Life, the
# Universe, and Everything.
#
# To run:
#   $ ./translate_mu apps/ex1.mu
#   $ ./a.elf
# Expected result:
#   $ echo $?
#   42

fn main -> _/ebx: int {
  return 0x2a  # Mu requires hexadecimal
}
5 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 076continuation.cc</title>
<meta name="Generator" content="Vim/8.0">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #aaaaaa; background-color: #080808; }
body { font-size:12pt; font-family: monospace; color: #aaaaaa; background-color: #080808; }
.subxS2Comment a { color:inherit; }
.subxS1Comment a { color:inherit; }
.subxComment a { color:inherit; }
.subxH2Comment a { color:inherit; }
.subxH1Comment a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.traceAbsent { color: #c00000; }
.LineNr { color:#444444; }
.Constant { color:#00a0a0; }
.muRecipe { color: #ff8700; }
.Delimiter { color:#800080; }
.Special { color:#c00000; }
.Identifier { color:#c0a020; }
.Normal { color: #aaaaaa; background-color: #080808; padding-bottom: 1px; }
.Comment { color: #8080ff; }
.cSpecial { color: #008000; }
.traceContains { color: #008000; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/master/076continuation.cc'>https://github.com/akkartik/mu/blob/master/076continuation.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="Comment">//: Continuations are a powerful primitive for constructing advanced kinds of</span>
<span id="L2" class="LineNr">  2 </span><span class="Comment">//: control *policies* like back-tracking.</span>
<span id="L3" class="LineNr">  3 </span><span class="Comment">//:</span>
<span id="L4" class="LineNr">  4 </span><span class="Comment">//: In Mu, continuations are first-class and delimited, and are constructed</span>
<span id="L5" class="LineNr">  5 </span><span class="Comment">//: out of two primitives:</span>
<span id="L6" class="LineNr">  6 </span><span class="Comment">//:</span>
<span id="L7" class="LineNr">  7 </span><span class="Comment">//:  * 'call-with-continuation-mark' marks the top of the call stack and then</span>
<span id="L8" class="LineNr">  8 </span><span class="Comment">//:    calls the provided recipe.</span>
<span id="L9" class="LineNr">  9 </span><span class="Comment">//:  * 'return-continuation-until-mark' copies the top of the stack</span>
<span id="L10" class="LineNr"> 10 </span><span class="Comment">//:    until the mark, and returns it as the result of</span>
<span id="L11" class="LineNr"> 11 </span><span class="Comment">//:    'call-with-continuation-mark' (which might be a distant ancestor on the</span>
<span id="L12" class="LineNr"> 12 </span><span class="Comment">//:    call stack; intervening calls don't return)</span>
<span id="L13" class="LineNr"> 13 </span><span class="Comment">//:</span>
<span id="L14" class="LineNr"> 14 </span><span class="Comment">//: The resulting slice of the stack can now be called just like a regular</span>
<span id="L15" class="LineNr"> 15 </span><span class="Comment">//: recipe.</span>
<span id="L16" class="LineNr"> 16 </span><span class="Comment">//:</span>
<span id="L17" class="LineNr"> 17 </span><span class="Comment">//: See the example programs continuation*.mu to get a sense for the</span>
<span id="L18" class="LineNr"> 18 </span><span class="Comment">//: possibilities.</span>
<span id="L19" class="LineNr"> 19 </span><span class="Comment">//:</span>
<span id="L20" class="LineNr"> 20 </span><span class="Comment">//: Refinements:</span>
<span id="L21" class="LineNr"> 21 </span><span class="Comment">//:  * You can call a single continuation multiple times, and it will preserve</span>
<span id="L22" class="LineNr"> 22 </span><span class="Comment">//:    the state of its local variables at each stack frame between calls.</span>
<span id="L23" class="LineNr"> 23 </span><span class="Comment">//:    The stack frames of a continuation are not destroyed until the</span>
<span id="L24" class="LineNr"> 24 </span><span class="Comment">//:    continuation goes out of scope. See continuation2.mu.</span>
<span id="L25" class="LineNr"> 25 </span><span class="Comment">//:  * 'return-continuation-until-mark' doesn't consume the mark, so you can</span>
<span id="L26" class="LineNr"> 26 </span><span class="Comment">//:    return multiple continuations based on a single mark. In combination</span>
<span id="L27" class="LineNr"> 27 </span><span class="Comment">//:    with the fact that 'return-continuation-until-mark' can return from</span>
<span id="L28" class="LineNr"> 28 </span><span class="Comment">//:    regular calls, just as long as there was an earlier call to</span>
<span id="L29" class="LineNr"> 29 </span><span class="Comment">//:    'call-with-continuation-mark', this gives us a way to create resumable</span>
<span id="L30" class="LineNr"> 30 </span><span class="Comment">//:    recipes. See continuation3.mu.</span>
<span id="L31" class="LineNr"> 31 </span><span class="Comment">//:  * 'return-continuation-until-mark' can take ingredients to return just</span>
<span id="L32" class="LineNr"> 32 </span><span class="Comment">//:    like other 'return' instructions. It just implicitly also returns a</span>
<span id="L33" class="LineNr"> 33 </span><span class="Comment">//:    continuation as the first result. See continuation4.mu.</span>
<span id="L34" class="LineNr"> 34 </span><span class="Comment">//:  * Conversely, you can pass ingredients to a continuation when calling it,</span>
<span id="L35" class="LineNr"> 35 </span><span class="Comment">//:    to make it available to products of 'return-continuation-until-mark'.</span>
<span id="L36" class="LineNr"> 36 </span><span class="Comment">//:    See continuation5.mu.</span>
<span id="L37" class="LineNr"> 37 </span><span class="Comment">//:  * There can be multiple continuation marks on the stack at once;</span>
<span id="L38" class="LineNr"> 38 </span><span class="Comment">//:    'call-with-continuation-mark' and 'return-continuation-until-mark' both</span>
<span id="L39" class="LineNr"> 39 </span><span class="Comment">//:    need to pass in a tag to coordinate on the correct mark. This allows us</span>
<span id="L40" class="LineNr"> 40 </span><span class="Comment">//:    to save multiple continuations for different purposes (say if one is</span>
<span id="L41" class="LineNr"> 41 </span><span class="Comment">//:    for exceptions) with overlapping stack frames. See exception.mu.</span>
<span id="L42" class="LineNr"> 42 </span><span class="Comment">//:</span>
<span id="L43" class="LineNr"> 43 </span><span class="Comment">//: Inspired by James and Sabry, &quot;Yield: Mainstream delimited continuations&quot;,</span>
<span id="L44" class="LineNr"> 44 </span><span class="Comment">//: Workshop on the Theory and Practice of Delimited Continuations, 2011.</span>
<span id="L45" class="LineNr"> 45 </span><span class="Comment">//: <a href="https://www.cs.indiana.edu/~sabry/papers/yield.pdf">https://www.cs.indiana.edu/~sabry/papers/yield.pdf</a></span>
<span id="L46" class="LineNr"> 46 </span><span class="Comment">//:</span>
<span id="L47" class="LineNr"> 47 </span><span class="Comment">//: Caveats:</span>
<span id="L48" class="LineNr"> 48 </span><span class="Comment">//:  * At the moment we can't statically type-check continuations. So we raise</span>
<span id="L49" class="LineNr"> 49 </span><span class="Comment">//:    runtime errors for a call that doesn't return a continuation when the</span>
<span id="L50" class="LineNr"> 50 </span><span class="Comment">//:    caller expects, or one that returns a continuation when the caller</span>
<span id="L51" class="LineNr"> 51 </span><span class="Comment">//:    doesn't expect it. This shouldn't cause memory corruption, though.</span>
<span id="L52" class="LineNr"> 52 </span><span class="Comment">//:    There should still be no way to lookup addresses that aren't allocated.</span>
<span id="L53" class="LineNr"> 53 </span>
<span id="L54" class="LineNr"> 54 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
<span id="L55" class="LineNr"> 55 </span><a href='010vm.cc.html#L125'>type_ordinal</a> continuation = <span class="Special">Type_ordinal</span>[<span class="Constant">&quot;continuation&quot;</span>] = <span class="Special">Next_type_ordinal</span>++<span class="Delimiter">;</span>
<span id="L56" class="LineNr"> 56 </span><span class="Special">Type</span>[continuation]<span class="Delimiter">.</span>name = <span class="Constant">&quot;continuation&quot;</span><span class="Delimiter">;</span>
<span id="L57" class="LineNr"> 57 </span>
<span id="L58" class="LineNr"> 58 </span><span class="Comment">//: A continuation can be called like a recipe.</span>
<span id="L59" class="LineNr"> 59 </span><span class="Delimiter">:(before &quot;End <a href='072recipe.cc.html#L335'>is_mu_recipe</a> Atom Cases(r)&quot;)</span>
<span id="L60" class="LineNr"> 60 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;continuation&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span>
<span id="L61" class="LineNr"> 61 </span>
<span id="L62" class="LineNr"> 62 </span><span class="Comment">//: However, it can't be type-checked like most recipes. Pretend it's like a</span>
<span id="L63" class="LineNr"> 63 </span><span class="Comment">//: header-less recipe.</span>
<span id="L64" class="LineNr"> 64 </span><span class="Delimiter">:(after &quot;Begin Reagent-&gt;Recipe(r, recipe_header)&quot;)</span>
<span id="L65" class="LineNr"> 65 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; r<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;continuation&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L66" class="LineNr"> 66 </span>  result_header<span class="Delimiter">.</span>has_header =<span class="Constant"> false</span><span class="Delimiter">;</span>
<span id="L67" class="LineNr"> 67 </span>  <span class="Identifier">return</span> result_header<span class="Delimiter">;</span>
<span id="L68" class="LineNr"> 68 </span><span class="Delimiter">}</span>
<span id="L69" class="LineNr"> 69 </span>
<span id="L70" class="LineNr"> 70 </span><span class="Delimiter">:(scenario delimited_continuation)</span>
<span id="L71" class="LineNr"> 71 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L72" class="LineNr"> 72 </span>  <span class="Constant">1</span>:continuation<span class="Special"> &lt;- </span>call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> f<span class="Delimiter">,</span> <span class="Constant">77</span>  <span class="Comment"># 77 is an argument to f</span>
<span id="L73" class="LineNr"> 73 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">5</span>
<span id="L74" class="LineNr"> 74 </span>  <span class="Delimiter">{</span>
<span id="L75" class="LineNr"> 75 </span>    <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>call <span class="Constant">1</span>:continuation<span class="Delimiter">,</span> <span class="Constant">2</span>:num  <span class="Comment"># jump to 'return-continuation-until-mark' below</span>
<span id="L76" class="LineNr"> 76 </span>    <span class="Constant">3</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>greater-<span class="Normal">or</span>-equal <span class="Constant">2</span>:num<span class="Delimiter">,</span> <span class="Constant">8</span>
<span id="L77" class="LineNr"> 77 </span>    <span class="Identifier">break</span>-<span class="Normal">if</span> <span class="Constant">3</span>:<span class="Normal">bool</span>
<span id="L78" class="LineNr"> 78 </span>    loop
<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="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> f [
<span id="L82" class="LineNr"> 82 </span>  <span class="Constant">11</span>:num<span class="Special"> &lt;- </span>next-ingredient
<span id="L83" class="LineNr"> 83 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>g <span class="Constant">11</span>:num
<span id="L84" class="LineNr"> 84 </span>  <span class="Identifier">return</span> <span class="Constant">12</span>:num
<span id="L85" class="LineNr"> 85 </span>]
<span id="L86" class="LineNr"> 86 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> g [
<span id="L87" class="LineNr"> 87 </span>  <span class="Constant">21</span>:num<span class="Special"> &lt;- </span>next-ingredient
<span id="L88" class="LineNr"> 88 </span>  <span class="Constant">22</span>:num<span class="Special"> &lt;- </span><span class="Identifier">return</span>-continuation-until-mark <span class="Constant">233</span>/mark
<span id="L89" class="LineNr"> 89 </span>  <span class="Constant">23</span>:num<span class="Special"> &lt;- </span>add <span class="Constant">22</span>:num<span class="Delimiter">,</span> <span class="Constant">1</span>
<span id="L90" class="LineNr"> 90 </span>  <span class="Identifier">return</span> <span class="Constant">23</span>:num
<span id="L91" class="LineNr"> 91 </span>]
<span id="L92" class="LineNr"> 92 </span><span class="Comment"># first call of 'g' executes the part before return-continuation-until-mark</span>
<span id="L93" class="LineNr"> 93 </span><span class="traceContains">+mem: storing 77 in location 21</span>
<span id="L94" class="LineNr"> 94 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- copy {5: &quot;literal&quot;}</span>
<span id="L95" class="LineNr"> 95 </span><span class="traceContains">+mem: storing 5 in location 2</span>
<span id="L96" class="LineNr"> 96 </span><span class="Comment"># calls of the continuation execute the part after return-continuation-until-mark</span>
<span id="L97" class="LineNr"> 97 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- call {1: &quot;continuation&quot;}, {2: &quot;number&quot;}</span>
<span id="L98" class="LineNr"> 98 </span><span class="traceContains">+mem: storing 5 in location 22</span>
<span id="L99" class="LineNr"> 99 </span><span class="traceContains">+mem: storing 6 in location 2</span>
<span id="L100" class="LineNr">100 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- call {1: &quot;continuation&quot;}, {2: &quot;number&quot;}</span>
<span id="L101" class="LineNr">101 </span><span class="traceContains">+mem: storing 6 in location 22</span>
<span id="L102" class="LineNr">102 </span><span class="traceContains">+mem: storing 7 in location 2</span>
<span id="L103" class="LineNr">103 </span><span class="traceContains">+run: {2: &quot;number&quot;} &lt;- call {1: &quot;continuation&quot;}, {2: &quot;number&quot;}</span>
<span id="L104" class="LineNr">104 </span><span class="traceContains">+mem: storing 7 in location 22</span>
<span id="L105" class="LineNr">105 </span><span class="traceContains">+mem: storing 8 in location 2</span>
<span id="L106" class="LineNr">106 </span><span class="Comment"># first call of 'g' does not execute the part after return-continuation-until-mark</span>
<span id="L107" class="LineNr">107 </span><span class="traceAbsent">-mem: storing 77 in location 22</span>
<span id="L108" class="LineNr">108 </span><span class="Comment"># calls of the continuation don't execute the part before return-continuation-until-mark</span>
<span id="L109" class="LineNr">109 </span><span class="traceAbsent">-mem: storing 5 in location 21</span>
<span id="L110" class="LineNr">110 </span><span class="traceAbsent">-mem: storing 6 in location 21</span>
<span id="L111" class="LineNr">111 </span><span class="traceAbsent">-mem: storing 7 in location 21</span>
<span id="L112" class="LineNr">112 </span><span class="Comment"># termination</span>
<span id="L113" class="LineNr">113 </span><span class="traceAbsent">-mem: storing 9 in location 2</span>
<span id="L114" class="LineNr">114 </span>
<span id="L115" class="LineNr">115 </span><span class="Delimiter">:(before &quot;End call Fields&quot;)</span>
<span id="L116" class="LineNr">116 </span><span class="Normal">int</span> continuation_mark_tag<span class="Delimiter">;</span>
<span id="L117" class="LineNr">117 </span><span class="Delimiter">:(before &quot;End call Constructor&quot;)</span>
<span id="L118" class="LineNr">118 </span>continuation_mark_tag = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L119" class="LineNr">119 </span>
<span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L121" class="LineNr">121 </span>CALL_WITH_CONTINUATION_MARK<span class="Delimiter">,</span>
<span id="L122" class="LineNr">122 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L123" class="LineNr">123 </span><span class="Special">Recipe_ordinal</span>[<span class="Constant">&quot;call-with-continuation-mark&quot;</span>] = CALL_WITH_CONTINUATION_MARK<span class="Delimiter">;</span>
<span id="L124" class="LineNr">124 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L125" class="LineNr">125 </span><span class="Normal">case</span> CALL_WITH_CONTINUATION_MARK: <span class="Delimiter">{</span>
<span id="L126" class="LineNr">126 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><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>
<span id="L127" class="LineNr">127 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' requires at least two ingredients: a mark number and a <a href='010vm.cc.html#L19'>recipe</a> to call\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L128" class="LineNr">128 </span>  <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><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L132" class="LineNr">132 </span><span class="Normal">case</span> CALL_WITH_CONTINUATION_MARK: <span class="Delimiter">{</span>
<span id="L133" class="LineNr">133 </span>  <span class="Comment">// like call, but mark the current call as a 'base of continuation' call</span>
<span id="L134" class="LineNr">134 </span>  <span class="Comment">// before pushing the next one on it</span>
<span id="L135" class="LineNr">135 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Trace_stream</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L136" class="LineNr">136 </span>    ++<span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
<span id="L137" class="LineNr">137 </span>    <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;delimited continuation; incrementing callstack depth to &quot;</span> &lt;&lt; <span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L138" class="LineNr">138 </span>    assert<span class="Delimiter">(</span><span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
<span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
<span id="L140" class="LineNr">140 </span>  <a href='010vm.cc.html#L33'>instruction</a><span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> caller_instruction = <a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">();</span>
<span id="L141" class="LineNr">141 </span>  <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>continuation_mark_tag = <a href='026call.cc.html#L89'>current_instruction</a><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 id="L142" class="LineNr">142 </span>  <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>call<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)));</span>
<span id="L143" class="LineNr">143 </span>  <span class="Comment">// drop the mark</span>
<span id="L144" class="LineNr">144 </span>  caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>
<span id="L145" class="LineNr">145 </span>  ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>
<span id="L146" class="LineNr">146 </span>  <span class="Comment">// drop the callee</span>
<span id="L147" class="LineNr">147 </span>  caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>
<span id="L148" class="LineNr">148 </span>  ingredients<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">());</span>
<span id="L149" class="LineNr">149 </span>  finish_call_housekeeping<span class="Delimiter">(</span>caller_instruction<span class="Delimiter">,</span> ingredients<span class="Delimiter">);</span>
<span id="L150" class="LineNr">150 </span>  <span class="Identifier">continue</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 next_ingredient_inside_continuation)</span>
<span id="L154" class="LineNr">154 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L155" class="LineNr">155 </span>  call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> f<span class="Delimiter">,</span><span class="Constant"> true</span>
<span id="L156" class="LineNr">156 </span>]
<span id="L157" class="LineNr">157 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> f [
<span id="L158" class="LineNr">158 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-input
<span id="L159" class="LineNr">159 </span>]
<span id="L160" class="LineNr">160 </span><span class="traceContains">+mem: storing 1 in location 10</span>
<span id="L161" class="LineNr">161 </span>
<span id="L162" class="LineNr">162 </span><span class="Delimiter">:(scenario delimited_continuation_out_of_recipe_variable)</span>
<span id="L163" class="LineNr">163 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L164" class="LineNr">164 </span>  <span class="Normal">x</span>:<a href='010vm.cc.html#L19'>recipe</a><span class="Special"> &lt;- </span>copy f
<span id="L165" class="LineNr">165 </span>  call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> x<span class="Delimiter">,</span><span class="Constant"> true</span>
<span id="L166" class="LineNr">166 </span>]
<span id="L167" class="LineNr">167 </span><span class="muRecipe"><a href='010vm.cc.html#L19'>recipe</a></span> f [
<span id="L168" class="LineNr">168 </span>  <span class="Constant">10</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>next-input
<span id="L169" class="LineNr">169 </span>]
<span id="L170" class="LineNr">170 </span><span class="traceContains">+mem: storing 1 in location 10</span>
<span id="L171" class="LineNr">171 </span>
<span id="L172" class="LineNr">172 </span><span class="Comment">//: save the slice of current call stack until the 'call-with-continuation-mark'</span>
<span id="L173" class="LineNr">173 </span><span class="Comment">//: call, and return it as the result.</span>
<span id="L174" class="LineNr">174 </span><span class="Comment">//: todo: implement delimited continuations in Mu's memory</span>
<span id="L175" class="LineNr">175 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
<span id="L176" class="LineNr">176 </span><span class="Normal">struct</span> delimited_continuation <span class="Delimiter">{</span>
<span id="L177" class="LineNr">177 </span>  call_stack frames<span class="Delimiter">;</span>
<span id="L178" class="LineNr">178 </span>  <span class="Normal">int</span> nrefs<span class="Delimiter">;</span>
<span id="L179" class="LineNr">179 </span>  delimited_continuation<span class="Delimiter">(</span>call_stack::iterator begin<span class="Delimiter">,</span> call_stack::iterator <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">)</span> :frames<span class="Delimiter">(</span>call_stack<span class="Delimiter">(</span>begin<span class="Delimiter">,</span> <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">)),</span> nrefs<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</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="Delimiter">:(before &quot;End Globals&quot;)</span>
<span id="L182" class="LineNr">182 </span>map&lt;<span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span><span class="Delimiter">,</span> delimited_continuation&gt; <span class="Special">Delimited_continuation</span><span class="Delimiter">;</span>
<span id="L183" class="LineNr">183 </span><span class="Normal">long</span> <span class="Normal">long</span> <span class="Normal">int</span> <span class="Special">Next_delimited_continuation_id</span> = <span class="Constant">1</span><span class="Delimiter">;</span>  <span class="Comment">// 0 is null just like an address</span>
<span id="L184" class="LineNr">184 </span><span class="Delimiter">:(before &quot;End Reset&quot;)</span>
<span id="L185" class="LineNr">185 </span><span class="Special">Delimited_continuation</span><span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L186" class="LineNr">186 </span><span class="Special">Next_delimited_continuation_id</span> = <span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L187" class="LineNr">187 </span>
<span id="L188" class="LineNr">188 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L189" class="LineNr">189 </span>RETURN_CONTINUATION_UNTIL_MARK<span class="Delimiter">,</span>
<span id="L190" class="LineNr">190 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L191" class="LineNr">191 </span><span class="Special">Recipe_ordinal</span>[<span class="Constant">&quot;return-continuation-until-mark&quot;</span>] = RETURN_CONTINUATION_UNTIL_MARK<span class="Delimiter">;</span>
<span id="L192" class="LineNr">192 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L193" class="LineNr">193 </span><span class="Normal">case</span> RETURN_CONTINUATION_UNTIL_MARK: <span class="Delimiter">{</span>
<span id="L194" class="LineNr">194 </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="L195" class="LineNr">195 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;' requires at least one ingredient: a mark tag (number)\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L196" class="LineNr">196 </span>  <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 &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L200" class="LineNr">200 </span><span class="Normal">case</span> RETURN_CONTINUATION_UNTIL_MARK: <span class="Delimiter">{</span>
<span id="L201" class="LineNr">201 </span>  <span class="Comment">// I don't know how to think about next-ingredient in combination with</span>
<span id="L202" class="LineNr">202 </span>  <span class="Comment">// continuations, so seems cleaner to just kill it. Functions have to read</span>
<span id="L203" class="LineNr">203 </span>  <span class="Comment">// their inputs before ever returning a continuation.</span>
<span id="L204" class="LineNr">204 </span>  <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>ingredient_atoms<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span>
<span id="L205" class="LineNr">205 </span>  <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>next_ingredient_to_process = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L206" class="LineNr">206 </span>  <span class="Comment">// copy the current call stack until the most recent marked call</span>
<span id="L207" class="LineNr">207 </span>  call_stack::iterator find_base_of_continuation<span class="Delimiter">(</span>call_stack&amp;<span class="Delimiter">,</span> <span class="Normal">int</span><span class="Delimiter">);</span>  <span class="Comment">// manual prototype containing '::'</span>
<span id="L208" class="LineNr">208 </span>  call_stack::iterator base = find_base_of_continuation<span class="Delimiter">(</span><span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">mark tag</span><span class="Comment">*/</span><a href='026call.cc.html#L89'>current_instruction</a><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 id="L209" class="LineNr">209 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base == <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L210" class="LineNr">210 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;couldn't find a 'call-with-continuation-mark' to return to with tag &quot;</span> &lt;&lt; current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L211" class="LineNr">211 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;call stack:\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L212" class="LineNr">212 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span>call_stack::iterator p = <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span>
<span id="L213" class="LineNr">213 </span>      <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;  &quot;</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> p<span class="Delimiter">-&gt;</span>running_recipe<span class="Delimiter">).</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L214" class="LineNr">214 </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>  <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;creating continuation &quot;</span> &lt;&lt; <span class="Special">Next_delimited_continuation_id</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L217" class="LineNr">217 </span>  <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span><span class="Special">Delimited_continuation</span><span class="Delimiter">,</span> <span class="Special">Next_delimited_continuation_id</span><span class="Delimiter">,</span> delimited_continuation<span class="Delimiter">(</span><span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> base<span class="Delimiter">));</span>
<span id="L218" class="LineNr">218 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> != base<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L219" class="LineNr">219 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Trace_stream</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L220" class="LineNr">220 </span>      --<span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth<span class="Delimiter">;</span>
<span id="L221" class="LineNr">221 </span>      assert<span class="Delimiter">(</span><span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L222" class="LineNr">222 </span>    <span class="Delimiter">}</span>
<span id="L223" class="LineNr">223 </span>    <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>pop_front<span class="Delimiter">();</span>
<span id="L224" class="LineNr">224 </span>  <span class="Delimiter">}</span>
<span id="L225" class="LineNr">225 </span>  <span class="Comment">// return it as the result of the marked call</span>
<span id="L226" class="LineNr">226 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L227" class="LineNr">227 </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="Special">Next_delimited_continuation_id</span><span class="Delimiter">);</span>
<span id="L228" class="LineNr">228 </span>  <span class="Comment">// return any other ingredients passed in</span>
<span id="L229" class="LineNr">229 </span>  copy<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip mark tag</span><span class="Comment">*/</span>++ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">(),</span> inserter<span class="Delimiter">(</span>products<span class="Delimiter">,</span> products<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">()));</span>
<span id="L230" class="LineNr">230 </span>  ++<span class="Special">Next_delimited_continuation_id</span><span class="Delimiter">;</span>
<span id="L231" class="LineNr">231 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// continue to process rest of marked call</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">:(code)</span>
<span id="L235" class="LineNr">235 </span>call_stack::iterator find_base_of_continuation<span class="Delimiter">(</span>call_stack&amp; c<span class="Delimiter">,</span> <span class="Normal">int</span> mark_tag<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L236" class="LineNr">236 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>call_stack::iterator p = c<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != c<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L237" class="LineNr">237 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>continuation_mark_tag == mark_tag<span class="Delimiter">)</span> <span class="Identifier">return</span> p<span class="Delimiter">;</span>
<span id="L238" class="LineNr">238 </span>  <span class="Identifier">return</span> c<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L239" class="LineNr">239 </span><span class="Delimiter">}</span>
<span id="L240" class="LineNr">240 </span>
<span id="L241" class="LineNr">241 </span><span class="Comment">//: overload 'call' for continuations</span>
<span id="L242" class="LineNr">242 </span><span class="Delimiter">:(after &quot;Begin Call&quot;)</span>
<span id="L243" class="LineNr">243 </span><span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_continuation<span class="Delimiter">(</span><a href='026call.cc.html#L89'>current_instruction</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 class="Delimiter">{</span>
<span id="L244" class="LineNr">244 </span>  <span class="Comment">// copy multiple calls on to current call stack</span>
<span id="L245" class="LineNr">245 </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="L246" class="LineNr">246 </span>  <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;calling continuation &quot;</span> &lt;&lt; ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>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><span class="Special">Delimited_continuation</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="L248" class="LineNr">248 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span><a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;no such delimited continuation &quot;</span> &lt;&lt; <a href='026call.cc.html#L89'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L249" class="LineNr">249 </span>  <span class="Normal">const</span> call_stack&amp; new_frames = get<span class="Delimiter">(</span><span class="Special">Delimited_continuation</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>frames<span class="Delimiter">;</span>
<span id="L250" class="LineNr">250 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>call_stack::const_reverse_iterator p = new_frames<span class="Delimiter">.</span>rbegin<span class="Delimiter">();</span> p != new_frames<span class="Delimiter">.</span>rend<span class="Delimiter">();</span> ++p<span class="Delimiter">)</span>
<span id="L251" class="LineNr">251 </span>    <span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>push_front<span class="Delimiter">(</span>*p<span class="Delimiter">);</span>
<span id="L252" class="LineNr">252 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Trace_stream</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L253" class="LineNr">253 </span>    <span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth += <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_frames<span class="Delimiter">);</span>
<span id="L254" class="LineNr">254 </span>    <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">&quot;trace&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;calling delimited continuation; growing callstack depth to &quot;</span> &lt;&lt; <span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span>
<span id="L255" class="LineNr">255 </span>    assert<span class="Delimiter">(</span><span class="Special">Trace_stream</span><span class="Delimiter">-&gt;</span>callstack_depth &lt; <span class="Constant">9000</span><span class="Delimiter">);</span>  <span class="Comment">// 9998-101 plus cushion</span>
<span id="L256" class="LineNr">256 </span>  <span class="Delimiter">}</span>
<span id="L257" class="LineNr">257 </span>  <span class="Comment">// no call housekeeping; continuations don't support next-ingredient</span>
<span id="L258" class="LineNr">258 </span>  copy<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">drop continuation</span><span class="Comment">*/</span>++ingredients<span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> ingredients<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>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="L259" class="LineNr">259 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// record results of resuming 'return-continuation-until-mark' instruction</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><span class="Delimiter">:(scenario continuations_can_return_values)</span>
<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>  <span class="Normal">k</span>:continuation<span class="Delimiter">,</span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> f
<span id="L266" class="LineNr">266 </span>]
<span id="L267" class="LineNr">267 </span><span class="muRecipe">def</span> f [
<span id="L268" class="LineNr">268 </span>  local-scope
<span id="L269" class="LineNr">269 </span>  g
<span id="L270" class="LineNr">270 </span>]
<span id="L271" class="LineNr">271 </span><span class="muRecipe">def</span> g [
<span id="L272" class="LineNr">272 </span>  local-scope
<span id="L273" class="LineNr">273 </span>  <span class="Identifier">return</span>-continuation-until-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L274" class="LineNr">274 </span>  stash [continuation called]
<span id="L275" class="LineNr">275 </span>]
<span id="L276" class="LineNr">276 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L277" class="LineNr">277 </span>
<span id="L278" class="LineNr">278 </span><span class="Delimiter">:(scenario continuations_continue_to_matching_mark)</span>
<span id="L279" class="LineNr">279 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L280" class="LineNr">280 </span>  local-scope
<span id="L281" class="LineNr">281 </span>  <span class="Normal">k</span>:continuation<span class="Delimiter">,</span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> f
<span id="L282" class="LineNr">282 </span>  add <span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">1</span>
<span id="L283" class="LineNr">283 </span>]
<span id="L284" class="LineNr">284 </span><span class="muRecipe">def</span> f [
<span id="L285" class="LineNr">285 </span>  local-scope
<span id="L286" class="LineNr">286 </span>  <span class="Normal">k2</span>:continuation<span class="Special"> &lt;- </span>call-with-continuation-mark <span class="Constant">234</span>/mark<span class="Delimiter">,</span> g
<span id="L287" class="LineNr">287 </span>  add <span class="Constant">2</span><span class="Delimiter">,</span> <span class="Constant">2</span>
<span id="L288" class="LineNr">288 </span>]
<span id="L289" class="LineNr">289 </span><span class="muRecipe">def</span> g [
<span id="L290" class="LineNr">290 </span>  local-scope
<span id="L291" class="LineNr">291 </span>  <span class="Identifier">return</span>-continuation-until-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L292" class="LineNr">292 </span>  stash [continuation called]
<span id="L293" class="LineNr">293 </span>]
<span id="L294" class="LineNr">294 </span><span class="traceContains">+run: add {1: &quot;literal&quot;}, {1: &quot;literal&quot;}</span>
<span id="L295" class="LineNr">295 </span><span class="traceAbsent">-run: add {2: &quot;literal&quot;}, {2: &quot;literal&quot;}</span>
<span id="L296" class="LineNr">296 </span>
<span id="L297" class="LineNr">297 </span><span class="Comment">//: Allow shape-shifting recipes to return continuations.</span>
<span id="L298" class="LineNr">298 </span>
<span id="L299" class="LineNr">299 </span><span class="Delimiter">:(scenario call_shape_shifting_recipe_with_continuation_mark)</span>
<span id="L300" class="LineNr">300 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L301" class="LineNr">301 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> f<span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L302" class="LineNr">302 </span>]
<span id="L303" class="LineNr">303 </span><span class="muRecipe">def</span> f x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [
<span id="L304" class="LineNr">304 </span>  local-scope
<span id="L305" class="LineNr">305 </span>  load-ingredients
<span id="L306" class="LineNr">306 </span>  y<span class="Special"> &lt;- </span>copy x
<span id="L307" class="LineNr">307 </span>]
<span id="L308" class="LineNr">308 </span><span class="traceContains">+mem: storing 34 in location 1</span>
<span id="L309" class="LineNr">309 </span>
<span id="L310" class="LineNr">310 </span><span class="Delimiter">:(before &quot;End resolve_ambiguous_call(r, index, inst, caller_recipe) Special-cases&quot;)</span>
<span id="L311" class="LineNr">311 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;call-with-continuation-mark&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L312" class="LineNr">312 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> &gt; <span class="Constant">1</span> &amp;&amp; <a href='072recipe.cc.html#L208'>is_recipe_literal</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip mark</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L313" class="LineNr">313 </span>  resolve_indirect_continuation_call<span class="Delimiter">(</span>r<span class="Delimiter">,</span> index<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
<span id="L314" class="LineNr">314 </span>  <span class="Identifier">return</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="Delimiter">}</span>
<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(code)</span>
<span id="L318" class="LineNr">318 </span><span class="Normal">void</span> resolve_indirect_continuation_call<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> index<span class="Delimiter">,</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L319" class="LineNr">319 </span>  <a href='010vm.cc.html#L33'>instruction</a> inst2<span class="Delimiter">;</span>
<span id="L320" class="LineNr">320 </span>  inst2<span class="Delimiter">.</span>name = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip mark</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">;</span>
<span id="L321" class="LineNr">321 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip mark and <a href='010vm.cc.html#L19'>recipe</a></span><span class="Comment">*/</span><span class="Constant">2</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
<span id="L322" class="LineNr">322 </span>    inst2<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>i<span class="Delimiter">));</span>
<span id="L323" class="LineNr">323 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Comment">/*</span><span class="Comment">skip continuation</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
<span id="L324" class="LineNr">324 </span>    inst2<span class="Delimiter">.</span>products<span class="Delimiter">.</span>push_back<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="L325" class="LineNr">325 </span>  <a href='054static_dispatch.cc.html#L173'>resolve_ambiguous_call</a><span class="Delimiter">(</span>r<span class="Delimiter">,</span> index<span class="Delimiter">,</span> inst2<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">);</span>
<span id="L326" class="LineNr">326 </span>  inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip mark</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">).</span>name = inst2<span class="Delimiter">.</span>name<span class="Delimiter">;</span>
<span id="L327" class="LineNr">327 </span>  inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">skip mark</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">).</span><a href='010vm.cc.html#L67'>set_value</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special">Recipe_ordinal</span><span class="Delimiter">,</span> inst2<span class="Delimiter">.</span>name<span class="Delimiter">));</span>
<span id="L328" class="LineNr">328 </span><span class="Delimiter">}</span>
<span id="L329" class="LineNr">329 </span>
<span id="L330" class="LineNr">330 </span><span class="Delimiter">:(scenario call_shape_shifting_recipe_with_continuation_mark_and_no_outputs)</span>
<span id="L331" class="LineNr">331 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L332" class="LineNr">332 </span>  <span class="Constant">1</span>:continuation<span class="Special"> &lt;- </span>call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> f<span class="Delimiter">,</span> <span class="Constant">34</span>
<span id="L333" class="LineNr">333 </span>]
<span id="L334" class="LineNr">334 </span><span class="muRecipe">def</span> f x:_elem [
<span id="L335" class="LineNr">335 </span>  local-scope
<span id="L336" class="LineNr">336 </span>  load-ingredients
<span id="L337" class="LineNr">337 </span>  <span class="Identifier">return</span>-continuation-until-mark <span class="Constant">233</span>/mark
<span id="L338" class="LineNr">338 </span>]
<span id="L339" class="LineNr">339 </span>$error: <span class="Constant">0</span>
<span id="L340" class="LineNr">340 </span>
<span id="L341" class="LineNr">341 </span><span class="Delimiter">:(scenario continuation1)</span>
<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="Normal">k</span>:continuation<span class="Special"> &lt;- </span>call-with-continuation-mark <span class="Constant">233</span>/mark<span class="Delimiter">,</span> create-yielder
<span id="L345" class="LineNr">345 </span>  <span class="Constant">10</span>:num/<span class="Special">raw &lt;- </span>call k
<span id="L346" class="LineNr">346 </span>]
<span id="L347" class="LineNr">347 </span><span class="muRecipe">def</span> create-yielder<span class="muRecipe"> -&gt; </span>n:num [
<span id="L348" class="LineNr">348 </span>  local-scope
<span id="L349" class="LineNr">349 </span>  load-inputs
<span id="L350" class="LineNr">350 </span>  <span class="Identifier">return</span>-continuation-until-mark <span class="Constant">233</span>/mark
<span id="L351" class="LineNr">351 </span>  <span class="Identifier">return</span> <span class="Constant">1</span>
<span id="L352" class="LineNr">352 </span>]
<span id="L353" class="LineNr">353 </span><span class="traceContains">+mem: storing 1 in location 10</span>
<span id="L354" class="LineNr">354 </span>$error: <span class="Constant">0</span>
<span id="L355" class="LineNr">355 </span>
<span id="L356" class="LineNr">356 </span><span class="Delimiter">:(code)</span>
<span id="L357" class="LineNr">357 </span><span class="Normal">bool</span> is_mu_continuation<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="L358" class="LineNr">358 </span>  canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">);</span>
<span id="L359" class="LineNr">359 </span>  <span class="Identifier">return</span> x<span class="Delimiter">.</span>type &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>atom &amp;&amp; x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == get<span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> <span class="Constant">&quot;continuation&quot;</span><span class="Delimiter">);</span>
<span id="L360" class="LineNr">360 </span><span class="Delimiter">}</span>
<span id="L361" class="LineNr">361 </span>
<span id="L362" class="LineNr">362 </span><span class="Comment">// helper for debugging</span>
<span id="L363" class="LineNr">363 </span><span class="Normal">void</span> dump<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">int</span> continuation_id<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L364" class="LineNr">364 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special">Delimited_continuation</span><span class="Delimiter">,</span> continuation_id<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L365" class="LineNr">365 </span>    <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot;missing delimited continuation: &quot;</span> &lt;&lt; continuation_id &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><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>  delimited_continuation&amp; curr = get<span class="Delimiter">(</span><span class="Special">Delimited_continuation</span><span class="Delimiter">,</span> continuation_id<span class="Delimiter">);</span>
<span id="L369" class="LineNr">369 </span>  dump<span class="Delimiter">(</span>curr<span class="Delimiter">.</span>frames<span class="Delimiter">);</span>
<span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->