about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/array_length2
-rw-r--r--cpp/.traces/assert10
-rw-r--r--cpp/.traces/brace_conversion2
-rw-r--r--cpp/.traces/brace_conversion_and_run4
-rw-r--r--cpp/.traces/break_cascading4
-rw-r--r--cpp/.traces/break_cascading24
-rw-r--r--cpp/.traces/break_empty_block2
-rw-r--r--cpp/.traces/break_if4
-rw-r--r--cpp/.traces/break_label2
-rw-r--r--cpp/.traces/break_nested2
-rw-r--r--cpp/.traces/break_nested_degenerate2
-rw-r--r--cpp/.traces/break_nested_degenerate22
-rw-r--r--cpp/.traces/break_unless2
-rw-r--r--cpp/.traces/buffer-append-works10
-rw-r--r--cpp/.traces/channel-initialization4
-rw-r--r--cpp/.traces/channel-read-increments-full4
-rw-r--r--cpp/.traces/channel-wrap8
-rw-r--r--cpp/.traces/channel-write-increments-free4
-rw-r--r--cpp/.traces/closure12
-rw-r--r--cpp/.traces/convert_names_transforms_container_elements4
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_get2
-rw-r--r--cpp/.traces/deref_sidesteps_default_space_in_index2
-rw-r--r--cpp/.traces/get2
-rw-r--r--cpp/.traces/get_address2
-rw-r--r--cpp/.traces/get_address_indirect2
-rw-r--r--cpp/.traces/get_handles_nested_container_elements2
-rw-r--r--cpp/.traces/get_indirect2
-rw-r--r--cpp/.traces/include_nonderef_properties2
-rw-r--r--cpp/.traces/index2
-rw-r--r--cpp/.traces/index_address2
-rw-r--r--cpp/.traces/index_direct_offset2
-rw-r--r--cpp/.traces/index_indirect2
-rw-r--r--cpp/.traces/ingredient4
-rw-r--r--cpp/.traces/interpolate-at-end4
-rw-r--r--cpp/.traces/interpolate-at-start4
-rw-r--r--cpp/.traces/interpolate-works4
-rw-r--r--cpp/.traces/loop2
-rw-r--r--cpp/.traces/loop_nested2
-rw-r--r--cpp/.traces/loop_unless2
-rw-r--r--cpp/.traces/maybe_convert2
-rw-r--r--cpp/.traces/maybe_convert_fail2
-rw-r--r--cpp/.traces/maybe_convert_named2
-rw-r--r--cpp/.traces/new4
-rw-r--r--cpp/.traces/new_array4
-rw-r--r--cpp/.traces/new_concurrent6
-rw-r--r--cpp/.traces/new_overflow4
-rw-r--r--cpp/.traces/new_string4
-rw-r--r--cpp/.traces/next_ingredient2
-rw-r--r--cpp/.traces/next_ingredient_missing2
-rw-r--r--cpp/.traces/reply4
-rw-r--r--cpp/.traces/reply_container4
-rw-r--r--cpp/.traces/reply_same_as_ingredient6
-rw-r--r--cpp/.traces/rewind_ingredients6
-rw-r--r--cpp/.traces/scheduler2
-rw-r--r--cpp/.traces/scheduler_interleaves_routines2
-rw-r--r--cpp/.traces/string-append-14
-rw-r--r--cpp/.traces/string-equal-common-lengths-but-distinct6
-rw-r--r--cpp/.traces/string-equal-distinct-lengths6
-rw-r--r--cpp/.traces/string-equal-identical6
-rw-r--r--cpp/.traces/string-equal-reflexive4
-rw-r--r--cpp/.traces/string-equal-with-empty6
-rw-r--r--cpp/.traces/string_literal2
-rw-r--r--cpp/.traces/string_literal_nested2
-rw-r--r--cpp/.traces/string_literal_with_colons2
-rw-r--r--cpp/.traces/wait_for_location4
-rw-r--r--cpp/026assert.cc20
66 files changed, 141 insertions, 111 deletions
diff --git a/cpp/.traces/array_length b/cpp/.traces/array_length
index 1c08d765..c42d8aa0 100644
--- a/cpp/.traces/array_length
+++ b/cpp/.traces/array_length
@@ -10,7 +10,7 @@ parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 23
+parse/0: instruction: 24
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/assert b/cpp/.traces/assert
new file mode 100644
index 00000000..78fcb823
--- /dev/null
+++ b/cpp/.traces/assert
@@ -0,0 +1,10 @@
+parse/0: instruction: 19
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   ingredient: {name: "this is an assert in mu", value: 0, type: 0, properties: ["this is an assert in mu": "literal-string"]}
+after-brace/0: recipe main
+after-brace/0: assert ...
+new/0: routine allocated memory from 1000 to 101000
+schedule/0: main
+run/0: instruction main/0
+run/0: ingredient 0 is 0
+warn/0: this is an assert in mu
diff --git a/cpp/.traces/brace_conversion b/cpp/.traces/brace_conversion
index e1852440..639751a8 100644
--- a/cpp/.traces/brace_conversion
+++ b/cpp/.traces/brace_conversion
@@ -1,5 +1,5 @@
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/brace_conversion_and_run b/cpp/.traces/brace_conversion_and_run
index 78844009..65b150b9 100644
--- a/cpp/.traces/brace_conversion_and_run
+++ b/cpp/.traces/brace_conversion_and_run
@@ -9,7 +9,7 @@ parse/0: instruction: 13
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]}
-parse/0: instruction: 32
+parse/0: instruction: 33
 parse/0:   ingredient: {name: "3", value: 0, type: 3, properties: ["3": "boolean"]}
 parse/0: instruction: 4
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
@@ -19,7 +19,7 @@ parse/0: instruction: 3
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 34
+parse/0: instruction: 35
 parse/0: label: }
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/break_cascading b/cpp/.traces/break_cascading
index be0dcb75..7cabc61b 100644
--- a/cpp/.traces/break_cascading
+++ b/cpp/.traces/break_cascading
@@ -2,10 +2,10 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: }
 brace/0: 1000: push (open, 1)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_cascading2 b/cpp/.traces/break_cascading2
