about summary refs log tree commit diff stats
path: root/src/main.nim
blob: b28d6f247c5c0212e78cfa7b1005aea14c9dfb15 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
import version

# Note: we can't just import std/os or the compiler cries. (No idea why.)
from std/os import getEnv, putEnv, commandLineParams, getCurrentDir, createDir
import std/options

import server/forkserver
import config/chapath
import config/config
import js/javascript
import local/client
import local/term
import utils/strwidth
import utils/twtstr

import chagashi/charset

const ChaVersionStr = block:
  var s = "Chawan browser v0.1 "
  when defined(debug):
    s &= "(debug)"
  else:
    s &= "(release)"
  s &= '\n'
  s

proc help(i: int) =
  let s = ChaVersionStr & """
Usage: cha [options] [URL(s) or file(s)...]
Options:
    --                          Interpret all following arguments as URLs
    -c, --css <stylesheet>      Pass stylesheet (e.g. -c 'a{color: blue}')
    -d, --dump                  Print page to stdout
    -h, --help                  Print this usage message
    -o, --opt <config>          Pass config options (e.g. -o 'page.q="quit()"')
    -r, --run <script/file>     Run passed script or file
    -v, --version               Print version information
    -C, --config <file>         Override config path
    -I, --input-charset <enc>   Specify document charset
    -M, --monochrome            Set color-mode to 'monochrome'
    -O, --display-charset <enc> Specify display charset
    -T, --type <type>           Specify content mime type
    -V, --visual                Visual startup mode
"""
  if i == 0:
    stdout.write(s)
  else:
    stderr.write(s)
  quit(i)

proc version() =
  stdout.write(ChaVersionStr)
  quit(0)

type ParamParseContext = object
  params: seq[string]
  i: int
  configPath: Option[string]
  contentType: Option[string]
  charset: Charset
  dump: bool
  visual: bool
  opts: seq[string]
  stylesheet: string
  pages: seq[string]

proc getnext(ctx: var ParamParseContext): string =
  inc ctx.i
  if ctx.i < ctx.params.len:
    return ctx.params[ctx.i]
  help(1)

proc parseConfig(ctx: var ParamParseContext) =
  ctx.configPath = some(ctx.getnext())

proc parseMonochrome(ctx: var ParamParseContext) =
  ctx.opts.add("display.color-mode = monochrome")

proc parseVisual(ctx: var ParamParseContext) =
  ctx.visual = true

proc parseContentType(ctx: var ParamParseContext) =
  ctx.contentType = some(ctx.getnext())

proc getCharset(ctx: var ParamParseContext): Charset =
  let s = ctx.getnext()
  let charset = getCharset(s)
  if charset == CHARSET_UNKNOWN:
    stderr.write("Unknown charset " & s & "\n")
    quit(1)
  return charset

proc parseInputCharset(ctx: var ParamParseContext) =
  ctx.charset = ctx.getCharset()

proc parseOutputCharset(ctx: var ParamParseContext) =
  ctx.opts.add("encoding.display-charset = '" & $ctx.getCharset() & "'")

proc parseDump(ctx: var ParamParseContext) =
  ctx.dump = true

proc parseCSS(ctx: var ParamParseContext) =
  ctx.stylesheet &= ctx.getnext()

proc parseOpt(ctx: var ParamParseContext) =
  ctx.opts.add(ctx.getnext())

proc parseRun(ctx: var ParamParseContext) =
  let script = dqEscape(ctx.getnext())
  ctx.opts.add("start.startup-script = \"\"\"" & script & "\"\"\"")
  ctx.opts.add("start.headless = true")
  ctx.dump = true

proc parse(ctx: var ParamParseContext) =
  var escapeAll = false
  while ctx.i < ctx.params.len:
    let param = ctx.params[ctx.i]
    if escapeAll: # after --
      ctx.pages.add(param)
      inc ctx.i
      continue
    if param.len == 0:
      inc ctx.i
      continue
    if param[0] == '-':
      if param.len == 1:
        # If param == "-", i.e. it is a single dash, then ignore it.
        # (Some programs use single-dash to read from stdin, but we do that
        # automatically when stdin is not a tty. So ignoring it entirely
        # is probably for the best.)
        inc ctx.i
        continue
      if param[1] != '-':
        for j in 1 ..< param.len:
          const NeedsNextParam = {'C', 'I', 'O', 'T', 'c', 'o', 'r'}
          if j != param.high and param[j] in NeedsNextParam:
            # expecting next parameter, but not the last char...
            help(1)
          case param[j]
          of 'C': ctx.parseConfig()
          of 'I': ctx.parseInputCharset()
          of 'M': ctx.parseMonochrome()
          of 'O': ctx.parseOutputCharset()
          of 'T': ctx.parseContentType()
          of 'V': ctx.parseVisual()
          of 'c': ctx.parseCSS()
          of 'd': ctx.parseDump()
          of 'h': help(0)
          of 'o': ctx.parseOpt()
          of 'r': ctx.parseRun()
          of 'v': version()
          else: help(1)
      else:
        case param
        of "--config": ctx.parseConfig()
        of "--input-charset": ctx.parseInputCharset()
        of "--monochrome": ctx.parseMonochrome()
        of "--output-charset": ctx.parseOutputCharset()
        of "--type": ctx.parseContentType()
        of "--visual": ctx.parseVisual()
        of "--css": ctx.parseCSS()
        of "--dump": ctx.parseDump()
        of "--help": help(0)
        of "--opt": ctx.parseOpt()
        of "--run": ctx.parseRun()
        of "--version": version()
        of "--": escapeAll = true
        else: help(1)
    else:
      ctx.pages.add(param)
    inc ctx.i

proc main() =
  putEnv("CHA_LIBEXEC_DIR", ChaPath"${%CHA_LIBEXEC_DIR}".unquoteGet())
  let forkserver = newForkServer()
  var ctx = ParamParseContext(params: commandLineParams(), i: 0)
  ctx.parse()
  let jsrt = newJSRuntime()
  let jsctx = jsrt.newJSContext()
  var warnings = newSeq[string]()
  let (config, res) = readConfig(ctx.configPath, jsctx)
  if not res.success:
    stderr.write(res.errorMsg)
    quit(1)
  warnings.add(res.warnings)
  for opt in ctx.opts:
    let res = config.parseConfig(getCurrentDir(), opt, laxnames = true)
    if not res.success:
      stderr.write(res.errorMsg)
      quit(1)
    warnings.add(res.warnings)
  config.css.stylesheet &= ctx.stylesheet
  block commands:
    let res = config.initCommands()
    if res.isNone:
      stderr.write("Error parsing commands: " & res.error)
      quit(1)
  set_cjk_ambiguous(config.display.double_width_ambiguous)
  if ctx.pages.len == 0 and stdin.isatty():
    if ctx.visual:
      ctx.pages.add(config.start.visual_home)
    elif (let httpHome = getEnv("HTTP_HOME"); httpHome != ""):
      ctx.pages.add(httpHome)
    elif (let wwwHome = getEnv("WWW_HOME"); wwwHome != ""):
      ctx.pages.add(wwwHome)
  if ctx.pages.len == 0 and not config.start.headless:
    if stdin.isatty():
      help(1)
  # make sure tmpdir actually exists; if we do this later, then forkserver may
  # try to open an empty dir
  createDir(config.external.tmpdir)
  forkserver.loadForkServerConfig(config)
  let client = newClient(config, forkserver, jsctx, warnings)
  try:
    client.launchClient(ctx.pages, ctx.contentType, ctx.charset, ctx.dump)
  except CatchableError:
    client.flushConsole()
    raise

main()
ElementById(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/056shape_shifting_recipe.cc'>https://github.com/akkartik/mu/blob/master/056shape_shifting_recipe.cc</a> <pre id='vimCodeElement'> <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> <a href='000organization.cc.html#L113'>main</a> [ <span id="L5" class="LineNr"> 5 </span> <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span> <span id="L6" class="LineNr"> 6 </span> <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span><span class="Comment"># non-matching variant</span> <span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> foo a:num<span class="muRecipe"> -&gt; </span>result:num [ <span id="L10" class="LineNr"> 10 </span> local-scope <span id="L11" class="LineNr"> 11 </span> load-ingredients <span id="L12" class="LineNr"> 12 </span> result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L13" class="LineNr"> 13 </span>] <span id="L14" class="LineNr"> 14 </span><span class="Comment"># matching shape-shifting variant</span> <span id="L15" class="LineNr"> 15 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [ <span id="L16" class="LineNr"> 16 </span> local-scope <span id="L17" class="LineNr"> 17 </span> load-ingredients <span id="L18" class="LineNr"> 18 </span> result<span class="Special"> &lt;- </span>copy a <span id="L19" class="LineNr"> 19 </span>] <span id="L20" class="LineNr"> 20 </span><span class="traceContains">+mem: storing 14 in location 12</span> <span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 15 in location 13</span> <span id="L22" class="LineNr"> 22 </span> <span id="L23" class="LineNr"> 23 </span><span class="Comment">//: Before anything else, disable transforms for shape-shifting recipes and</span> <span id="L24" class="LineNr"> 24 </span><span class="Comment">//: make sure we never try to actually run a shape-shifting recipe. We should</span> <span id="L25" class="LineNr"> 25 </span><span class="Comment">//: be rewriting such instructions to *specializations* with the type</span> <span id="L26" class="LineNr"> 26 </span><span class="Comment">//: ingredients filled in.</span> <span id="L27" class="LineNr"> 27 </span> <span id="L28" class="LineNr"> 28 </span><span class="Comment">//: One exception (and this makes things very ugly): we need to expand type</span> <span id="L29" class="LineNr"> 29 </span><span class="Comment">//: abbreviations in shape-shifting recipes because we need them types for</span> <span id="L30" class="LineNr"> 30 </span><span class="Comment">//: deciding which variant to specialize.</span> <span id="L31" class="LineNr"> 31 </span> <span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End Transform Checks&quot;)</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><span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>t<span class="Delimiter">)</span> != <span class="Normal">static_cast</span>&lt;transform_fn&gt;<span class="Delimiter">(</span>expand_type_abbreviations<span class="Delimiter">)</span> &amp;&amp; <a href='056shape_shifting_recipe.cc.html#L156'>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">-&gt;</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 &quot;Running One Instruction&quot;)</span> <span id="L37" class="LineNr"> 37 </span><span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Current_routine</span><span class="Delimiter">-&gt;</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> &amp;&amp; <a href='056shape_shifting_recipe.cc.html#L156'>any_type_ingredient_in_header</a><span class="Delimiter">(</span><span class="Special">Current_routine</span><span class="Delimiter">-&gt;</span>calls<span class="Delimiter">.</span>front<span class="Delimiter">().</span>running_recipe<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L39" class="LineNr"> 39 </span><span class="CommentedCode">//? DUMP(&quot;&quot;);</span> <span id="L40" class="LineNr"> 40 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot;ran into unspecialized shape-shifting <a href='010vm.cc.html#L19'>recipe</a> &quot;</span> &lt;&lt; <a href='026call.cc.html#L87'>current_recipe_name</a><span class="Delimiter">()</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>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> <span id="L44" class="LineNr"> 44 </span><span class="Comment">//: Make sure we don't match up literals with type ingredients without</span> <span id="L45" class="LineNr"> 45 </span><span class="Comment">//: specialization.</span> <span id="L46" class="LineNr"> 46 </span><span class="Delimiter">:(before &quot;End Matching Types For Literal(to)&quot;)</span> <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="Delimiter">:(after &quot;Static Dispatch Phase 2&quot;)</span> <span id="L50" class="LineNr"> 50 </span>candidates = <a href='056shape_shifting_recipe.cc.html#L73'>strictly_matching_shape_shifting_variants</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> variants<span class="Delimiter">);</span> <span id="L51" class="LineNr"> 51 </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="L52" class="LineNr"> 52 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> exemplar = <a href='056shape_shifting_recipe.cc.html#L106'>best_shape_shifting_variant</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">);</span> <span id="L53" class="LineNr"> 53 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;found variant to specialize: &quot;</span> &lt;&lt; exemplar &lt;&lt; <span class="Constant">' '</span> &lt;&lt; get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">).</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L54" class="LineNr"> 54 </span> string new_recipe_name = <a href='056shape_shifting_recipe.cc.html#L241'>insert_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="L55" class="LineNr"> 55 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>new_recipe_name != <span class="Constant">&quot;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L56" class="LineNr"> 56 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new specialization: &quot;</span> &lt;&lt; new_recipe_name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L57" class="LineNr"> 57 </span> <span class="Identifier">return</span> new_recipe_name<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="Comment">//: before running Mu programs, make sure no unspecialized shape-shifting</span> <span id="L62" class="LineNr"> 62 </span><span class="Comment">//: recipes can be called</span> <span id="L63" class="LineNr"> 63 </span> <span id="L64" class="LineNr"> 64 </span><span class="Delimiter">:(before &quot;End Instruction Operation Checks&quot;)</span> <span id="L65" class="LineNr"> 65 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> &amp;&amp; !is_primitive<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>operation<span class="Delimiter">)</span> <span id="L66" class="LineNr"> 66 </span> &amp;&amp; <a href='056shape_shifting_recipe.cc.html#L156'>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="L67" class="LineNr"> 67 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;instruction '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has no valid specialization\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L68" class="LineNr"> 68 </span> <span class="Identifier">return</span><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="Delimiter">:(code)</span> <span id="L72" class="LineNr"> 72 </span><span class="Comment">// phase 3 of static dispatch</span> <span id="L73" class="LineNr"> 73 </span>vector&lt;recipe_ordinal&gt; <a href='056shape_shifting_recipe.cc.html#L73'>strictly_matching_shape_shifting_variants</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; variants<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L74" class="LineNr"> 74 </span> vector&lt;recipe_ordinal&gt; result<span class="Delimiter">;</span> <span id="L75" class="LineNr"> 75 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variants<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L76" class="LineNr"> 76 </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="L77" class="LineNr"> 77 </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="L78" class="LineNr"> 78 </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><span class="Special">Recipe</span><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="L79" class="LineNr"> 79 </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="L80" class="LineNr"> 80 </span> <span class="Delimiter">}</span> <span id="L81" class="LineNr"> 81 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</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="Normal">bool</span> <a href='056shape_shifting_recipe.cc.html#L84'>all_concrete_header_reagents_strictly_match</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L85" class="LineNr"> 85 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; min<span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">),</span> <a href='001help.cc.html#L141'>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="L86" class="LineNr"> 86 </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="L87" class="LineNr"> 87 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: ingredient &quot;</span> &lt;&lt; i &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L88" class="LineNr"> 88 </span> <span class="Identifier">return</span><span class="Constant"> false</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="Delimiter">}</span> <span id="L91" class="LineNr"> 91 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; min<span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L141'>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="L92" class="LineNr"> 92 </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="L93" class="LineNr"> 93 </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="L94" class="LineNr"> 94 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;concrete-type match failed: product &quot;</span> &lt;&lt; i &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L95" class="LineNr"> 95 </span> <span class="Identifier">return</span><span class="Constant"> false</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">}</span> <span id="L98" class="LineNr"> 98 </span> <span class="Identifier">return</span><span class="Constant"> true</span><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="Comment">// manual prototype</span> <span id="L102" class="LineNr"> 102 </span>vector&lt;recipe_ordinal&gt; <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp;<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp;<span class="Delimiter">,</span> <span id="L103" class="LineNr"> 103 </span> <span class="Normal">int</span> <span class="Delimiter">(</span>*<span class="Delimiter">)(</span><span class="Normal">const</span> instruction&amp;<span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a><span class="Delimiter">));</span> <span id="L104" class="LineNr"> 104 </span> <span id="L105" class="LineNr"> 105 </span><span class="Comment">// tie-breaker for phase 3</span> <span id="L106" class="LineNr"> 106 </span><a href='010vm.cc.html#L14'>recipe_ordinal</a> <a href='056shape_shifting_recipe.cc.html#L106'>best_shape_shifting_variant</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; candidates<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L107" class="LineNr"> 107 </span> assert<span class="Delimiter">(</span>!candidates<span class="Delimiter">.</span>empty<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#L141'>SIZE</a><span class="Delimiter">(</span>candidates<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L109" class="LineNr"> 109 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;A picking shape-shifting variant:\n&quot;;</span> <span id="L110" class="LineNr"> 110 </span> vector&lt;recipe_ordinal&gt; result1 = <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> candidates<span class="Delimiter">,</span> number_of_concrete_type_names<span class="Delimiter">);</span> <span id="L111" class="LineNr"> 111 </span> assert<span class="Delimiter">(</span>!result1<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L112" class="LineNr"> 112 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>result1<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> result1<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L113" class="LineNr"> 113 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;B picking shape-shifting variant:\n&quot;;</span> <span id="L114" class="LineNr"> 114 </span> vector&lt;recipe_ordinal&gt; result2 = <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> result1<span class="Delimiter">,</span> <a href='056shape_shifting_recipe.cc.html#L150'>arity_fit</a><span class="Delimiter">);</span> <span id="L115" class="LineNr"> 115 </span> assert<span class="Delimiter">(</span>!result2<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L116" class="LineNr"> 116 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>result2<span class="Delimiter">)</span> == <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Identifier">return</span> result2<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> <span id="L117" class="LineNr"> 117 </span><span class="CommentedCode">//? cerr &lt;&lt; &quot;C picking shape-shifting variant:\n&quot;;</span> <span id="L118" class="LineNr"> 118 </span> vector&lt;recipe_ordinal&gt; result3 = <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span>inst<span class="Delimiter">,</span> result2<span class="Delimiter">,</span> number_of_type_ingredients<span class="Delimiter">);</span> <span id="L119" class="LineNr"> 119 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>result3<span class="Delimiter">)</span> &gt; <span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L120" class="LineNr"> 120 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot;\nCouldn't decide the best shape-shifting variant for instruction '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span> <span id="L121" class="LineNr"> 121 </span> cerr &lt;&lt; <span class="Constant">&quot;This is a hole in Mu. Please copy the following candidates into an email to Kartik Agaram &lt;mu@akkartik.com&gt;\n&quot;</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 &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>candidates<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L123" class="LineNr"> 123 </span> cerr &lt;&lt; <span class="Constant">&quot; &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> candidates<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> &lt;&lt; <span class="cSpecial">'\n'</span><span class="Delimiter">;</span> <span id="L124" class="LineNr"> 124 </span> <span class="Delimiter">}</span> <span id="L125" class="LineNr"> 125 </span> <span class="Identifier">return</span> result3<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</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>vector&lt;recipe_ordinal&gt; <a href='056shape_shifting_recipe.cc.html#L128'>keep_max</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <span class="Normal">const</span> vector&lt;recipe_ordinal&gt;&amp; in<span class="Delimiter">,</span> <span id="L129" class="LineNr"> 129 </span> <span class="Normal">int</span> <span class="Delimiter">(</span>*scorer<span class="Delimiter">)(</span><span class="Normal">const</span> instruction&amp;<span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a><span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L130" class="LineNr"> 130 </span> assert<span class="Delimiter">(</span>!in<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> <span id="L131" class="LineNr"> 131 </span> vector&lt;recipe_ordinal&gt; out<span class="Delimiter">;</span> <span id="L132" class="LineNr"> 132 </span> out<span class="Delimiter">.</span>push_back<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="L133" class="LineNr"> 133 </span> <span class="Normal">int</span> best_score = <span class="Delimiter">(</span>*scorer<span class="Delimiter">)(</span>inst<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="L134" class="LineNr"> 134 </span><span class="CommentedCode">//? cerr &lt;&lt; best_score &lt;&lt; &quot; &quot; &lt;&lt; header_label(get(Recipe, in.at(0))) &lt;&lt; '\n';</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">1</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L136" class="LineNr"> 136 </span> <span class="Normal">int</span> score = <span class="Delimiter">(</span>*scorer<span class="Delimiter">)(</span>inst<span class="Delimiter">,</span> in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> <span id="L137" class="LineNr"> 137 </span><span class="CommentedCode">//? cerr &lt;&lt; score &lt;&lt; &quot; &quot; &lt;&lt; header_label(get(Recipe, in.at(i))) &lt;&lt; '\n';</span> <span id="L138" class="LineNr"> 138 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>score == best_score<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L139" class="LineNr"> 139 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<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">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>score &gt; best_score<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L142" class="LineNr"> 142 </span> best_score = score<span class="Delimiter">;</span> <span id="L143" class="LineNr"> 143 </span> out<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> <span id="L144" class="LineNr"> 144 </span> out<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>in<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<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="Identifier">return</span> out<span class="Delimiter">;</span> <span id="L148" class="LineNr"> 148 </span><span class="Delimiter">}</span> <span id="L149" class="LineNr"> 149 </span> <span id="L150" class="LineNr"> 150 </span><span class="Normal">int</span> <a href='056shape_shifting_recipe.cc.html#L150'>arity_fit</a><span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> candidate<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L151" class="LineNr"> 151 </span> <span class="Normal">const</span> recipe&amp; r = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> candidate<span class="Delimiter">);</span> <span id="L152" class="LineNr"> 152 </span> <span class="Identifier">return</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">)</span> - <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>products<span class="Delimiter">))</span> <span id="L153" class="LineNr"> 153 </span> + <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>ingredients<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> <span id="L154" class="LineNr"> 154 </span><span class="Delimiter">}</span> <span id="L155" class="LineNr"> 155 </span> <span id="L156" class="LineNr"> 156 </span><span class="Normal">bool</span> <a href='056shape_shifting_recipe.cc.html#L156'>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="L157" class="LineNr"> 157 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> variant<span class="Delimiter">);</span> <span id="L158" class="LineNr"> 158 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>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="L159" class="LineNr"> 159 </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="L160" class="LineNr"> 160 </span> <span class="Identifier">return</span><span class="Constant"> true</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="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>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="L163" class="LineNr"> 163 </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="L164" class="LineNr"> 164 </span> <span class="Identifier">return</span><span class="Constant"> true</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="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L167" class="LineNr"> 167 </span><span class="Delimiter">}</span> <span id="L168" class="LineNr"> 168 </span> <span id="L169" class="LineNr"> 169 </span><span class="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> to<span class="Delimiter">,</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> from<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L170" class="LineNr"> 170 </span> canonize_type<span class="Delimiter">(</span>to<span class="Delimiter">);</span> <span id="L171" class="LineNr"> 171 </span> canonize_type<span class="Delimiter">(</span>from<span class="Delimiter">);</span> <span id="L172" class="LineNr"> 172 </span> <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">.</span>type<span class="Delimiter">,</span> from<span class="Delimiter">);</span> <span 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="Normal">bool</span> concrete_type_names_strictly_match<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* to<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* from<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; rhs_reagent<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L176" class="LineNr"> 176 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">)</span> <span class="Identifier">return</span> !from<span class="Delimiter">;</span> <span id="L177" class="LineNr"> 177 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">)</span> <span class="Identifier">return</span> !to<span class="Delimiter">;</span> <span id="L178" class="LineNr"> 178 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span class="Comment">// type ingredient matches anything</span> <span id="L179" class="LineNr"> 179 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!to<span class="Delimiter">-&gt;</span>atom &amp;&amp; to<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_type_ingredient_name<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L180" class="LineNr"> 180 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom &amp;&amp; is_mu_address<span class="Delimiter">(</span>to<span class="Delimiter">))</span> <span id="L181" class="LineNr"> 181 </span> <span class="Identifier">return</span> from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal-address&quot;</span> &amp;&amp; rhs_reagent<span class="Delimiter">.</span>name == <span class="Constant">&quot;null&quot;</span><span class="Delimiter">;</span> <span id="L182" class="LineNr"> 182 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!from<span class="Delimiter">-&gt;</span>atom &amp;&amp; !to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span id="L183" class="LineNr"> 183 </span> <span class="Identifier">return</span> concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">)</span> <span id="L184" class="LineNr"> 184 </span> &amp;&amp; concrete_type_names_strictly_match<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> from<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> rhs_reagent<span class="Delimiter">);</span> <span id="L185" class="LineNr"> 185 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>atom != to<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L186" class="LineNr"> 186 </span> <span class="Comment">// both from and to are atoms</span> <span id="L187" class="LineNr"> 187 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> <span id="L188" class="LineNr"> 188 </span> <span class="Identifier">return</span> <span class="Special">Literal_type_names</span><span class="Delimiter">.</span>find<span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != <span class="Special">Literal_type_names</span><span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L189" class="LineNr"> 189 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>to<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> <span id="L190" class="LineNr"> 190 </span> <span class="Identifier">return</span> <span class="Special">Literal_type_names</span><span class="Delimiter">.</span>find<span class="Delimiter">(</span>from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> != <span class="Special">Literal_type_names</span><span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L191" class="LineNr"> 191 </span> <span class="Identifier">return</span> to<span class="Delimiter">-&gt;</span>name == from<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span> <span 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="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L195" class="LineNr"> 195 </span> <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <span id="L196" class="LineNr"> 196 </span><span class="Delimiter">}</span> <span id="L197" class="LineNr"> 197 </span> <span id="L198" class="LineNr"> 198 </span><span class="Normal">bool</span> contains_type_ingredient_name<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span 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="Constant"> false</span><span class="Delimiter">;</span> <span id="L200" class="LineNr"> 200 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L201" class="LineNr"> 201 </span> <span class="Identifier">return</span> contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> || contains_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span> <span 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="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L205" class="LineNr"> 205 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L206" class="LineNr"> 206 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L207" class="LineNr"> 207 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><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> 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>type<span class="Delimiter">);</span> <span id="L209" class="LineNr"> 209 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><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> 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>type<span class="Delimiter">);</span> <span id="L211" class="LineNr"> 211 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L212" class="LineNr"> 212 </span><span class="Delimiter">}</span> <span id="L213" class="LineNr"> 213 </span> <span id="L214" class="LineNr"> 214 </span><span class="Normal">int</span> number_of_concrete_type_names<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L215" class="LineNr"> 215 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L216" class="LineNr"> 216 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span id="L217" class="LineNr"> 217 </span> <span class="Identifier">return</span> is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> ? <span class="Constant">0</span> : <span class="Constant">1</span><span class="Delimiter">;</span> <span id="L218" class="LineNr"> 218 </span> <span class="Identifier">return</span> number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> <span id="L219" class="LineNr"> 219 </span> + number_of_concrete_type_names<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<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">int</span> number_of_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> instruction&amp; <span class="Comment">/*</span><span class="Comment">unused</span><span class="Comment">*/</span><span class="Delimiter">,</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L223" class="LineNr"> 223 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> r<span class="Delimiter">);</span> <span id="L224" class="LineNr"> 224 </span> <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L225" class="LineNr"> 225 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L226" class="LineNr"> 226 </span> result += number_of_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> <span id="L227" class="LineNr"> 227 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L228" class="LineNr"> 228 </span> result += number_of_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> <span id="L229" class="LineNr"> 229 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L230" class="LineNr"> 230 </span><span class="Delimiter">}</span> <span id="L231" class="LineNr"> 231 </span> <span id="L232" class="LineNr"> 232 </span><span class="Normal">int</span> number_of_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L233" class="LineNr"> 233 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L234" class="LineNr"> 234 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span id="L235" class="LineNr"> 235 </span> <span class="Identifier">return</span> is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> ? <span class="Constant">1</span> : <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L236" class="LineNr"> 236 </span> <span class="Identifier">return</span> number_of_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> <span id="L237" class="LineNr"> 237 </span> + number_of_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span> <span id="L238" class="LineNr"> 238 </span><span class="Delimiter">}</span> <span id="L239" class="LineNr"> 239 </span> <span id="L240" class="LineNr"> 240 </span><span class="Comment">// returns name of new variant</span> <span id="L241" class="LineNr"> 241 </span>string <a href='056shape_shifting_recipe.cc.html#L241'>insert_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&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="L242" class="LineNr"> 242 </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="L243" class="LineNr"> 243 </span> assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special">Recipe_ordinal</span><span class="Delimiter">,</span> new_name<span class="Delimiter">));</span> <span id="L244" class="LineNr"> 244 </span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> new_recipe_ordinal = <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span><span class="Special">Recipe_ordinal</span><span class="Delimiter">,</span> new_name<span class="Delimiter">,</span> <span class="Special">Next_recipe_ordinal</span>++<span class="Delimiter">);</span> <span id="L245" class="LineNr"> 245 </span> <span class="Comment">// make a copy</span> <span id="L246" class="LineNr"> 246 </span> assert<span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span> <span id="L247" class="LineNr"> 247 </span> assert<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">));</span> <span id="L248" class="LineNr"> 248 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">,</span> <span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span> <span id="L249" class="LineNr"> 249 </span> recipe&amp; new_recipe = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> new_recipe_ordinal<span class="Delimiter">);</span> <span id="L250" class="LineNr"> 250 </span> new_recipe<span class="Delimiter">.</span>name = new_name<span class="Delimiter">;</span> <span id="L251" class="LineNr"> 251 </span> new_recipe<span class="Delimiter">.</span>ordinal = new_recipe_ordinal<span class="Delimiter">;</span> <span id="L252" class="LineNr"> 252 </span> new_recipe<span class="Delimiter">.</span>is_autogenerated =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L253" class="LineNr"> 253 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;switching &quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot; to specialized &quot;</span> &lt;&lt; header_label<span class="Delimiter">(</span>new_recipe<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L254" class="LineNr"> 254 </span> <span id="L255" class="LineNr"> 255 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;transforming new specialization: &quot;</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L256" class="LineNr"> 256 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: performing transforms until check_or_set_types_by_name&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L257" class="LineNr"> 257 </span> <span class="Normal">int</span> transform_index = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L258" class="LineNr"> 258 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>transform_index = <span class="Constant">0</span><span class="Delimiter">;</span> transform_index &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">);</span> ++transform_index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L259" class="LineNr"> 259 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>transform_index<span class="Delimiter">)</span> == <a href='046check_type_by_name.cc.html#L35'>check_or_set_types_by_name</a><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L260" class="LineNr"> 260 </span> <span class="Delimiter">(</span>*<span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>transform_index<span class="Delimiter">))(</span>new_recipe_ordinal<span class="Delimiter">);</span> <span id="L261" class="LineNr"> 261 </span> <span class="Delimiter">}</span> <span id="L262" class="LineNr"> 262 </span> new_recipe<span class="Delimiter">.</span>transformed_until = transform_index-<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L263" class="LineNr"> 263 </span> <span id="L264" class="LineNr"> 264 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: performing type-ingredient-aware version of <a href='012transform.cc.html#L99'>transform</a> check_or_set_types_by_name&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L265" class="LineNr"> 265 </span> <a href='056shape_shifting_recipe.cc.html#L290'>compute_type_names</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">);</span> <span id="L266" class="LineNr"> 266 </span> new_recipe<span class="Delimiter">.</span>transformed_until++<span class="Delimiter">;</span> <span id="L267" class="LineNr"> 267 </span> <span id="L268" class="LineNr"> 268 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: replacing type ingredients&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L269" class="LineNr"> 269 </span> <span class="Delimiter">{</span> <span id="L270" class="LineNr"> 270 </span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt; mappings<span class="Delimiter">;</span> <span id="L271" class="LineNr"> 271 </span> <span class="Normal">bool</span> error =<span class="Constant"> false</span><span class="Delimiter">;</span> <span id="L272" class="LineNr"> 272 </span> <a href='056shape_shifting_recipe.cc.html#L328'>compute_type_ingredient_mappings</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">),</span> inst<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> &amp;error<span class="Delimiter">);</span> <span id="L273" class="LineNr"> 273 </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#L141'>SIZE</a><span class="Delimiter">(</span>mappings<span class="Delimiter">)</span> != <a href='056shape_shifting_recipe.cc.html#L466'>type_ingredient_count_in_header</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">));</span> <span id="L274" class="LineNr"> 274 </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="L275" class="LineNr"> 275 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;::iterator p = mappings<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != mappings<span class="Delimiter">.</span><a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span id="L276" class="LineNr"> 276 </span> <span class="Normal">delete</span> p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span> <span id="L277" class="LineNr"> 277 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>error<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span> <span id="L278" class="LineNr"> 278 </span> <span class="Delimiter">}</span> <span id="L279" class="LineNr"> 279 </span> ensure_all_concrete_types<span class="Delimiter">(</span>new_recipe<span class="Delimiter">,</span> get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> exemplar<span class="Delimiter">));</span> <span id="L280" class="LineNr"> 280 </span> <span id="L281" class="LineNr"> 281 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: recording the new variant before recursively calling resolve_ambiguous_calls&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L282" class="LineNr"> 282 </span> get<span class="Delimiter">(</span><span class="Special">Recipe_variants</span><span class="Delimiter">,</span> inst<span class="Delimiter">.</span>name<span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>new_recipe_ordinal<span class="Delimiter">);</span> <span id="L283" class="LineNr"> 283 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;: performing remaining transforms (including resolve_ambiguous_calls)&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L284" class="LineNr"> 284 </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> transform_index &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">);</span> ++transform_index<span class="Delimiter">)</span> <span id="L285" class="LineNr"> 285 </span> <span class="Delimiter">(</span>*<span class="Special">Transform</span><span class="Delimiter">.</span>at<span class="Delimiter">(</span>transform_index<span class="Delimiter">))(</span>new_recipe_ordinal<span class="Delimiter">);</span> <span id="L286" class="LineNr"> 286 </span> new_recipe<span class="Delimiter">.</span>transformed_until = <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span><span class="Special">Transform</span><span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">;</span> <span id="L287" class="LineNr"> 287 </span> <span class="Identifier">return</span> new_recipe<span class="Delimiter">.</span>name<span class="Delimiter">;</span> <span id="L288" class="LineNr"> 288 </span><span class="Delimiter">}</span> <span id="L289" class="LineNr"> 289 </span> <span id="L290" class="LineNr"> 290 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L290'>compute_type_names</a><span class="Delimiter">(</span>recipe&amp; variant<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L291" class="LineNr"> 291 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- compute type names: &quot;</span> &lt;&lt; variant<span class="Delimiter">.</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L292" class="LineNr"> 292 </span> map&lt;string<span class="Delimiter">,</span> type_tree*&gt; type_names<span class="Delimiter">;</span> <span id="L293" class="LineNr"> 293 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L294" class="LineNr"> 294 </span> <a href='056shape_shifting_recipe.cc.html#L307'>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">&quot;&quot;</span><span class="Delimiter">);</span> <span id="L295" class="LineNr"> 295 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L296" class="LineNr"> 296 </span> <a href='056shape_shifting_recipe.cc.html#L307'>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">&quot;&quot;</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 &lt; <a href='001help.cc.html#L141'>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="L298" class="LineNr"> 298 </span> instruction&amp; inst = variant<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L299" class="LineNr"> 299 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; <a href='010vm.cc.html#L33'>instruction</a>: &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L300" class="LineNr"> 300 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> in = <span class="Constant">0</span><span class="Delimiter">;</span> in &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++in<span class="Delimiter">)</span> <span id="L301" class="LineNr"> 301 </span> <a href='056shape_shifting_recipe.cc.html#L307'>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">&quot; in '&quot;</span> + to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span> <span id="L302" class="LineNr"> 302 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> out = <span class="Constant">0</span><span class="Delimiter">;</span> out &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++out<span class="Delimiter">)</span> <span id="L303" class="LineNr"> 303 </span> <a href='056shape_shifting_recipe.cc.html#L307'>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">&quot; in '&quot;</span> + to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> + <span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span> <span 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 id="L307" class="LineNr"> 307 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L307'>save_or_deduce_type_name</a><span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> type_tree*&gt;&amp; type<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; variant<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; context<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L308" class="LineNr"> 308 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; checking &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;: &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L309" class="LineNr"> 309 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type &amp;&amp; <a href='001help.cc.html#L226'>contains_key</a><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="L310" class="LineNr"> 310 </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="L311" class="LineNr"> 311 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9994</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; deducing type to &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><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="Comment">// Type Check in Type-ingredient-aware check_or_set_types_by_name</span> <span id="L315" class="LineNr"> 315 </span> <span class="Comment">// This is different from check_or_set_types_by_name.</span> <span id="L316" class="LineNr"> 316 </span> <span class="Comment">// We've found it useful in the past for tracking down bugs in</span> <span id="L317" class="LineNr"> 317 </span> <span class="Comment">// specialization.</span> <span id="L318" class="LineNr"> 318 </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="L319" class="LineNr"> 319 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>variant<span class="Delimiter">.</span>original_name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;unknown type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; context &lt;&lt; <span class="Constant">&quot; (check the name for typos)\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L320" class="LineNr"> 320 </span> <span class="Identifier">return</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><a href='001help.cc.html#L226'>contains_key</a><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="L323" class="LineNr"> 323 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;offset&quot;</span> || x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;variant&quot;</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// special-case for container-access instructions</span> <span id="L324" class="LineNr"> 324 </span> <a href='001help.cc.html#L221'>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="L325" class="LineNr"> 325 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type of '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</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="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L328'>compute_type_ingredient_mappings</a><span class="Delimiter">(</span><span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L329" class="LineNr"> 329 </span> <span class="Normal">int</span> limit = min<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> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">));</span> <span id="L330" class="LineNr"> 330 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; limit<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L331" class="LineNr"> 331 </span> <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L332" class="LineNr"> 332 </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> <span id="L333" class="LineNr"> 333 </span> canonize_type<span class="Delimiter">(</span>ingredient<span class="Delimiter">);</span> <span id="L334" class="LineNr"> 334 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">)</span> &amp;&amp; ingredient<span class="Delimiter">.</span>name == <span class="Constant">&quot;null&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// assume it matches</span> <span id="L335" class="LineNr"> 335 </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="L336" class="LineNr"> 336 </span> <span class="Delimiter">}</span> <span id="L337" class="LineNr"> 337 </span> limit = min<span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">),</span> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>products<span class="Delimiter">));</span> <span id="L338" class="LineNr"> 338 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; limit<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L339" class="LineNr"> 339 </span> <span class="Normal">const</span> reagent&amp; exemplar_reagent = exemplar<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L340" class="LineNr"> 340 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L341" class="LineNr"> 341 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_dummy<span class="Delimiter">(</span>product<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L342" class="LineNr"> 342 </span> canonize_type<span class="Delimiter">(</span>product<span class="Delimiter">);</span> <span id="L343" class="LineNr"> 343 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">,</span> product<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> inst<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span> <span id="L344" class="LineNr"> 344 </span> <span class="Delimiter">}</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 class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> reagent&amp; refinement<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L348" class="LineNr"> 348 </span> assert<span class="Delimiter">(</span>refinement<span class="Delimiter">.</span>type<span class="Delimiter">);</span> <span id="L349" class="LineNr"> 349 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_reagent<span class="Delimiter">.</span>type<span class="Delimiter">,</span> refinement<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span> <span 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> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* exemplar_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* refinement_type<span class="Delimiter">,</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">,</span> <span class="Normal">const</span> reagent&amp; exemplar_reagent<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; call_instruction<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller_recipe<span class="Delimiter">,</span> <span class="Normal">bool</span>* error<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L353" class="LineNr"> 353 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L354" class="LineNr"> 354 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!refinement_type<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L355" class="LineNr"> 355 </span> <span class="Comment">// probably a bug in mu</span> <span id="L356" class="LineNr"> 356 </span> <span class="Comment">// todo: make this smarter; only flag an error if exemplar_type contains some *new* type ingredient</span> <span id="L357" class="LineNr"> 357 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;missing type ingredient for &quot;</span> &lt;&lt; exemplar_reagent<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L358" class="LineNr"> 358 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot; (called from '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;')\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L359" class="LineNr"> 359 </span> <span class="Identifier">return</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">if</span> <span class="Delimiter">(</span>!exemplar_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; exemplar_type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; !refinement_type<span class="Delimiter">-&gt;</span>atom &amp;&amp; refinement_type<span class="Delimiter">-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L362" class="LineNr"> 362 </span> exemplar_type = exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span> <span id="L363" class="LineNr"> 363 </span> <a href='003trace.cc.html#L199'>assert_for_now</a><span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span> <span id="L364" class="LineNr"> 364 </span> <span class="Delimiter">}</span> <span id="L365" class="LineNr"> 365 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L366" class="LineNr"> 366 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L367" class="LineNr"> 367 </span> <span class="Normal">const</span> type_tree* curr_refinement_type = <span class="Constant">NULL</span><span class="Delimiter">;</span> <span class="Comment">// temporary heap allocation; must always be deleted before it goes out of scope</span> <span id="L368" class="LineNr"> 368 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span id="L369" class="LineNr"> 369 </span> curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">);</span> <span id="L370" class="LineNr"> 370 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L371" class="LineNr"> 371 </span> assert<span class="Delimiter">(</span>!refinement_type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span> <span id="L372" class="LineNr"> 372 </span> curr_refinement_type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">);</span> <span id="L373" class="LineNr"> 373 </span> <span class="Delimiter">}</span> <span id="L374" class="LineNr"> 374 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L375" class="LineNr"> 375 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;adding mapping from &quot;</span> &lt;&lt; exemplar_type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; to &quot;</span> &lt;&lt; <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>curr_refinement_type<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L376" class="LineNr"> 376 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span> <span id="L377" class="LineNr"> 377 </span> <span class="Delimiter">}</span> <span id="L378" class="LineNr"> 378 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L379" class="LineNr"> 379 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!deeply_equal_type_names<span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">),</span> curr_refinement_type<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L380" class="LineNr"> 380 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller_recipe<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;no call found for '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>call_instruction<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L381" class="LineNr"> 381 </span> *error =<span class="Constant"> true</span><span class="Delimiter">;</span> <span id="L382" class="LineNr"> 382 </span> <span class="Normal">delete</span> curr_refinement_type<span class="Delimiter">;</span> <span id="L383" class="LineNr"> 383 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L384" class="LineNr"> 384 </span> <span class="Delimiter">}</span> <span id="L385" class="LineNr"> 385 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L386" class="LineNr"> 386 </span> <span class="Normal">delete</span> get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span> <span id="L387" class="LineNr"> 387 </span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> exemplar_type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*curr_refinement_type<span class="Delimiter">));</span> <span id="L388" class="LineNr"> 388 </span> <span class="Delimiter">}</span> <span id="L389" class="LineNr"> 389 </span> <span class="Delimiter">}</span> <span id="L390" class="LineNr"> 390 </span> <span class="Normal">delete</span> curr_refinement_type<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="Normal">else</span> <span class="Delimiter">{</span> <span id="L394" class="LineNr"> 394 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span> <span id="L395" class="LineNr"> 395 </span> accumulate_type_ingredients<span class="Delimiter">(</span>exemplar_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> refinement_type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">,</span> exemplar<span class="Delimiter">,</span> exemplar_reagent<span class="Delimiter">,</span> call_instruction<span class="Delimiter">,</span> caller_recipe<span class="Delimiter">,</span> error<span class="Delimiter">);</span> <span id="L396" class="LineNr"> 396 </span> <span class="Delimiter">}</span> <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="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L400" class="LineNr"> 400 </span> <span class="Comment">// update its header</span> <span id="L401" class="LineNr"> 401 </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="L402" class="LineNr"> 402 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in <a href='010vm.cc.html#L19'>recipe</a> header ingredients&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><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 &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L404" class="LineNr"> 404 </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="L405" class="LineNr"> 405 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in <a href='010vm.cc.html#L19'>recipe</a> header products&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><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> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L407" class="LineNr"> 407 </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="L408" class="LineNr"> 408 </span> <span class="Comment">// update its body</span> <span id="L409" class="LineNr"> 409 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>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="L410" class="LineNr"> 410 </span> instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L411" class="LineNr"> 411 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in <a href='010vm.cc.html#L33'>instruction</a> '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L412" class="LineNr"> 412 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span id="L413" class="LineNr"> 413 </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="L414" class="LineNr"> 414 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span id="L415" class="LineNr"> 415 </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="L416" class="LineNr"> 416 </span> <span class="Comment">// special-case for new: replace type ingredient in first ingredient *value*</span> <span id="L417" class="LineNr"> 417 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span> &amp;&amp; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;literal-string&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L418" class="LineNr"> 418 </span> type_tree* type = <a href='056shape_shifting_recipe.cc.html#L483'>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="L419" class="LineNr"> 419 </span> replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span> <span id="L420" class="LineNr"> 420 </span> 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="L421" class="LineNr"> 421 </span> <span class="Normal">delete</span> type<span class="Delimiter">;</span> <span id="L422" class="LineNr"> 422 </span> <span class="Delimiter">}</span> <span id="L423" class="LineNr"> 423 </span> <span class="Delimiter">}</span> <span id="L424" class="LineNr"> 424 </span><span class="Delimiter">}</span> <span id="L425" class="LineNr"> 425 </span> <span id="L426" class="LineNr"> 426 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L427" class="LineNr"> 427 </span> string before = <a href='028call_return.cc.html#L163'>to_string</a><span class="Delimiter">(</span>x<span class="Delimiter">);</span> <span id="L428" class="LineNr"> 428 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;replacing in ingredient &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L429" class="LineNr"> 429 </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="L430" class="LineNr"> 430 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <span class="Constant">&quot;specializing &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>original_name &lt;&lt; <span class="Constant">&quot;: missing type for '&quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'\n&quot;</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L431" class="LineNr"> 431 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L432" class="LineNr"> 432 </span> <span class="Delimiter">}</span> <span id="L433" class="LineNr"> 433 </span> replace_type_ingredients<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span> <span id="L434" class="LineNr"> 434 </span><span class="Delimiter">}</span> <span id="L435" class="LineNr"> 435 </span> <span id="L436" class="LineNr"> 436 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> map&lt;string<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree*&gt;&amp; mappings<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L437" class="LineNr"> 437 </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="L438" class="LineNr"> 438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L439" class="LineNr"> 439 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right == <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left != <span class="Constant">NULL</span> &amp;&amp; type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom &amp;&amp; <a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)</span> &amp;&amp; !get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>atom &amp;&amp; get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">)-&gt;</span>right != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L440" class="LineNr"> 440 </span> *type = *get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span> <span 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> replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span> <span id="L444" class="LineNr"> 444 </span> replace_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> mappings<span class="Delimiter">);</span> <span id="L445" class="LineNr"> 445 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L446" class="LineNr"> 446 </span> <span class="Delimiter">}</span> <span id="L447" class="LineNr"> 447 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L226'>contains_key</a><span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Comment">// todo: ugly side effect</span> <span id="L448" class="LineNr"> 448 </span> type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span> <span id="L449" class="LineNr"> 449 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span id="L450" class="LineNr"> 450 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L451" class="LineNr"> 451 </span> <span class="Normal">const</span> type_tree* replacement = get<span class="Delimiter">(</span>mappings<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span> <span id="L452" class="LineNr"> 452 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; =&gt; &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>replacement<span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L453" class="LineNr"> 453 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L454" class="LineNr"> 454 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L455" class="LineNr"> 455 </span> <span class="Comment">// error in program; should be reported elsewhere</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> type<span class="Delimiter">-&gt;</span>name = <span class="Delimiter">(</span>replacement<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;literal&quot;</span><span class="Delimiter">)</span> ? <span class="Constant">&quot;number&quot;</span> : replacement<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span> <span id="L459" class="LineNr"> 459 </span> type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span><span class="Special">Type_ordinal</span><span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span> <span id="L460" class="LineNr"> 460 </span> <span class="Delimiter">}</span> <span id="L461" class="LineNr"> 461 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> <span id="L462" class="LineNr"> 462 </span> *type = *replacement<span class="Delimiter">;</span> <span id="L463" class="LineNr"> 463 </span> <span class="Delimiter">}</span> <span id="L464" class="LineNr"> 464 </span><span class="Delimiter">}</span> <span id="L465" class="LineNr"> 465 </span> <span id="L466" class="LineNr"> 466 </span><span class="Normal">int</span> <a href='056shape_shifting_recipe.cc.html#L466'>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="L467" class="LineNr"> 467 </span> <span class="Normal">const</span> recipe&amp; caller = get<span class="Delimiter">(</span><span class="Special">Recipe</span><span class="Delimiter">,</span> variant<span class="Delimiter">);</span> <span id="L468" class="LineNr"> 468 </span> set&lt;string&gt; type_ingredients<span class="Delimiter">;</span> <span id="L469" class="LineNr"> 469 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L470" class="LineNr"> 470 </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="L471" class="LineNr"> 471 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L472" class="LineNr"> 472 </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="L473" class="LineNr"> 473 </span> <span class="Identifier">return</span> <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>type_ingredients<span class="Delimiter">);</span> <span id="L474" class="LineNr"> 474 </span><span class="Delimiter">}</span> <span id="L475" class="LineNr"> 475 </span> <span id="L476" class="LineNr"> 476 </span><span class="Normal">void</span> accumulate_type_ingredients<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;string&gt;&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L477" class="LineNr"> 477 </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="L478" class="LineNr"> 478 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> out<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span> <span id="L479" class="LineNr"> 479 </span> accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L480" class="LineNr"> 480 </span> accumulate_type_ingredients<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L481" class="LineNr"> 481 </span><span class="Delimiter">}</span> <span id="L482" class="LineNr"> 482 </span> <span id="L483" class="LineNr"> 483 </span>type_tree* <a href='056shape_shifting_recipe.cc.html#L483'>parse_type_tree</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L484" class="LineNr"> 484 </span> string_tree* s2 = parse_string_tree<span class="Delimiter">(</span>s<span class="Delimiter">);</span> <span id="L485" class="LineNr"> 485 </span> type_tree* result = <a href='019type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span>s2<span class="Delimiter">);</span> <span id="L486" class="LineNr"> 486 </span> <span class="Normal">delete</span> s2<span class="Delimiter">;</span> <span id="L487" class="LineNr"> 487 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> <span id="L488" class="LineNr"> 488 </span><span class="Delimiter">}</span> <span id="L489" class="LineNr"> 489 </span> <span id="L490" class="LineNr"> 490 </span>string inspect<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L491" class="LineNr"> 491 </span> ostringstream out<span class="Delimiter">;</span> <span id="L492" class="LineNr"> 492 </span> <a href='056shape_shifting_recipe.cc.html#L496'>dump_inspect</a><span class="Delimiter">(</span>x<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L493" class="LineNr"> 493 </span> <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<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">void</span> <a href='056shape_shifting_recipe.cc.html#L496'>dump_inspect</a><span class="Delimiter">(</span><span class="Normal">const</span> type_tree* x<span class="Delimiter">,</span> ostream&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L497" class="LineNr"> 497 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">-&gt;</span>left &amp;&amp; !x<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L498" class="LineNr"> 498 </span> out &lt;&lt; x<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span> <span id="L499" class="LineNr"> 499 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L500" class="LineNr"> 500 </span> <span class="Delimiter">}</span> <span id="L501" class="LineNr"> 501 </span> out &lt;&lt; <span class="Constant">'('</span><span class="Delimiter">;</span> <span id="L502" class="LineNr"> 502 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">const</span> type_tree* curr = x<span class="Delimiter">;</span> curr<span class="Delimiter">;</span> curr = curr<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L503" class="LineNr"> 503 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr != x<span class="Delimiter">)</span> out &lt;&lt; <span class="Constant">' '</span><span class="Delimiter">;</span> <span id="L504" class="LineNr"> 504 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> <span id="L505" class="LineNr"> 505 </span> <a href='056shape_shifting_recipe.cc.html#L496'>dump_inspect</a><span class="Delimiter">(</span>curr<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> out<span class="Delimiter">);</span> <span id="L506" class="LineNr"> 506 </span> <span class="Normal">else</span> <span id="L507" class="LineNr"> 507 </span> out &lt;&lt; curr<span class="Delimiter">-&gt;</span>name<span class="Delimiter">;</span> <span id="L508" class="LineNr"> 508 </span> <span class="Delimiter">}</span> <span id="L509" class="LineNr"> 509 </span> out &lt;&lt; <span class="Constant">')'</span><span class="Delimiter">;</span> <span id="L510" class="LineNr"> 510 </span><span class="Delimiter">}</span> <span id="L511" class="LineNr"> 511 </span> <span id="L512" class="LineNr"> 512 </span><span class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> recipe&amp; new_recipe<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L513" class="LineNr"> 513 </span> <a href='003trace.cc.html#L189'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;-- ensure all concrete types in <a href='010vm.cc.html#L19'>recipe</a> &quot;</span> &lt;&lt; new_recipe<span class="Delimiter">.</span>name &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L514" class="LineNr"> 514 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L515" class="LineNr"> 515 </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="L516" class="LineNr"> 516 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>new_recipe<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span id="L517" class="LineNr"> 517 </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="L518" class="LineNr"> 518 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span> i &lt; <a href='001help.cc.html#L141'>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="L519" class="LineNr"> 519 </span> instruction&amp; inst = new_recipe<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span> <span id="L520" class="LineNr"> 520 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span id="L521" class="LineNr"> 521 </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="L522" class="LineNr"> 522 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span> j &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++j<span class="Delimiter">)</span> <span id="L523" class="LineNr"> 523 </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="L524" class="LineNr"> 524 </span> <span class="Delimiter">}</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 class="Normal">void</span> ensure_all_concrete_types<span class="Delimiter">(</span><span class="Comment">/*</span><span class="Comment">const</span><span class="Comment">*/</span> reagent&amp; x<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; exemplar<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L528" class="LineNr"> 528 </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="L529" class="LineNr"> 529 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L530" class="LineNr"> 530 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> x<span class="Delimiter">.</span>type = <span class="Normal">new</span> type_tree<span class="Delimiter">(</span><span class="Constant">&quot;added_by_ensure_all_concrete_types&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span class="Comment">// just to prevent crashes later</span> <span id="L531" class="LineNr"> 531 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L532" class="LineNr"> 532 </span> <span class="Delimiter">}</span> <span id="L533" class="LineNr"> 533 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>value == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L534" class="LineNr"> 534 </span> <a href='003trace.cc.html#L196'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>exemplar<span class="Delimiter">.</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;failed to map a type to the unknown &quot;</span> &lt;&lt; x<span class="Delimiter">.</span>original_string &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L225'>end</a><span class="Delimiter">();</span> <span id="L535" class="LineNr"> 535 </span> <span class="Identifier">return</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="Delimiter">}</span> <span id="L538" class="LineNr"> 538 </span> <span id="L539" class="LineNr"> 539 </span><span class="Delimiter">:(scenario shape_shifting_recipe_2)</span> <span id="L540" class="LineNr"> 540 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L541" class="LineNr"> 541 </span> <span class="Constant">10</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span> <span id="L542" class="LineNr"> 542 </span> <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>foo <span class="Constant">10</span>:point <span id="L543" class="LineNr"> 543 </span>] <span id="L544" class="LineNr"> 544 </span><span class="Comment"># non-matching shape-shifting variant</span> <span id="L545" class="LineNr"> 545 </span><span class="muRecipe">def</span> foo a:_t<span class="Delimiter">,</span> b:_t<span class="muRecipe"> -&gt; </span>result:num [ <span id="L546" class="LineNr"> 546 </span> local-scope <span id="L547" class="LineNr"> 547 </span> load-ingredients <span id="L548" class="LineNr"> 548 </span> result<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L549" class="LineNr"> 549 </span>] <span id="L550" class="LineNr"> 550 </span><span class="Comment"># matching shape-shifting variant</span> <span id="L551" class="LineNr"> 551 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>result:_t [ <span id="L552" class="LineNr"> 552 </span> local-scope <span id="L553" class="LineNr"> 553 </span> load-ingredients <span id="L554" class="LineNr"> 554 </span> result<span class="Special"> &lt;- </span>copy a <span id="L555" class="LineNr"> 555 </span>] <span id="L556" class="LineNr"> 556 </span><span class="traceContains">+mem: storing 14 in location 12</span> <span id="L557" class="LineNr"> 557 </span><span class="traceContains">+mem: storing 15 in location 13</span> <span id="L558" class="LineNr"> 558 </span> <span id="L559" class="LineNr"> 559 </span><span class="Delimiter">:(scenario shape_shifting_recipe_nonroot)</span> <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">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span> <span id="L562" class="LineNr"> 562 </span> <span class="Constant">20</span>:point<span class="Special"> &lt;- </span>bar <span class="Constant">10</span>:foo:point <span id="L563" class="LineNr"> 563 </span>] <span id="L564" class="LineNr"> 564 </span><span class="Comment"># shape-shifting recipe with type ingredient following some other type</span> <span id="L565" class="LineNr"> 565 </span><span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [ <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> result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span id="L569" class="LineNr"> 569 </span>] <span id="L570" class="LineNr"> 570 </span><span class="muData">container</span> foo:_t [ <span id="L571" class="LineNr"> 571 </span> <span class="Normal">x</span>:_t <span id="L572" class="LineNr"> 572 </span> <span class="Normal">y</span>:num <span id="L573" class="LineNr"> 573 </span>] <span id="L574" class="LineNr"> 574 </span><span class="traceContains">+mem: storing 14 in location 20</span> <span id="L575" class="LineNr"> 575 </span><span class="traceContains">+mem: storing 15 in location 21</span> <span id="L576" class="LineNr"> 576 </span> <span id="L577" class="LineNr"> 577 </span><span class="Delimiter">:(scenario shape_shifting_recipe_nested)</span> <span id="L578" class="LineNr"> 578 </span><span class="muData">container</span> c:_a:_b [ <span id="L579" class="LineNr"> 579 </span> <span class="Normal">a</span>:_a <span id="L580" class="LineNr"> 580 </span> <span class="Normal">b</span>:_b <span id="L581" class="LineNr"> 581 </span>] <span id="L582" class="LineNr"> 582 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L583" class="LineNr"> 583 </span> <span class="Normal">s</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc] <span id="L584" class="LineNr"> 584 </span> <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>c <span class="Delimiter">(</span><a href='043space.cc.html#L101'>address</a> array character<span class="Delimiter">)</span> number<span class="Delimiter">)}</span><span class="Special"> &lt;- </span>merge s<span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L585" class="LineNr"> 585 </span> foo x <span id="L586" class="LineNr"> 586 </span>] <span id="L587" class="LineNr"> 587 </span><span class="muRecipe">def</span> foo x:c:_bar:_baz [ <span id="L588" class="LineNr"> 588 </span> local-scope <span id="L589" class="LineNr"> 589 </span> load-ingredients <span id="L590" class="LineNr"> 590 </span>] <span id="L591" class="LineNr"> 591 </span><span class="Comment"># no errors</span> <span id="L592" class="LineNr"> 592 </span> <span id="L593" class="LineNr"> 593 </span><span class="Delimiter">:(scenario shape_shifting_recipe_type_deduction_ignores_offsets)</span> <span id="L594" class="LineNr"> 594 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L595" class="LineNr"> 595 </span> <span class="Constant">10</span>:foo:point<span class="Special"> &lt;- </span>merge <span class="Constant">14</span><span class="Delimiter">,</span> <span class="Constant">15</span><span class="Delimiter">,</span> <span class="Constant">16</span> <span id="L596" class="LineNr"> 596 </span> <span class="Constant">20</span>:point<span class="Special"> &lt;- </span>bar <span class="Constant">10</span>:foo:point <span id="L597" class="LineNr"> 597 </span>] <span id="L598" class="LineNr"> 598 </span><span class="muRecipe">def</span> bar a:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [ <span id="L599" class="LineNr"> 599 </span> local-scope <span id="L600" class="LineNr"> 600 </span> load-ingredients <span id="L601" class="LineNr"> 601 </span> <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">1</span> <span id="L602" class="LineNr"> 602 </span> result<span class="Special"> &lt;- </span>get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span class="Comment"># shouldn't collide with other variable</span> <span id="L603" class="LineNr"> 603 </span>] <span id="L604" class="LineNr"> 604 </span><span class="muData">container</span> foo:_t [ <span id="L605" class="LineNr"> 605 </span> <span class="Normal">x</span>:_t <span id="L606" class="LineNr"> 606 </span> <span class="Normal">y</span>:num <span id="L607" class="LineNr"> 607 </span>] <span id="L608" class="LineNr"> 608 </span><span class="traceContains">+mem: storing 14 in location 20</span> <span id="L609" class="LineNr"> 609 </span><span class="traceContains">+mem: storing 15 in location 21</span> <span id="L610" class="LineNr"> 610 </span> <span id="L611" class="LineNr"> 611 </span><span class="Delimiter">:(scenario shape_shifting_recipe_empty)</span> <span id="L612" class="LineNr"> 612 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L613" class="LineNr"> 613 </span> foo <span class="Constant">1</span> <span id="L614" class="LineNr"> 614 </span>] <span id="L615" class="LineNr"> 615 </span><span class="Comment"># shape-shifting recipe with no body</span> <span id="L616" class="LineNr"> 616 </span><span class="muRecipe">def</span> foo a:_t [ <span id="L617" class="LineNr"> 617 </span>] <span id="L618" class="LineNr"> 618 </span><span class="Comment"># shouldn't crash</span> <span id="L619" class="LineNr"> 619 </span> <span id="L620" class="LineNr"> 620 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient)</span> <span id="L621" class="LineNr"> 621 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L622" class="LineNr"> 622 </span> <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span> <span id="L623" class="LineNr"> 623 </span> <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point <span id="L624" class="LineNr"> 624 </span>] <span id="L625" class="LineNr"> 625 </span><span class="muData">container</span> foo:_t [ <span id="L626" class="LineNr"> 626 </span> <span class="Normal">x</span>:_t <span id="L627" class="LineNr"> 627 </span> <span class="Normal">y</span>:num <span id="L628" class="LineNr"> 628 </span>] <span id="L629" class="LineNr"> 629 </span><span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [ <span id="L630" class="LineNr"> 630 </span> local-scope <span id="L631" class="LineNr"> 631 </span> load-ingredients <span id="L632" class="LineNr"> 632 </span> <span class="Comment"># new refers to _t in its ingredient *value*</span> <span id="L633" class="LineNr"> 633 </span> result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span> <span id="L634" class="LineNr"> 634 </span>] <span id="L635" class="LineNr"> 635 </span><span class="traceContains">+mem: storing 0 in location 11</span> <span id="L636" class="LineNr"> 636 </span><span class="traceContains">+mem: storing 0 in location 12</span> <span id="L637" class="LineNr"> 637 </span><span class="traceContains">+mem: storing 0 in location 13</span> <span id="L638" class="LineNr"> 638 </span> <span id="L639" class="LineNr"> 639 </span><span class="Delimiter">:(scenario shape_shifting_recipe_handles_shape_shifting_new_ingredient_2)</span> <span id="L640" class="LineNr"> 640 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L641" class="LineNr"> 641 </span> <span class="Constant">1</span>:&amp;:foo:point<span class="Special"> &lt;- </span>bar <span class="Constant">3</span> <span id="L642" class="LineNr"> 642 </span> <span class="Constant">11</span>:foo:point<span class="Special"> &lt;- </span>copy *<span class="Constant">1</span>:&amp;:foo:point <span id="L643" class="LineNr"> 643 </span>] <span id="L644" class="LineNr"> 644 </span><span class="muRecipe">def</span> bar x:num<span class="muRecipe"> -&gt; </span>result:&amp;:foo:_t [ <span id="L645" class="LineNr"> 645 </span> local-scope <span id="L646" class="LineNr"> 646 </span> load-ingredients <span id="L647" class="LineNr"> 647 </span> <span class="Comment"># new refers to _t in its ingredient *value*</span> <span id="L648" class="LineNr"> 648 </span> result<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo _t<span class="Delimiter">)</span> : type<span class="Delimiter">}</span> <span id="L649" class="LineNr"> 649 </span>] <span id="L650" class="LineNr"> 650 </span><span class="Comment"># container defined after use</span> <span id="L651" class="LineNr"> 651 </span><span class="muData">container</span> foo:_t [ <span id="L652" class="LineNr"> 652 </span> <span class="Normal">x</span>:_t <span id="L653" class="LineNr"> 653 </span> <span class="Normal">y</span>:num <span id="L654" class="LineNr"> 654 </span>] <span id="L655" class="LineNr"> 655 </span><span class="traceContains">+mem: storing 0 in location 11</span> <span id="L656" class="LineNr"> 656 </span><span class="traceContains">+mem: storing 0 in location 12</span> <span id="L657" class="LineNr"> 657 </span><span class="traceContains">+mem: storing 0 in location 13</span> <span id="L658" class="LineNr"> 658 </span> <span id="L659" class="LineNr"> 659 </span><span class="Delimiter">:(scenario shape_shifting_recipe_called_with_dummy)</span> <span id="L660" class="LineNr"> 660 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L661" class="LineNr"> 661 </span> _<span class="Special"> &lt;- </span>bar <span class="Constant">34</span> <span id="L662" class="LineNr"> 662 </span>] <span id="L663" class="LineNr"> 663 </span><span class="muRecipe">def</span> bar x:_t<span class="muRecipe"> -&gt; </span>result:&amp;:_t [ <span id="L664" class="LineNr"> 664 </span> local-scope <span id="L665" class="LineNr"> 665 </span> load-ingredients <span id="L666" class="LineNr"> 666 </span> result<span class="Special"> &lt;- </span>copy<span class="Constant"> null</span> <span id="L667" class="LineNr"> 667 </span>] <span id="L668" class="LineNr"> 668 </span>$error: <span class="Constant">0</span> <span id="L669" class="LineNr"> 669 </span> <span id="L670" class="LineNr"> 670 </span><span class="Delimiter">:(code)</span> <span id="L671" class="LineNr"> 671 </span><span class="Comment">// this one needs a little more fine-grained control</span> <span id="L672" class="LineNr"> 672 </span><span class="Normal">void</span> <a href='056shape_shifting_recipe.cc.html#L672'>test_shape_shifting_new_ingredient_does_not_pollute_global_namespace</a><span class="Delimiter">()</span> <span class="Delimiter">{</span> <span id="L673" class="LineNr"> 673 </span> <span class="Comment">// if you specialize a shape-shifting recipe that allocates a type-ingredient..</span> <span id="L674" class="LineNr"> 674 </span> <a href='012transform.cc.html#L99'>transform</a><span class="Delimiter">(</span><span class="Constant">&quot;def barz x:_elem [\n&quot;</span> <span id="L675" class="LineNr"> 675 </span> <span class="Constant">&quot; local-scope\n&quot;</span> <span id="L676" class="LineNr"> 676 </span> <span class="Constant">&quot; load-ingredients\n&quot;</span> <span id="L677" class="LineNr"> 677 </span> <span class="Constant">&quot; y:&amp;:num &lt;- new _elem:type\n&quot;</span> <span id="L678" class="LineNr"> 678 </span> <span class="Constant">&quot;]\n&quot;</span> <span id="L679" class="LineNr"> 679 </span> <span class="Constant">&quot;def fooz [\n&quot;</span> <span id="L680" class="LineNr"> 680 </span> <span class="Constant">&quot; local-scope\n&quot;</span> <span id="L681" class="LineNr"> 681 </span> <span class="Constant">&quot; barz 34\n&quot;</span> <span id="L682" class="LineNr"> 682 </span> <span class="Constant">&quot;]\n&quot;</span><span class="Delimiter">);</span> <span id="L683" class="LineNr"> 683 </span> <span class="Comment">// ..and if you then try to load a new shape-shifting container with that</span> <span id="L684" class="LineNr"> 684 </span> <span class="Comment">// type-ingredient</span> <span id="L685" class="LineNr"> 685 </span> run<span class="Delimiter">(</span><span class="Constant">&quot;container foo:_elem [\n&quot;</span> <span id="L686" class="LineNr"> 686 </span> <span class="Constant">&quot; x:_elem\n&quot;</span> <span id="L687" class="LineNr"> 687 </span> <span class="Constant">&quot; y:num\n&quot;</span> <span id="L688" class="LineNr"> 688 </span> <span class="Constant">&quot;]\n&quot;</span><span class="Delimiter">);</span> <span id="L689" class="LineNr"> 689 </span> <span class="Comment">// then it should work as usual</span> <span id="L690" class="LineNr"> 690 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">&quot;x:foo:point&quot;</span><span class="Delimiter">);</span> <span id="L691" class="LineNr"> 691 </span> reagent element = <a href='030container.cc.html#L212'>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="L692" class="LineNr"> 692 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;x&quot;</span><span class="Delimiter">);</span> <span id="L693" class="LineNr"> 693 </span> <a href='002test.cc.html#L31'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">);</span> <span id="L694" class="LineNr"> 694 </span> <a href='002test.cc.html#L24'>CHECK</a><span class="Delimiter">(</span>!element<span class="Delimiter">.</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span> <span id="L695" class="LineNr"> 695 </span><span class="Delimiter">}</span> <span id="L696" class="LineNr"> 696 </span> <span id="L697" class="LineNr"> 697 </span><span class="Comment">//: specializing a type ingredient with a compound type</span> <span id="L698" class="LineNr"> 698 </span><span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types)</span> <span id="L699" class="LineNr"> 699 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L700" class="LineNr"> 700 </span> <span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">point:type</span> <span id="L701" class="LineNr"> 701 </span> *<span class="Constant">1</span>:&amp;:point<span class="Special"> &lt;- </span><a href='001help.cc.html#L221'>put</a> *<span class="Constant">1</span>:&amp;:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span><span class="Delimiter">,</span> <span class="Constant">34</span> <span id="L702" class="LineNr"> 702 </span> <span class="Constant">3</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:point <span class="Comment"># specialize _t to address:point</span> <span id="L703" class="LineNr"> 703 </span> <span class="Constant">5</span>:point<span class="Special"> &lt;- </span>copy *<span class="Constant">3</span>:&amp;:point <span id="L704" class="LineNr"> 704 </span>] <span id="L705" class="LineNr"> 705 </span><span class="muRecipe">def</span> bar a:_t<span class="muRecipe"> -&gt; </span>result:_t [ <span id="L706" class="LineNr"> 706 </span> local-scope <span id="L707" class="LineNr"> 707 </span> load-ingredients <span id="L708" class="LineNr"> 708 </span> result<span class="Special"> &lt;- </span>copy a <span id="L709" class="LineNr"> 709 </span>] <span id="L710" class="LineNr"> 710 </span><span class="traceContains">+mem: storing 34 in location 6</span> <span id="L711" class="LineNr"> 711 </span> <span id="L712" class="LineNr"> 712 </span><span class="Comment">//: specializing a type ingredient with a compound type -- while *inside* another compound type</span> <span id="L713" class="LineNr"> 713 </span><span class="Delimiter">:(scenario shape_shifting_recipe_supports_compound_types_2)</span> <span id="L714" class="LineNr"> 714 </span><span class="muData">container</span> foo:_t [ <span id="L715" class="LineNr"> 715 </span> <span class="Normal">value</span>:_t <span id="L716" class="LineNr"> 716 </span>] <span id="L717" class="LineNr"> 717 </span><span class="muRecipe">def</span> bar x:&amp;:foo:_t<span class="muRecipe"> -&gt; </span>result:_t [ <span id="L718" class="LineNr"> 718 </span> local-scope <span id="L719" class="LineNr"> 719 </span> load-ingredients <span id="L720" class="LineNr"> 720 </span> result<span class="Special"> &lt;- </span>get *x<span class="Delimiter">,</span> <span class="Constant">value:offset</span> <span id="L721" class="LineNr"> 721 </span>] <span id="L722" class="LineNr"> 722 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L723" class="LineNr"> 723 </span> <span class="Constant">1</span>:&amp;:foo:&amp;:point<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>foo <a href='043space.cc.html#L101'>address</a> point<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> <span id="L724" class="LineNr"> 724 </span> <span class="Constant">2</span>:&amp;:point<span class="Special"> &lt;- </span>bar <span class="Constant">1</span>:&amp;:foo:&amp;:point <span id="L725" class="LineNr"> 725 </span>] <span id="L726" class="LineNr"> 726 </span><span class="Comment"># no errors; call to 'bar' successfully specialized</span> <span id="L727" class="LineNr"> 727 </span> <span id="L728" class="LineNr"> 728 </span><span class="Delimiter">:(scenario shape_shifting_recipe_error)</span> <span id="L729" class="LineNr"> 729 </span><span class="Special">% Hide_errors = true;</span> <span id="L730" class="LineNr"> 730 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L731" class="LineNr"> 731 </span> <span class="Normal">a</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">3</span> <span id="L732" class="LineNr"> 732 </span> <span class="Normal">b</span>:&amp;:num<span class="Special"> &lt;- </span>foo a <span id="L733" class="LineNr"> 733 </span>] <span id="L734" class="LineNr"> 734 </span><span class="muRecipe">def</span> foo a:_t<span class="muRecipe"> -&gt; </span>b:_t [ <span id="L735" class="LineNr"> 735 </span> load-ingredients <span id="L736" class="LineNr"> 736 </span> b<span class="Special"> &lt;- </span>copy a <span id="L737" class="LineNr"> 737 </span>] <span id="L738" class="LineNr"> 738 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: no call found for 'b:&amp;:num &lt;- foo a'</span> <span id="L739" class="LineNr"> 739 </span> <span id="L740" class="LineNr"> 740 </span><span class="Delimiter">:(scenario specialize_inside_recipe_without_header)</span> <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> foo <span class="Constant">3</span> <span id="L743" class="LineNr"> 743 </span>] <span id="L744" class="LineNr"> 744 </span><span class="muRecipe">def</span> foo [ <span id="L745" class="LineNr"> 745 </span> local-scope <span id="L746" class="LineNr"> 746 </span> <span class="Normal">x</span>:num<span class="Special"> &lt;- </span>next-ingredient <span class="Comment"># ensure no header</span> <span id="L747" class="LineNr"> 747 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>bar x <span class="Comment"># call a shape-shifting recipe</span> <span id="L748" class="LineNr"> 748 </span>] <span id="L749" class="LineNr"> 749 </span><span class="muRecipe">def</span> bar x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [ <span id="L750" class="LineNr"> 750 </span> local-scope <span id="L751" class="LineNr"> 751 </span> load-ingredients <span id="L752" class="LineNr"> 752 </span> y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L753" class="LineNr"> 753 </span>] <span id="L754" class="LineNr"> 754 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L755" class="LineNr"> 755 </span> <span id="L756" class="LineNr"> 756 </span><span class="Delimiter">:(scenario specialize_with_literal)</span> <span id="L757" class="LineNr"> 757 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L758" class="LineNr"> 758 </span> local-scope <span id="L759" class="LineNr"> 759 </span> <span class="Comment"># permit literal to map to number</span> <span id="L760" class="LineNr"> 760 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span> <span id="L761" class="LineNr"> 761 </span>] <span id="L762" class="LineNr"> 762 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [ <span id="L763" class="LineNr"> 763 </span> local-scope <span id="L764" class="LineNr"> 764 </span> load-ingredients <span id="L765" class="LineNr"> 765 </span> y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L766" class="LineNr"> 766 </span>] <span id="L767" class="LineNr"> 767 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L768" class="LineNr"> 768 </span> <span id="L769" class="LineNr"> 769 </span><span class="Delimiter">:(scenario specialize_with_literal_2)</span> <span id="L770" class="LineNr"> 770 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L771" class="LineNr"> 771 </span> local-scope <span id="L772" class="LineNr"> 772 </span> <span class="Comment"># permit literal to map to character</span> <span id="L773" class="LineNr"> 773 </span> <span class="Constant">1</span>:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo <span class="Constant">3</span> <span id="L774" class="LineNr"> 774 </span>] <span id="L775" class="LineNr"> 775 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:_elem [ <span id="L776" class="LineNr"> 776 </span> local-scope <span id="L777" class="LineNr"> 777 </span> load-ingredients <span id="L778" class="LineNr"> 778 </span> y<span class="Special"> &lt;- </span>add x<span class="Delimiter">,</span> <span class="Constant">1</span> <span id="L779" class="LineNr"> 779 </span>] <span id="L780" class="LineNr"> 780 </span><span class="traceContains">+mem: storing 4 in location 1</span> <span id="L781" class="LineNr"> 781 </span> <span id="L782" class="LineNr"> 782 </span><span class="Delimiter">:(scenario specialize_with_literal_3)</span> <span id="L783" class="LineNr"> 783 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L784" class="LineNr"> 784 </span> local-scope <span id="L785" class="LineNr"> 785 </span> <span class="Comment"># permit '0' to map to address to shape-shifting type-ingredient</span> <span id="L786" class="LineNr"> 786 </span> <span class="Constant">1</span>:&amp;:<span class="Normal">char</span>/<span class="Special">raw &lt;- </span>foo<span class="Constant"> null</span> <span id="L787" class="LineNr"> 787 </span>] <span id="L788" class="LineNr"> 788 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [ <span id="L789" class="LineNr"> 789 </span> local-scope <span id="L790" class="LineNr"> 790 </span> load-ingredients <span id="L791" class="LineNr"> 791 </span> y<span class="Special"> &lt;- </span>copy x <span id="L792" class="LineNr"> 792 </span>] <span id="L793" class="LineNr"> 793 </span><span class="traceContains">+mem: storing 0 in location 1</span> <span id="L794" class="LineNr"> 794 </span>$error: <span class="Constant">0</span> <span id="L795" class="LineNr"> 795 </span> <span id="L796" class="LineNr"> 796 </span><span class="Delimiter">:(scenario specialize_with_literal_4)</span> <span id="L797" class="LineNr"> 797 </span><span class="Special">% Hide_errors = true;</span> <span id="L798" class="LineNr"> 798 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L799" class="LineNr"> 799 </span> local-scope <span id="L800" class="LineNr"> 800 </span> <span class="Comment"># ambiguous call: what's the type of its ingredient?!</span> <span id="L801" class="LineNr"> 801 </span> foo <span class="Constant">0</span> <span id="L802" class="LineNr"> 802 </span>] <span id="L803" class="LineNr"> 803 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:&amp;:_elem [ <span id="L804" class="LineNr"> 804 </span> local-scope <span id="L805" class="LineNr"> 805 </span> load-ingredients <span id="L806" class="LineNr"> 806 </span> y<span class="Special"> &lt;- </span>copy x <span id="L807" class="LineNr"> 807 </span>] <span id="L808" class="LineNr"> 808 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L33'>instruction</a> 'foo' has no valid specialization</span> <span id="L809" class="LineNr"> 809 </span> <span id="L810" class="LineNr"> 810 </span><span class="Delimiter">:(scenario specialize_with_literal_5)</span> <span id="L811" class="LineNr"> 811 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L812" class="LineNr"> 812 </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="L813" class="LineNr"> 813 </span>] <span id="L814" class="LineNr"> 814 </span><span class="muRecipe">def</span> foo x:_elem<span class="Delimiter">,</span> y:_elem [ <span id="L815" class="LineNr"> 815 </span> local-scope <span id="L816" class="LineNr"> 816 </span> load-ingredients <span id="L817" class="LineNr"> 817 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>add x<span class="Delimiter">,</span> y <span id="L818" class="LineNr"> 818 </span>] <span id="L819" class="LineNr"> 819 </span><span class="traceContains">+mem: storing 7 in location 1</span> <span id="L820" class="LineNr"> 820 </span> <span id="L821" class="LineNr"> 821 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants)</span> <span id="L822" class="LineNr"> 822 </span><span class="Comment"># try to call two different shape-shifting recipes with the same name</span> <span id="L823" class="LineNr"> 823 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L824" class="LineNr"> 824 </span> <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span> <span id="L825" class="LineNr"> 825 </span> <span class="Normal">e2</span>:d2:num<span class="Special"> &lt;- </span>merge <span class="Constant">4</span><span class="Delimiter">,</span> <span class="Constant">5</span> <span id="L826" class="LineNr"> 826 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1 <span id="L827" class="LineNr"> 827 </span> <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo e2 <span id="L828" class="LineNr"> 828 </span>] <span id="L829" class="LineNr"> 829 </span><span class="Comment"># the two shape-shifting definitions</span> <span id="L830" class="LineNr"> 830 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [ <span id="L831" class="LineNr"> 831 </span> local-scope <span id="L832" class="LineNr"> 832 </span> load-ingredients <span id="L833" class="LineNr"> 833 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L834" class="LineNr"> 834 </span>] <span id="L835" class="LineNr"> 835 </span><span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [ <span id="L836" class="LineNr"> 836 </span> local-scope <span id="L837" class="LineNr"> 837 </span> load-ingredients <span id="L838" class="LineNr"> 838 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L839" class="LineNr"> 839 </span>] <span id="L840" class="LineNr"> 840 </span><span class="Comment"># the shape-shifting containers they use</span> <span id="L841" class="LineNr"> 841 </span><span class="muData">container</span> d1:_elem [ <span id="L842" class="LineNr"> 842 </span> <span class="Normal">x</span>:_elem <span id="L843" class="LineNr"> 843 </span>] <span id="L844" class="LineNr"> 844 </span><span class="muData">container</span> d2:_elem [ <span id="L845" class="LineNr"> 845 </span> <span class="Normal">x</span>:num <span id="L846" class="LineNr"> 846 </span> <span class="Normal">y</span>:_elem <span id="L847" class="LineNr"> 847 </span>] <span id="L848" class="LineNr"> 848 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L849" class="LineNr"> 849 </span><span class="traceContains">+mem: storing 35 in location 2</span> <span id="L850" class="LineNr"> 850 </span> <span id="L851" class="LineNr"> 851 </span><span class="Delimiter">:(scenario multiple_shape_shifting_variants_2)</span> <span id="L852" class="LineNr"> 852 </span><span class="Comment"># static dispatch between shape-shifting variants, _including pointer lookups_</span> <span id="L853" class="LineNr"> 853 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L854" class="LineNr"> 854 </span> <span class="Normal">e1</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span> <span id="L855" class="LineNr"> 855 </span> <span class="Normal">e2</span>:&amp;:d2:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Delimiter">{(</span>d2 number<span class="Delimiter">)</span>: type<span class="Delimiter">}</span> <span id="L856" class="LineNr"> 856 </span> <span class="Constant">1</span>:num/<span class="Special">raw &lt;- </span>foo e1 <span id="L857" class="LineNr"> 857 </span> <span class="Constant">2</span>:num/<span class="Special">raw &lt;- </span>foo *e2 <span class="Comment"># different from previous scenario</span> <span id="L858" class="LineNr"> 858 </span>] <span id="L859" class="LineNr"> 859 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [ <span id="L860" class="LineNr"> 860 </span> local-scope <span id="L861" class="LineNr"> 861 </span> load-ingredients <span id="L862" class="LineNr"> 862 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L863" class="LineNr"> 863 </span>] <span id="L864" class="LineNr"> 864 </span><span class="muRecipe">def</span> foo a:d2:_elem<span class="muRecipe"> -&gt; </span>b:num [ <span id="L865" class="LineNr"> 865 </span> local-scope <span id="L866" class="LineNr"> 866 </span> load-ingredients <span id="L867" class="LineNr"> 867 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L868" class="LineNr"> 868 </span>] <span id="L869" class="LineNr"> 869 </span><span class="muData">container</span> d1:_elem [ <span id="L870" class="LineNr"> 870 </span> <span class="Normal">x</span>:_elem <span id="L871" class="LineNr"> 871 </span>] <span id="L872" class="LineNr"> 872 </span><span class="muData">container</span> d2:_elem [ <span id="L873" class="LineNr"> 873 </span> <span class="Normal">x</span>:num <span id="L874" class="LineNr"> 874 </span> <span class="Normal">y</span>:_elem <span id="L875" class="LineNr"> 875 </span>] <span id="L876" class="LineNr"> 876 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L877" class="LineNr"> 877 </span><span class="traceContains">+mem: storing 35 in location 2</span> <span id="L878" class="LineNr"> 878 </span> <span id="L879" class="LineNr"> 879 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe)</span> <span id="L880" class="LineNr"> 880 </span><span class="Special">% Hide_errors = true;</span> <span id="L881" class="LineNr"> 881 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L882" class="LineNr"> 882 </span> <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span> <span id="L883" class="LineNr"> 883 </span> foo a <span id="L884" class="LineNr"> 884 </span>] <span id="L885" class="LineNr"> 885 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [ <span id="L886" class="LineNr"> 886 </span> local-scope <span id="L887" class="LineNr"> 887 </span> load-ingredients <span id="L888" class="LineNr"> 888 </span> copy e <span class="Comment"># no such variable</span> <span id="L889" class="LineNr"> 889 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L890" class="LineNr"> 890 </span>] <span id="L891" class="LineNr"> 891 </span><span class="muData">container</span> d1:_elem [ <span id="L892" class="LineNr"> 892 </span> <span class="Normal">x</span>:_elem <span id="L893" class="LineNr"> 893 </span>] <span id="L894" class="LineNr"> 894 </span><span class="traceContains">+error: foo: unknown type for 'e' in 'copy e' (check the name for typos)</span> <span id="L895" class="LineNr"> 895 </span><span class="traceContains">+error: specializing foo: missing type for 'e'</span> <span id="L896" class="LineNr"> 896 </span><span class="Comment"># and it doesn't crash</span> <span id="L897" class="LineNr"> 897 </span> <span id="L898" class="LineNr"> 898 </span><span class="Delimiter">:(scenario missing_type_in_shape_shifting_recipe_2)</span> <span id="L899" class="LineNr"> 899 </span><span class="Special">% Hide_errors = true;</span> <span id="L900" class="LineNr"> 900 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L901" class="LineNr"> 901 </span> <span class="Normal">a</span>:d1:num<span class="Special"> &lt;- </span>merge <span class="Constant">3</span> <span id="L902" class="LineNr"> 902 </span> foo a <span id="L903" class="LineNr"> 903 </span>] <span id="L904" class="LineNr"> 904 </span><span class="muRecipe">def</span> foo a:d1:_elem<span class="muRecipe"> -&gt; </span>b:num [ <span id="L905" class="LineNr"> 905 </span> local-scope <span id="L906" class="LineNr"> 906 </span> load-ingredients <span id="L907" class="LineNr"> 907 </span> get e<span class="Delimiter">,</span> <span class="Constant">x:offset</span> <span class="Comment"># unknown variable in a 'get', which does some extra checking</span> <span id="L908" class="LineNr"> 908 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L909" class="LineNr"> 909 </span>] <span id="L910" class="LineNr"> 910 </span><span class="muData">container</span> d1:_elem [ <span id="L911" class="LineNr"> 911 </span> <span class="Normal">x</span>:_elem <span id="L912" class="LineNr"> 912 </span>] <span id="L913" class="LineNr"> 913 </span><span class="traceContains">+error: foo: unknown type for 'e' in 'get e, x:offset' (check the name for typos)</span> <span id="L914" class="LineNr"> 914 </span><span class="traceContains">+error: specializing foo: missing type for 'e'</span> <span id="L915" class="LineNr"> 915 </span><span class="Comment"># and it doesn't crash</span> <span id="L916" class="LineNr"> 916 </span> <span id="L917" class="LineNr"> 917 </span><span class="Delimiter">:(scenarios transform)</span> <span id="L918" class="LineNr"> 918 </span><span class="Delimiter">:(scenario specialize_recursive_shape_shifting_recipe)</span> <span id="L919" class="LineNr"> 919 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L920" class="LineNr"> 920 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L921" class="LineNr"> 921 </span> <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:num <span id="L922" class="LineNr"> 922 </span>] <span id="L923" class="LineNr"> 923 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [ <span id="L924" class="LineNr"> 924 </span> local-scope <span id="L925" class="LineNr"> 925 </span> load-ingredients <span id="L926" class="LineNr"> 926 </span> <span class="Delimiter">{</span> <span id="L927" class="LineNr"> 927 </span> <span class="Identifier">break</span> <span id="L928" class="LineNr"> 928 </span> <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>foo x <span id="L929" class="LineNr"> 929 </span> <span class="Delimiter">}</span> <span id="L930" class="LineNr"> 930 </span> <span class="Identifier">return</span> y <span id="L931" class="LineNr"> 931 </span>] <span id="L932" class="LineNr"> 932 </span><span class="traceContains">+transform: new specialization: foo_2</span> <span id="L933" class="LineNr"> 933 </span><span class="Comment"># transform terminates</span> <span id="L934" class="LineNr"> 934 </span> <span id="L935" class="LineNr"> 935 </span><span class="Delimiter">:(scenarios run)</span> <span id="L936" class="LineNr"> 936 </span><span class="Delimiter">:(scenario specialize_most_similar_variant)</span> <span id="L937" class="LineNr"> 937 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L938" class="LineNr"> 938 </span> <span class="Constant">1</span>:&amp;:num<span class="Special"> &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span> <span id="L939" class="LineNr"> 939 </span> <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">1</span>:&amp;:num <span id="L940" class="LineNr"> 940 </span>] <span id="L941" class="LineNr"> 941 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [ <span id="L942" class="LineNr"> 942 </span> local-scope <span id="L943" class="LineNr"> 943 </span> load-ingredients <span id="L944" class="LineNr"> 944 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L945" class="LineNr"> 945 </span>] <span id="L946" class="LineNr"> 946 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [ <span id="L947" class="LineNr"> 947 </span> local-scope <span id="L948" class="LineNr"> 948 </span> load-ingredients <span id="L949" class="LineNr"> 949 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L950" class="LineNr"> 950 </span>] <span id="L951" class="LineNr"> 951 </span><span class="traceContains">+mem: storing 35 in location 10</span> <span id="L952" class="LineNr"> 952 </span> <span id="L953" class="LineNr"> 953 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_2)</span> <span id="L954" class="LineNr"> 954 </span><span class="Comment"># version with headers padded with lots of unrelated concrete types</span> <span id="L955" class="LineNr"> 955 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L956" class="LineNr"> 956 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">23</span> <span id="L957" class="LineNr"> 957 </span> <span class="Constant">2</span>:&amp;:@:num<span class="Special"> &lt;- </span>copy<span class="Constant"> null</span> <span id="L958" class="LineNr"> 958 </span> <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">2</span>:&amp;:@:num<span class="Delimiter">,</span> <span class="Constant">1</span>:num <span id="L959" class="LineNr"> 959 </span>] <span id="L960" class="LineNr"> 960 </span><span class="Comment"># variant with concrete type</span> <span id="L961" class="LineNr"> 961 </span><span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:num<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [ <span id="L962" class="LineNr"> 962 </span> local-scope <span id="L963" class="LineNr"> 963 </span> load-ingredients <span id="L964" class="LineNr"> 964 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L965" class="LineNr"> 965 </span>] <span id="L966" class="LineNr"> 966 </span><span class="Comment"># shape-shifting variant</span> <span id="L967" class="LineNr"> 967 </span><span class="muRecipe">def</span> foo dummy:&amp;:@:num<span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>y:num<span class="Delimiter">,</span> dummy:&amp;:@:num [ <span id="L968" class="LineNr"> 968 </span> local-scope <span id="L969" class="LineNr"> 969 </span> load-ingredients <span id="L970" class="LineNr"> 970 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L971" class="LineNr"> 971 </span>] <span id="L972" class="LineNr"> 972 </span><span class="Comment"># prefer the concrete variant</span> <span id="L973" class="LineNr"> 973 </span><span class="traceContains">+mem: storing 34 in location 4</span> <span id="L974" class="LineNr"> 974 </span> <span id="L975" class="LineNr"> 975 </span><span class="Delimiter">:(scenario specialize_most_similar_variant_3)</span> <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>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc] <span id="L978" class="LineNr"> 978 </span> foo <span class="Constant">1</span>:text <span id="L979" class="LineNr"> 979 </span>] <span id="L980" class="LineNr"> 980 </span><span class="muRecipe">def</span> foo x:text [ <span id="L981" class="LineNr"> 981 </span> <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L982" class="LineNr"> 982 </span>] <span id="L983" class="LineNr"> 983 </span><span class="muRecipe">def</span> foo x:&amp;:_elem [ <span id="L984" class="LineNr"> 984 </span> <span class="Constant">10</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span> <span id="L985" class="LineNr"> 985 </span>] <span id="L986" class="LineNr"> 986 </span><span class="Comment"># make sure the more precise version was used</span> <span id="L987" class="LineNr"> 987 </span><span class="traceContains">+mem: storing 34 in location 10</span> <span id="L988" class="LineNr"> 988 </span> <span id="L989" class="LineNr"> 989 </span><span class="Delimiter">:(scenario specialize_literal_as_number)</span> <span id="L990" class="LineNr"> 990 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L991" class="LineNr"> 991 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">23</span> <span id="L992" class="LineNr"> 992 </span>] <span id="L993" class="LineNr"> 993 </span><span class="muRecipe">def</span> foo x:_elem<span class="muRecipe"> -&gt; </span>y:num [ <span id="L994" class="LineNr"> 994 </span> local-scope <span id="L995" class="LineNr"> 995 </span> load-ingredients <span id="L996" class="LineNr"> 996 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L997" class="LineNr"> 997 </span>] <span id="L998" class="LineNr"> 998 </span><span class="muRecipe">def</span> foo x:<span class="Normal">char</span><span class="muRecipe"> -&gt; </span>y:num [ <span id="L999" class="LineNr"> 999 </span> local-scope <span id="L1000" class="LineNr">1000 </span> load-ingredients <span id="L1001" class="LineNr">1001 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L1002" class="LineNr">1002 </span>] <span id="L1003" class="LineNr">1003 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L1004" class="LineNr">1004 </span> <span id="L1005" class="LineNr">1005 </span><span class="Delimiter">:(scenario specialize_literal_as_number_2)</span> <span id="L1006" class="LineNr">1006 </span><span class="Comment"># version calling with literal</span> <span id="L1007" class="LineNr">1007 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1008" class="LineNr">1008 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo <span class="Constant">0</span> <span id="L1009" class="LineNr">1009 </span>] <span id="L1010" class="LineNr">1010 </span><span class="Comment"># variant with concrete type</span> <span id="L1011" class="LineNr">1011 </span><span class="muRecipe">def</span> foo x:num<span class="muRecipe"> -&gt; </span>y:num [ <span id="L1012" class="LineNr">1012 </span> local-scope <span id="L1013" class="LineNr">1013 </span> load-ingredients <span id="L1014" class="LineNr">1014 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L1015" class="LineNr">1015 </span>] <span id="L1016" class="LineNr">1016 </span><span class="Comment"># shape-shifting variant</span> <span id="L1017" class="LineNr">1017 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [ <span id="L1018" class="LineNr">1018 </span> local-scope <span id="L1019" class="LineNr">1019 </span> load-ingredients <span id="L1020" class="LineNr">1020 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L1021" class="LineNr">1021 </span>] <span id="L1022" class="LineNr">1022 </span><span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span> <span id="L1023" class="LineNr">1023 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L1024" class="LineNr">1024 </span> <span id="L1025" class="LineNr">1025 </span><span class="Delimiter">:(scenario specialize_literal_as_address)</span> <span id="L1026" class="LineNr">1026 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1027" class="LineNr">1027 </span> <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>foo<span class="Constant"> null</span> <span id="L1028" class="LineNr">1028 </span>] <span id="L1029" class="LineNr">1029 </span><span class="Comment"># variant with concrete address type</span> <span id="L1030" class="LineNr">1030 </span><span class="muRecipe">def</span> foo x:&amp;:num<span class="muRecipe"> -&gt; </span>y:num [ <span id="L1031" class="LineNr">1031 </span> local-scope <span id="L1032" class="LineNr">1032 </span> load-ingredients <span id="L1033" class="LineNr">1033 </span> <span class="Identifier">return</span> <span class="Constant">34</span> <span id="L1034" class="LineNr">1034 </span>] <span id="L1035" class="LineNr">1035 </span><span class="Comment"># shape-shifting variant</span> <span id="L1036" class="LineNr">1036 </span><span class="muRecipe">def</span> foo x:&amp;:_elem<span class="muRecipe"> -&gt; </span>y:num [ <span id="L1037" class="LineNr">1037 </span> local-scope <span id="L1038" class="LineNr">1038 </span> load-ingredients <span id="L1039" class="LineNr">1039 </span> <span class="Identifier">return</span> <span class="Constant">35</span> <span id="L1040" class="LineNr">1040 </span>] <span id="L1041" class="LineNr">1041 </span><span class="Comment"># prefer the concrete variant, ignore concrete types in scoring the shape-shifting variant</span> <span id="L1042" class="LineNr">1042 </span><span class="traceContains">+mem: storing 34 in location 1</span> <span id="L1043" class="LineNr">1043 </span> <span id="L1044" class="LineNr">1044 </span><span class="Delimiter">:(scenario missing_type_during_specialization)</span> <span id="L1045" class="LineNr">1045 </span><span class="Special">% Hide_errors = true;</span> <span id="L1046" class="LineNr">1046 </span><span class="Comment"># define a shape-shifting recipe</span> <span id="L1047" class="LineNr">1047 </span><span class="muRecipe">def</span> foo a:_elem [ <span id="L1048" class="LineNr">1048 </span>] <span id="L1049" class="LineNr">1049 </span><span class="Comment"># define a container with field 'z'</span> <span id="L1050" class="LineNr">1050 </span><span class="muData">container</span> foo2 [ <span id="L1051" class="LineNr">1051 </span> <span class="Normal">z</span>:num <span id="L1052" class="LineNr">1052 </span>] <span id="L1053" class="LineNr">1053 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1054" class="LineNr">1054 </span> local-scope <span id="L1055" class="LineNr">1055 </span> <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span> <span id="L1056" class="LineNr">1056 </span> <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse <span class="Comment"># typo in 'offset'</span> <span id="L1057" class="LineNr">1057 </span> <span class="Comment"># define a variable with the same name 'z'</span> <span id="L1058" class="LineNr">1058 </span> <span class="Normal">z</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L1059" class="LineNr">1059 </span> <span class="Comment"># trigger specialization of the shape-shifting recipe</span> <span id="L1060" class="LineNr">1060 </span> foo z <span id="L1061" class="LineNr">1061 </span>] <span id="L1062" class="LineNr">1062 </span><span class="Comment"># shouldn't crash</span> <span id="L1063" class="LineNr">1063 </span> <span id="L1064" class="LineNr">1064 </span><span class="Delimiter">:(scenario missing_type_during_specialization2)</span> <span id="L1065" class="LineNr">1065 </span><span class="Special">% Hide_errors = true;</span> <span id="L1066" class="LineNr">1066 </span><span class="Comment"># define a shape-shifting recipe</span> <span id="L1067" class="LineNr">1067 </span><span class="muRecipe">def</span> foo a:_elem [ <span id="L1068" class="LineNr">1068 </span>] <span id="L1069" class="LineNr">1069 </span><span class="Comment"># define a container with field 'z'</span> <span id="L1070" class="LineNr">1070 </span><span class="muData">container</span> foo2 [ <span id="L1071" class="LineNr">1071 </span> <span class="Normal">z</span>:num <span id="L1072" class="LineNr">1072 </span>] <span id="L1073" class="LineNr">1073 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1074" class="LineNr">1074 </span> local-scope <span id="L1075" class="LineNr">1075 </span> <span class="Normal">x</span>:foo2<span class="Special"> &lt;- </span>merge <span class="Constant">34</span> <span id="L1076" class="LineNr">1076 </span> <span class="Normal">y</span>:num<span class="Special"> &lt;- </span>get x<span class="Delimiter">,</span> z:offse <span class="Comment"># typo in 'offset'</span> <span id="L1077" class="LineNr">1077 </span> <span class="Comment"># define a variable with the same name 'z'</span> <span id="L1078" class="LineNr">1078 </span> <span class="Normal">z</span>:&amp;:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span> <span id="L1079" class="LineNr">1079 </span> <span class="Comment"># trigger specialization of the shape-shifting recipe</span> <span id="L1080" class="LineNr">1080 </span> foo *z <span id="L1081" class="LineNr">1081 </span>] <span id="L1082" class="LineNr">1082 </span><span class="Comment"># shouldn't crash</span> <span id="L1083" class="LineNr">1083 </span> <span id="L1084" class="LineNr">1084 </span><span class="Delimiter">:(scenario tangle_shape_shifting_recipe)</span> <span id="L1085" class="LineNr">1085 </span><span class="Comment"># shape-shifting recipe</span> <span id="L1086" class="LineNr">1086 </span><span class="muRecipe">def</span> foo a:_elem [ <span id="L1087" class="LineNr">1087 </span> local-scope <span id="L1088" class="LineNr">1088 </span> load-ingredients <span id="L1089" class="LineNr">1089 </span> &lt;label1&gt; <span id="L1090" class="LineNr">1090 </span>] <span id="L1091" class="LineNr">1091 </span><span class="Comment"># tangle some code that refers to the type ingredient</span> <span id="L1092" class="LineNr">1092 </span><span class="muRecipe">after</span> &lt;label1&gt; [ <span id="L1093" class="LineNr">1093 </span> <span class="Normal">b</span>:_elem<span class="Special"> &lt;- </span>copy a <span id="L1094" class="LineNr">1094 </span>] <span id="L1095" class="LineNr">1095 </span><span class="Comment"># trigger specialization</span> <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> local-scope <span id="L1098" class="LineNr">1098 </span> foo <span class="Constant">34</span> <span id="L1099" class="LineNr">1099 </span>] <span id="L1100" class="LineNr">1100 </span>$error: <span class="Constant">0</span> <span id="L1101" class="LineNr">1101 </span> <span id="L1102" class="LineNr">1102 </span><span class="Delimiter">:(scenario tangle_shape_shifting_recipe_with_type_abbreviation)</span> <span id="L1103" class="LineNr">1103 </span><span class="Comment"># shape-shifting recipe</span> <span id="L1104" class="LineNr">1104 </span><span class="muRecipe">def</span> foo a:_elem [ <span id="L1105" class="LineNr">1105 </span> local-scope <span id="L1106" class="LineNr">1106 </span> load-ingredients <span id="L1107" class="LineNr">1107 </span> &lt;label1&gt; <span id="L1108" class="LineNr">1108 </span>] <span id="L1109" class="LineNr">1109 </span><span class="Comment"># tangle some code that refers to the type ingredient</span> <span id="L1110" class="LineNr">1110 </span><span class="muRecipe">after</span> &lt;label1&gt; [ <span id="L1111" class="LineNr">1111 </span> <span class="Normal">b</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>copy<span class="Constant"> false</span> <span class="Comment"># type abbreviation</span> <span id="L1112" class="LineNr">1112 </span>] <span id="L1113" class="LineNr">1113 </span><span class="Comment"># trigger specialization</span> <span id="L1114" class="LineNr">1114 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1115" class="LineNr">1115 </span> local-scope <span id="L1116" class="LineNr">1116 </span> foo <span class="Constant">34</span> <span id="L1117" class="LineNr">1117 </span>] <span id="L1118" class="LineNr">1118 </span>$error: <span class="Constant">0</span> <span id="L1119" class="LineNr">1119 </span> <span id="L1120" class="LineNr">1120 </span><span class="Delimiter">:(scenario shape_shifting_recipe_coexists_with_primitive)</span> <span id="L1121" class="LineNr">1121 </span><span class="Comment"># recipe overloading a primitive with a generic type</span> <span id="L1122" class="LineNr">1122 </span><span class="muRecipe">def</span> add a:&amp;:foo:_elem [ <span id="L1123" class="LineNr">1123 </span> assert <span class="Constant">0</span><span class="Delimiter">,</span> [should <span class="Normal">not</span> get here] <span id="L1124" class="LineNr">1124 </span>] <span id="L1125" class="LineNr">1125 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1126" class="LineNr">1126 </span> <span class="Comment"># call primitive add with literal 0</span> <span id="L1127" class="LineNr">1127 </span> add <span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">0</span> <span id="L1128" class="LineNr">1128 </span>] <span id="L1129" class="LineNr">1129 </span>$error: <span class="Constant">0</span> <span id="L1130" class="LineNr">1130 </span> <span id="L1131" class="LineNr">1131 </span><span class="Delimiter">:(scenario specialization_heuristic_test_1)</span> <span id="L1132" class="LineNr">1132 </span><span class="Comment"># modeled on the 'buffer' container in text.mu</span> <span id="L1133" class="LineNr">1133 </span><span class="muData">container</span> foo_buffer:_elem [ <span id="L1134" class="LineNr">1134 </span> <span class="Normal">x</span>:num <span id="L1135" class="LineNr">1135 </span>] <span id="L1136" class="LineNr">1136 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L1137" class="LineNr">1137 </span> append <span class="Constant">1</span>:&amp;:foo_buffer:<span class="Normal">char</span>/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2</span>:text/<span class="Special">raw</span> <span id="L1138" class="LineNr">1138 </span>] <span id="L1139" class="LineNr">1139 </span><span class="muRecipe">def</span> append buf:&amp;:foo_buffer:_elem<span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:foo_buffer:_elem [ <span id="L1140" class="LineNr">1140 </span> local-scope <span id="L1141" class="LineNr">1141 </span> load-ingredients <span id="L1142" class="LineNr">1142 </span> stash <span class="Constant">34</span> <span id="L1143" class="LineNr">1143 </span>] <span id="L1144" class="LineNr">1144 </span><span class="muRecipe">def</span> append buf:&amp;:foo_buffer:<span class="Normal">char</span><span class="Delimiter">,</span> x:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:foo_buffer:<span class="Normal">char</span> [ <span id="L1145" class="LineNr">1145 </span> local-scope <span id="L1146" class="LineNr">1146 </span> load-ingredients <span id="L1147" class="LineNr">1147 </span> stash <span class="Constant">35</span> <span id="L1148" class="LineNr">1148 </span>] <span id="L1149" class="LineNr">1149 </span><span class="muRecipe">def</span> append buf:&amp;:foo_buffer:_elem<span class="Delimiter">,</span> x:&amp;:@:_elem<span class="muRecipe"> -&gt; </span>buf:&amp;:foo_buffer:_elem [ <span id="L1150" class="LineNr">1150 </span> local-scope <span id="L1151" class="LineNr">1151 </span> load-ingredients <span id="L1152" class="LineNr">1152 </span> stash <span class="Constant">36</span> <span id="L1153" class="LineNr">1153 </span>] <span id="L1154" class="LineNr">1154 </span><span class="traceContains">+app: 36</span> </pre> </body> </html> <!-- vim: set foldmethod=manual : -->