index a4bf4668..76005d1c 100644
--- a/cpp/.traces/break_cascading2
+++ b/cpp/.traces/break_cascading2
@@ -5,13 +5,13 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/break_empty_block b/cpp/.traces/break_empty_block
index 5dc33d5f..1b752c4d 100644
--- a/cpp/.traces/break_empty_block
+++ b/cpp/.traces/break_empty_block
@@ -2,7 +2,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: }
 brace/0: 1000: push (open, 1)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_if b/cpp/.traces/break_if
index ba84c1bb..ad96ee07 100644
--- a/cpp/.traces/break_if
+++ b/cpp/.traces/break_if
@@ -5,14 +5,14 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 32
+parse/0: instruction: 33
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/break_label b/cpp/.traces/break_label
index 1f66321f..54cbc9a4 100644
--- a/cpp/.traces/break_label
+++ b/cpp/.traces/break_label
@@ -2,7 +2,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: label: {
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "+foo", value: 0, type: 0, properties: ["+foo": "offset"]}
 parse/0: label: }
 brace/0: 1000: push (open, 1)
diff --git a/cpp/.traces/break_nested b/cpp/.traces/break_nested
index 2879c48a..189b357e 100644
--- a/cpp/.traces/break_nested
+++ b/cpp/.traces/break_nested
@@ -5,7 +5,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/break_nested_degenerate b/cpp/.traces/break_nested_degenerate
index d451959f..5dbbdacb 100644
--- a/cpp/.traces/break_nested_degenerate
+++ b/cpp/.traces/break_nested_degenerate
@@ -5,7 +5,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: {
 parse/0: label: }
 parse/0: instruction: 1
diff --git a/cpp/.traces/break_nested_degenerate2 b/cpp/.traces/break_nested_degenerate2
index 47f21f34..63c761c4 100644
--- a/cpp/.traces/break_nested_degenerate2
+++ b/cpp/.traces/break_nested_degenerate2
@@ -5,7 +5,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0: label: {
 parse/0: label: }
 parse/0: label: }
diff --git a/cpp/.traces/break_unless b/cpp/.traces/break_unless
index 8557c249..ece4a491 100644
--- a/cpp/.traces/break_unless
+++ b/cpp/.traces/break_unless
@@ -5,7 +5,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 33
+parse/0: instruction: 34
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/buffer-append-works b/cpp/.traces/buffer-append-works
index dbd2345d..b7e64ecd 100644
--- a/cpp/.traces/buffer-append-works
+++ b/cpp/.traces/buffer-append-works
@@ -1,11 +1,11 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
 parse/0: instruction: 101
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
 parse/0:   product: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]}
@@ -21,7 +21,7 @@ parse/0: instruction: 104
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
 parse/0:   ingredient: {name: "99", value: 0, type: 0, properties: ["99": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
 parse/0:   product: {name: "s2", value: 0, type: 2-5-4, properties: ["s2": "address":"array":"character"]}
@@ -37,7 +37,7 @@ parse/0: instruction: 104
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
 parse/0:   ingredient: {name: "100", value: 0, type: 0, properties: ["100": "literal"]}
 parse/0:   product: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "data", value: 0, type: 0, properties: ["data": "offset"]}
 parse/0:   product: {name: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character"]}
@@ -45,7 +45,7 @@ parse/0: instruction: 13
 parse/0:   ingredient: {name: "s1", value: 0, type: 2-5-4, properties: ["s1": "address":"array":"character"]}
 parse/0:   ingredient: {name: "s3", value: 0, type: 2-5-4, properties: ["s3": "address":"array":"character"]}
 parse/0:   product: {name: "10", value: 0, type: 3, properties: ["10": "boolean", "raw": ]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "x", value: 0, type: 2-9, properties: ["x": "address":"buffer", "deref": ]}
 parse/0:   ingredient: {name: "length", value: 0, type: 0, properties: ["length": "offset"]}
 parse/0:   product: {name: "11", value: 0, type: 1, properties: ["11": "integer", "raw": ]}
diff --git a/cpp/.traces/channel-initialization b/cpp/.traces/channel-initialization
index 764f83ab..7b89ea19 100644
--- a/cpp/.traces/channel-initialization
+++ b/cpp/.traces/channel-initialization
@@ -1,11 +1,11 @@
 parse/0: instruction: 108
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal", "capacity": ]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/channel-read-increments-full b/cpp/.traces/channel-read-increments-full
index dc1f8a71..0dd58952 100644
--- a/cpp/.traces/channel-read-increments-full
+++ b/cpp/.traces/channel-read-increments-full
@@ -9,11 +9,11 @@ parse/0: instruction: 111
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/channel-wrap b/cpp/.traces/channel-wrap
index 9031c06f..8b55b85b 100644
--- a/cpp/.traces/channel-wrap
+++ b/cpp/.traces/channel-wrap
@@ -9,11 +9,11 @@ parse/0: instruction: 111
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
@@ -21,7 +21,7 @@ parse/0: instruction: 109
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
@@ -29,7 +29,7 @@ parse/0: instruction: 111
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
diff --git a/cpp/.traces/channel-write-increments-free b/cpp/.traces/channel-write-increments-free
index 71f3a49f..1f5b701b 100644
--- a/cpp/.traces/channel-write-increments-free
+++ b/cpp/.traces/channel-write-increments-free
@@ -5,11 +5,11 @@ parse/0: instruction: 109
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
 parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-full", value: 0, type: 0, properties: ["first-full": "offset"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-10, properties: ["1": "address":"channel", "deref": ]}
 parse/0:   ingredient: {name: "first-free", value: 0, type: 0, properties: ["first-free": "offset"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
diff --git a/cpp/.traces/closure b/cpp/.traces/closure
index ae880949..d9fff00a 100644
--- a/cpp/.traces/closure
+++ b/cpp/.traces/closure
@@ -1,4 +1,4 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
@@ -10,7 +10,7 @@ parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer",
 parse/0: instruction: 1002
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"location", "names": "init-counter"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
@@ -20,13 +20,13 @@ parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
 parse/0:   product: {name: "y", value: 0, type: 1, properties: ["y": "integer"]}
-parse/0: instruction: 28
+parse/0: instruction: 29
 parse/0:   ingredient: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "space", value: 0, type: 0, properties: ["space": "literal"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "0", value: 0, type: 2-5-1, properties: ["0": "address":"array":"location", "names": "init-counter"]}
 parse/0: instruction: 2
 parse/0:   ingredient: {name: "y", value: 0, type: 1, properties: ["y": "integer", "space": "1"]}
@@ -35,7 +35,7 @@ parse/0:   product: {name: "y", value: 0, type: 1, properties: ["y": "integer",
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "234", value: 0, type: 0, properties: ["234": "literal"]}
 parse/0:   product: {name: "y", value: 0, type: 1, properties: ["y": "integer"]}
-parse/0: instruction: 28
+parse/0: instruction: 29
 parse/0:   ingredient: {name: "y", value: 0, type: 1, properties: ["y": "integer", "space": "1"]}
 name/0: recipe increment-counter is surrounded by init-counter
 new/0: location -> 1
diff --git a/cpp/.traces/convert_names_transforms_container_elements b/cpp/.traces/convert_names_transforms_container_elements
index db4022f3..3dbd14a4 100644
--- a/cpp/.traces/convert_names_transforms_container_elements
+++ b/cpp/.traces/convert_names_transforms_container_elements
@@ -1,8 +1,8 @@
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "0", value: 0, type: 6, properties: ["0": "point"]}
 parse/0:   ingredient: {name: "y", value: 0, type: 0, properties: ["y": "offset"]}
 parse/0:   product: {name: "a", value: 0, type: 1, properties: ["a": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "0", value: 0, type: 6, properties: ["0": "point"]}
 parse/0:   ingredient: {name: "x", value: 0, type: 0, properties: ["x": "offset"]}
 parse/0:   product: {name: "b", value: 0, type: 1, properties: ["b": "integer"]}
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_get b/cpp/.traces/deref_sidesteps_default_space_in_get
index 3be4a24e..8f82f134 100644
--- a/cpp/.traces/deref_sidesteps_default_space_in_get
+++ b/cpp/.traces/deref_sidesteps_default_space_in_get
@@ -13,7 +13,7 @@ parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: [
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "12", value: 0, type: 0, properties: ["12": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": ]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "9", value: 0, type: 1, properties: ["9": "integer", "raw": ]}
diff --git a/cpp/.traces/deref_sidesteps_default_space_in_index b/cpp/.traces/deref_sidesteps_default_space_in_index
index 17c89cf7..0c273faa 100644
--- a/cpp/.traces/deref_sidesteps_default_space_in_index
+++ b/cpp/.traces/deref_sidesteps_default_space_in_index
@@ -16,7 +16,7 @@ parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: [
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "12", value: 0, type: 0, properties: ["12": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer"]}
-parse/0: instruction: 21
+parse/0: instruction: 22
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "deref": ]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "9", value: 0, type: 1, properties: ["9": "integer", "raw": ]}
diff --git a/cpp/.traces/get b/cpp/.traces/get
index fe7d3c64..5cb3bffa 100644
--- a/cpp/.traces/get
+++ b/cpp/.traces/get
@@ -4,7 +4,7 @@ parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "15", value: 0, type: 1, properties: ["15": "integer"]}
diff --git a/cpp/.traces/get_address b/cpp/.traces/get_address
index 4eedad6e..1cf720e0 100644
--- a/cpp/.traces/get_address
+++ b/cpp/.traces/get_address
@@ -4,7 +4,7 @@ parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: 21
 parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "15", value: 0, type: 2-1, properties: ["15": "address":"integer"]}
diff --git a/cpp/.traces/get_address_indirect b/cpp/.traces/get_address_indirect
index 32f8a46f..45b0664b 100644
--- a/cpp/.traces/get_address_indirect
+++ b/cpp/.traces/get_address_indirect
@@ -7,7 +7,7 @@ parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 20
+parse/0: instruction: 21
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
diff --git a/cpp/.traces/get_handles_nested_container_elements b/cpp/.traces/get_handles_nested_container_elements
index 6336742b..797b8e80 100644
--- a/cpp/.traces/get_handles_nested_container_elements
+++ b/cpp/.traces/get_handles_nested_container_elements
@@ -7,7 +7,7 @@ parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "12", value: 0, type: 7, properties: ["12": "point-integer"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0:   product: {name: "15", value: 0, type: 1, properties: ["15": "integer"]}
diff --git a/cpp/.traces/get_indirect b/cpp/.traces/get_indirect
index ccd0023b..a084d7cf 100644
--- a/cpp/.traces/get_indirect
+++ b/cpp/.traces/get_indirect
@@ -7,7 +7,7 @@ parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
diff --git a/cpp/.traces/include_nonderef_properties b/cpp/.traces/include_nonderef_properties
index 97df71c8..1af02dd2 100644
--- a/cpp/.traces/include_nonderef_properties
+++ b/cpp/.traces/include_nonderef_properties
@@ -7,7 +7,7 @@ parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 19
+parse/0: instruction: 20
 parse/0:   ingredient: {name: "1", value: 0, type: 2-6, properties: ["1": "address":"point", "deref": , "foo": ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "offset"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
diff --git a/cpp/.traces/index b/cpp/.traces/index
index 94817e8a..006eb847 100644
--- a/cpp/.traces/index
+++ b/cpp/.traces/index
@@ -10,7 +10,7 @@ parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 21
+parse/0: instruction: 22
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
diff --git a/cpp/.traces/index_address b/cpp/.traces/index_address
index 5d57456b..59ab5e2c 100644
--- a/cpp/.traces/index_address
+++ b/cpp/.traces/index_address
@@ -10,7 +10,7 @@ parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "16", value: 0, type: 0, properties: ["16": "literal"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 22
+parse/0: instruction: 23
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
diff --git a/cpp/.traces/index_direct_offset b/cpp/.traces/index_direct_offset
index 40432d98..6437422e 100644
--- a/cpp/.traces/index_direct_offset
+++ b/cpp/.traces/index_direct_offset
@@ -13,7 +13,7 @@ parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
-parse/0: instruction: 21
+parse/0: instruction: 22
 parse/0:   ingredient: {name: "1", value: 0, type: 5-1, properties: ["1": "array":"integer"]}
 parse/0:   ingredient: {name: "5", value: 0, type: 1, properties: ["5": "integer"]}
 parse/0:   product: {name: "6", value: 0, type: 1, properties: ["6": "integer"]}
diff --git a/cpp/.traces/index_indirect b/cpp/.traces/index_indirect
index 570e5ade..0f2ccc49 100644
--- a/cpp/.traces/index_indirect
+++ b/cpp/.traces/index_indirect
@@ -13,7 +13,7 @@ parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "5", value: 0, type: 2-5-1, properties: ["5": "address":"array":"integer"]}
-parse/0: instruction: 21
+parse/0: instruction: 22
 parse/0:   ingredient: {name: "5", value: 0, type: 2-5-1, properties: ["5": "address":"array":"integer", "deref": ]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "6", value: 0, type: 1, properties: ["6": "integer"]}
diff --git a/cpp/.traces/ingredient b/cpp/.traces/ingredient
index 55af7c31..0abe066b 100644
--- a/cpp/.traces/ingredient
+++ b/cpp/.traces/ingredient
@@ -1,10 +1,10 @@
 parse/0: instruction: 1001
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
-parse/0: instruction: 27
+parse/0: instruction: 28
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
 parse/0:   product: {name: "1", value: 0, type: 3, properties: ["1": "boolean"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/interpolate-at-end b/cpp/.traces/interpolate-at-end
index c0093a24..02ec2bfc 100644
--- a/cpp/.traces/interpolate-at-end
+++ b/cpp/.traces/interpolate-at-end
@@ -1,7 +1,7 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "hello, _", value: 0, type: 0, properties: ["hello, _": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 107
diff --git a/cpp/.traces/interpolate-at-start b/cpp/.traces/interpolate-at-start
index 69b84ff5..51a4c657 100644
--- a/cpp/.traces/interpolate-at-start
+++ b/cpp/.traces/interpolate-at-start
@@ -1,7 +1,7 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "_, hello!", value: 0, type: 0, properties: ["_, hello!": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 107
diff --git a/cpp/.traces/interpolate-works b/cpp/.traces/interpolate-works
index b033c1fd..ef70cc9f 100644
--- a/cpp/.traces/interpolate-works
+++ b/cpp/.traces/interpolate-works
@@ -1,7 +1,7 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc _", value: 0, type: 0, properties: ["abc _": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "def", value: 0, type: 0, properties: ["def": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 107
diff --git a/cpp/.traces/loop b/cpp/.traces/loop
index d68874c4..3516306a 100644
--- a/cpp/.traces/loop
+++ b/cpp/.traces/loop
@@ -8,7 +8,7 @@ parse/0: label: {
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
-parse/0: instruction: 34
+parse/0: instruction: 35
 parse/0: label: }
 brace/0: 1000: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/loop_nested b/cpp/.traces/loop_nested
index 37ccf23f..b33794cb 100644
--- a/cpp/.traces/loop_nested
+++ b/cpp/.traces/loop_nested
@@ -10,7 +10,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0: label: }
-parse/0: instruction: 35
+parse/0: instruction: 36
 parse/0:   ingredient: {name: "4", value: 0, type: 3, properties: ["4": "boolean"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/loop_unless b/cpp/.traces/loop_unless
index efd39cc2..06003c98 100644
--- a/cpp/.traces/loop_unless
+++ b/cpp/.traces/loop_unless
@@ -5,7 +5,7 @@ parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
-parse/0: instruction: 36
+parse/0: instruction: 37
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/maybe_convert b/cpp/.traces/maybe_convert
index 23458247..144051ce 100644
--- a/cpp/.traces/maybe_convert
+++ b/cpp/.traces/maybe_convert
@@ -7,7 +7,7 @@ parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 24
+parse/0: instruction: 25
 parse/0:   ingredient: {name: "12", value: 0, type: 8, properties: ["12": "integer-or-point"]}
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "variant"]}
 parse/0:   product: {name: "20", value: 0, type: 2-6, properties: ["20": "address":"point"]}
diff --git a/cpp/.traces/maybe_convert_fail b/cpp/.traces/maybe_convert_fail
index 8a433de3..cdf30c9d 100644
--- a/cpp/.traces/maybe_convert_fail
+++ b/cpp/.traces/maybe_convert_fail
@@ -7,7 +7,7 @@ parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 24
+parse/0: instruction: 25
 parse/0:   ingredient: {name: "12", value: 0, type: 8, properties: ["12": "integer-or-point"]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "variant"]}
 parse/0:   product: {name: "20", value: 0, type: 2-6, properties: ["20": "address":"point"]}
diff --git a/cpp/.traces/maybe_convert_named b/cpp/.traces/maybe_convert_named
index 820ec302..a26fcaab 100644
--- a/cpp/.traces/maybe_convert_named
+++ b/cpp/.traces/maybe_convert_named
@@ -7,7 +7,7 @@ parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "36", value: 0, type: 0, properties: ["36": "literal"]}
 parse/0:   product: {name: "14", value: 0, type: 1, properties: ["14": "integer"]}
-parse/0: instruction: 24
+parse/0: instruction: 25
 parse/0:   ingredient: {name: "12", value: 0, type: 8, properties: ["12": "integer-or-point"]}
 parse/0:   ingredient: {name: "p", value: 0, type: 0, properties: ["p": "variant"]}
 parse/0:   product: {name: "20", value: 0, type: 2-6, properties: ["20": "address":"point"]}
diff --git a/cpp/.traces/new b/cpp/.traces/new
index 6b9fb9a9..ed9a4017 100644
--- a/cpp/.traces/new
+++ b/cpp/.traces/new
@@ -1,7 +1,7 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0: instruction: 13
diff --git a/cpp/.traces/new_array b/cpp/.traces/new_array
index 6f0fc8ac..204e39bf 100644
--- a/cpp/.traces/new_array
+++ b/cpp/.traces/new_array
@@ -1,8 +1,8 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-1, properties: ["1": "address":"array":"integer", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0: instruction: 3
diff --git a/cpp/.traces/new_concurrent b/cpp/.traces/new_concurrent
index 94200129..13729f50 100644
--- a/cpp/.traces/new_concurrent
+++ b/cpp/.traces/new_concurrent
@@ -1,9 +1,9 @@
-parse/0: instruction: 29
+parse/0: instruction: 30
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
 parse/0: instruction: 13
diff --git a/cpp/.traces/new_overflow b/cpp/.traces/new_overflow
index 877f1f46..cc8405da 100644
--- a/cpp/.traces/new_overflow
+++ b/cpp/.traces/new_overflow
@@ -1,7 +1,7 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "point", value: 0, type: 0, properties: ["point": "type"]}
 parse/0:   product: {name: "2", value: 0, type: 2-6, properties: ["2": "address":"point", "raw": ]}
 new/0: integer -> 1
diff --git a/cpp/.traces/new_string b/cpp/.traces/new_string
index e38d328b..a7d8efd3 100644
--- a/cpp/.traces/new_string
+++ b/cpp/.traces/new_string
@@ -1,7 +1,7 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
-parse/0: instruction: 21
+parse/0: instruction: 22
 parse/0:   ingredient: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": ]}
 parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
 parse/0:   product: {name: "2", value: 0, type: 4, properties: ["2": "character"]}
diff --git a/cpp/.traces/next_ingredient b/cpp/.traces/next_ingredient
index 9efc9fdd..19146137 100644
--- a/cpp/.traces/next_ingredient
+++ b/cpp/.traces/next_ingredient
@@ -1,6 +1,6 @@
 parse/0: instruction: 1001
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0: instruction: 2
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
diff --git a/cpp/.traces/next_ingredient_missing b/cpp/.traces/next_ingredient_missing
index c8ae97d7..8180399f 100644
--- a/cpp/.traces/next_ingredient_missing
+++ b/cpp/.traces/next_ingredient_missing
@@ -1,5 +1,5 @@
 parse/0: instruction: 1001
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/reply b/cpp/.traces/reply
index 49f62ef8..abed04d6 100644
--- a/cpp/.traces/reply
+++ b/cpp/.traces/reply
@@ -2,13 +2,13 @@ parse/0: instruction: 1001
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0: instruction: 2
 parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
 parse/0:   ingredient: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 28
+parse/0: instruction: 29
 parse/0:   ingredient: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0:   ingredient: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/reply_container b/cpp/.traces/reply_container
index 677e6e02..e550c295 100644
--- a/cpp/.traces/reply_container
+++ b/cpp/.traces/reply_container
@@ -1,12 +1,12 @@
 parse/0: instruction: 1001
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0:   product: {name: "3", value: 0, type: 6, properties: ["3": "point"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
-parse/0: instruction: 28
+parse/0: instruction: 29
 parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point"]}
 after-brace/0: recipe main
 after-brace/0: f ...
diff --git a/cpp/.traces/reply_same_as_ingredient b/cpp/.traces/reply_same_as_ingredient
index 65f90f7d..5448d9eb 100644
--- a/cpp/.traces/reply_same_as_ingredient
+++ b/cpp/.traces/reply_same_as_ingredient
@@ -1,12 +1,12 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "integer", value: 0, type: 0, properties: ["integer": "type"]}
 parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
 parse/0: instruction: 1001
 parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
 parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "10", value: 0, type: 2-1, properties: ["10": "address":"integer"]}
-parse/0: instruction: 28
+parse/0: instruction: 29
 parse/0:   ingredient: {name: "10", value: 0, type: 2-1, properties: ["10": "address":"integer", "same-as-ingredient": "0"]}
 new/0: integer -> 1
 after-brace/0: recipe main
diff --git a/cpp/.traces/rewind_ingredients b/cpp/.traces/rewind_ingredients
index 3bca656e..496ad7a1 100644
--- a/cpp/.traces/rewind_ingredients
+++ b/cpp/.traces/rewind_ingredients
@@ -1,12 +1,12 @@
 parse/0: instruction: 1001
 parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "12", value: 0, type: 1, properties: ["12": "integer"]}
-parse/0: instruction: 25
+parse/0: instruction: 26
 parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 parse/0:   product: {name: "1", value: 0, type: 3, properties: ["1": "boolean"]}
+parse/0: instruction: 27
 parse/0: instruction: 26
-parse/0: instruction: 25
 parse/0:   product: {name: "13", value: 0, type: 1, properties: ["13": "integer"]}
 parse/0:   product: {name: "2", value: 0, type: 3, properties: ["2": "boolean"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/scheduler b/cpp/.traces/scheduler
index 07e4c9c5..37530a6a 100644
--- a/cpp/.traces/scheduler
+++ b/cpp/.traces/scheduler
@@ -1,4 +1,4 @@
-parse/0: instruction: 29
+parse/0: instruction: 30
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
diff --git a/cpp/.traces/scheduler_interleaves_routines b/cpp/.traces/scheduler_interleaves_routines
index e8147b0e..f7bbb4ab 100644
--- a/cpp/.traces/scheduler_interleaves_routines
+++ b/cpp/.traces/scheduler_interleaves_routines
@@ -1,4 +1,4 @@
-parse/0: instruction: 29
+parse/0: instruction: 30
 parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
diff --git a/cpp/.traces/string-append-1 b/cpp/.traces/string-append-1
index 8dd9c849..dc76318d 100644
--- a/cpp/.traces/string-append-1
+++ b/cpp/.traces/string-append-1
@@ -1,7 +1,7 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "hello,", value: 0, type: 0, properties: ["hello,": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character", "raw": ]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: " world!", value: 0, type: 0, properties: [" world!": "literal-string"]}
 parse/0:   product: {name: "2", value: 0, type: 2-5-4, properties: ["2": "address":"array":"character", "raw": ]}
 parse/0: instruction: 106
diff --git a/cpp/.traces/string-equal-common-lengths-but-distinct b/cpp/.traces/string-equal-common-lengths-but-distinct
index a21aaafe..eb00443a 100644
--- a/cpp/.traces/string-equal-common-lengths-but-distinct
+++ b/cpp/.traces/string-equal-common-lengths-but-distinct
@@ -1,11 +1,11 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abd", value: 0, type: 0, properties: ["abd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-distinct-lengths b/cpp/.traces/string-equal-distinct-lengths
index e410fdc1..8d2c674d 100644
--- a/cpp/.traces/string-equal-distinct-lengths
+++ b/cpp/.traces/string-equal-distinct-lengths
@@ -1,11 +1,11 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-identical b/cpp/.traces/string-equal-identical
index cf783038..99087c1a 100644
--- a/cpp/.traces/string-equal-identical
+++ b/cpp/.traces/string-equal-identical
@@ -1,11 +1,11 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-reflexive b/cpp/.traces/string-equal-reflexive
index 6889bd9d..d759d505 100644
--- a/cpp/.traces/string-equal-reflexive
+++ b/cpp/.traces/string-equal-reflexive
@@ -1,8 +1,8 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string-equal-with-empty b/cpp/.traces/string-equal-with-empty
index c25963b3..7462567e 100644
--- a/cpp/.traces/string-equal-with-empty
+++ b/cpp/.traces/string-equal-with-empty
@@ -1,11 +1,11 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "location", value: 0, type: 0, properties: ["location": "type"]}
 parse/0:   ingredient: {name: "30", value: 0, type: 0, properties: ["30": "literal"]}
 parse/0:   product: {name: "default-space", value: 0, type: 2-5-1, properties: ["default-space": "address":"array":"location"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "", value: 0, type: 0, properties: ["": "literal-string"]}
 parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
 parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
diff --git a/cpp/.traces/string_literal b/cpp/.traces/string_literal
index 966b5166..82986a95 100644
--- a/cpp/.traces/string_literal
+++ b/cpp/.traces/string_literal
@@ -1,3 +1,3 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/string_literal_nested b/cpp/.traces/string_literal_nested
index 963b8ad8..219b31db 100644
--- a/cpp/.traces/string_literal_nested
+++ b/cpp/.traces/string_literal_nested
@@ -1,3 +1,3 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc [def]", value: 0, type: 0, properties: ["abc [def]": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/string_literal_with_colons b/cpp/.traces/string_literal_with_colons
index a646ca0f..5f181a42 100644
--- a/cpp/.traces/string_literal_with_colons
+++ b/cpp/.traces/string_literal_with_colons
@@ -1,3 +1,3 @@
-parse/0: instruction: 37
+parse/0: instruction: 38
 parse/0:   ingredient: {name: "abc:def/ghi", value: 0, type: 0, properties: ["abc:def/ghi": "literal-string"]}
 parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/wait_for_location b/cpp/.traces/wait_for_location
index cb2311c5..27642c88 100644
--- a/cpp/.traces/wait_for_location
+++ b/cpp/.traces/wait_for_location
@@ -1,9 +1,9 @@
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
 parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
-parse/0: instruction: 29
-parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
 parse/0: instruction: 30
+parse/0:   ingredient: {name: "f2", value: 0, type: 0, properties: ["f2": "recipe"]}
+parse/0: instruction: 31
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/026assert.cc b/cpp/026assert.cc
new file mode 100644
index 00000000..785db1f5
--- /dev/null
+++ b/cpp/026assert.cc
@@ -0,0 +1,20 @@
+:(scenario assert)
+% Hide_warnings = true;
+recipe main [
+  assert 0:literal, [this is an assert in mu]
+]
++warn: this is an assert in mu
+
+:(before "End Primitive Recipe Declarations")
+ASSERT,
+:(before "End Primitive Recipe Numbers")
+Recipe_number["assert"] = ASSERT;
+:(before "End Primitive Recipe Implementations")
+case ASSERT: {
+  trace("run") << "ingredient 0 is " << current_instruction().ingredients[0].name;
+  vector<int> arg0 = read_memory(current_instruction().ingredients[0]);
+  assert(arg0.size() == 1);
+  if (arg0[0] == 0)
+    raise << current_instruction().ingredients[1].name << '\n';
+  break;
+}