about summary refs log tree commit diff stats
path: root/cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp')
-rw-r--r--cpp/.traces/array_length2
-rw-r--r--cpp/.traces/brace_conversion2
-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/closure12
-rw-r--r--cpp/.traces/convert_names_transforms_container_elements4
-rw-r--r--cpp/.traces/factorial4
-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/loop2
-rw-r--r--cpp/.traces/loop_nested2
-rw-r--r--cpp/.traces/loop_unless2
-rw-r--r--cpp/.traces/new4
-rw-r--r--cpp/.traces/new_array4
-rw-r--r--cpp/.traces/new_string14
-rw-r--r--cpp/.traces/next_ingredient2
-rw-r--r--cpp/.traces/reply4
-rw-r--r--cpp/.traces/reply_container4
-rw-r--r--cpp/.traces/string-equal-common-lengths-but-distinct38
-rw-r--r--cpp/.traces/string-equal-distinct-lengths14
-rw-r--r--cpp/.traces/string-equal-identical38
-rw-r--r--cpp/.traces/string-equal-reflexive34
-rw-r--r--cpp/.traces/string-equal-with-empty14
-rw-r--r--cpp/.traces/string_literal9
-rw-r--r--cpp/.traces/string_literal_nested9
-rw-r--r--cpp/.traces/string_literal_with_colons9
-rw-r--r--cpp/.traces/trace2
-rw-r--r--cpp/.traces/trace_in_mu2
-rw-r--r--cpp/013literal_string (renamed from cpp/035literal_string)28
-rw-r--r--cpp/020run (renamed from cpp/013run)0
-rw-r--r--cpp/021arithmetic (renamed from cpp/014arithmetic)0
-rw-r--r--cpp/022boolean (renamed from cpp/015boolean)0
-rw-r--r--cpp/023jump (renamed from cpp/016jump)0
-rw-r--r--cpp/024compare (renamed from cpp/017compare)0
-rw-r--r--cpp/025trace (renamed from cpp/042trace)0
-rw-r--r--cpp/030container (renamed from cpp/020container)0
-rw-r--r--cpp/031address (renamed from cpp/021address)0
-rw-r--r--cpp/032array (renamed from cpp/022array)0
-rw-r--r--cpp/033length (renamed from cpp/023length)0
-rw-r--r--cpp/035call (renamed from cpp/025call)0
-rw-r--r--cpp/036call_ingredient (renamed from cpp/026call_ingredient)0
-rw-r--r--cpp/037call_reply (renamed from cpp/027call_reply)0
-rw-r--r--cpp/040brace (renamed from cpp/030brace)0
-rw-r--r--cpp/041name (renamed from cpp/031name)0
-rw-r--r--cpp/042new (renamed from cpp/032new)28
-rw-r--r--cpp/043space (renamed from cpp/033space)0
-rw-r--r--cpp/044space_surround (renamed from cpp/034space_surround)0
-rw-r--r--cpp/050scenario (renamed from cpp/040scenario)0
-rw-r--r--cpp/051scenario_test.mu (renamed from cpp/041scenario_test.mu)0
-rw-r--r--cpp/052scenario_trace (renamed from cpp/043scenario_trace)0
-rw-r--r--cpp/053scenario_trace_test.mu (renamed from cpp/044scenario_trace_test.mu)0
-rw-r--r--cpp/054closure_name (renamed from cpp/045closure_name)0
-rw-r--r--cpp/060string.mu (renamed from cpp/050string.mu)0
68 files changed, 157 insertions, 174 deletions
diff --git a/cpp/.traces/array_length b/cpp/.traces/array_length
index 65ae6484..5484570d 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: 22
+parse/0: instruction: 23
 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/brace_conversion b/cpp/.traces/brace_conversion
index c9444a7c..6920866e 100644
--- a/cpp/.traces/brace_conversion
+++ b/cpp/.traces/brace_conversion
@@ -1,5 +1,5 @@
 parse/0: label: {
-parse/0: instruction: 25
+parse/0: instruction: 26
 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/break_cascading b/cpp/.traces/break_cascading
index 06127e3d..1a516b99 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: 25
+parse/0: instruction: 26
 parse/0: label: }
 parse/0: label: {
-parse/0: instruction: 25
+parse/0: instruction: 26
 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 2cd8aea6..327e3ec3 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: 25
+parse/0: instruction: 26
 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: 25
+parse/0: instruction: 26
 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 3605ac83..2771f904 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: 25
+parse/0: instruction: 26
 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 d5f5d0e9..3ea882a3 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: 26
+parse/0: instruction: 27
 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: 25
+parse/0: instruction: 26
 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 fe03e6c2..c73d8678 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: 25
+parse/0: instruction: 26
 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 ac8c5a30..ef268b47 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: 25
+parse/0: instruction: 26
 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 c2c5d1a2..6540bc51 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: 25
+parse/0: instruction: 26
 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 dcbe62ad..a1ee2035 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: 25
+parse/0: instruction: 26
 parse/0: label: {
 parse/0: label: }
 parse/0: label: }
diff --git a/cpp/.traces/break_unless b/cpp/.traces/break_unless
index 03fd8a90..7d61dded 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: 27
+parse/0: instruction: 28
 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/closure b/cpp/.traces/closure
index f5a41ee9..0f5d2161 100644
--- a/cpp/.traces/closure
+++ b/cpp/.traces/closure
@@ -1,4 +1,4 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
@@ -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-0, properties: ["1": "address":"space", "names": "init-counter"]}
 parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer", "raw": ]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
@@ -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: 24
+parse/0: instruction: 25
 parse/0:   ingredient: {name: "default-space", value: 0, type: 2-0, properties: ["default-space": "address":"space"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
-parse/0: instruction: 23
+parse/0: instruction: 24
 parse/0:   product: {name: "0", value: 0, type: 2-0, properties: ["0": "address":"space", "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: 24
+parse/0: instruction: 25
 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 0dd4f7e8..c86b6d2d 100644
--- a/cpp/.traces/convert_names_transforms_container_elements
+++ b/cpp/.traces/convert_names_transforms_container_elements
@@ -1,8 +1,8 @@
-parse/0: instruction: 18
+parse/0: instruction: 19
 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: 18
+parse/0: instruction: 19
 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/factorial b/cpp/.traces/factorial
index 9a7f261e..d4ea095b 100644
--- a/cpp/.traces/factorial
+++ b/cpp/.traces/factorial
@@ -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: 26
+parse/0: instruction: 27
 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: 28
+parse/0: instruction: 29
 parse/0: label: }
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/get b/cpp/.traces/get
index 39778dbf..60d738da 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: 18
+parse/0: instruction: 19
 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 1a37c192..f36d4b05 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: 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: 2-1, properties: ["15": "address":"integer"]}
diff --git a/cpp/.traces/get_address_indirect b/cpp/.traces/get_address_indirect
index 2f2af58b..bb74ab61 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: 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/get_handles_nested_container_elements b/cpp/.traces/get_handles_nested_container_elements
index 4334fc26..5997b167 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: 18
+parse/0: instruction: 19
 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 98e9d9c6..b9328f71 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: 18
+parse/0: instruction: 19
 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 835c973a..b7f103fc 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: 18
+parse/0: instruction: 19
 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 e9f3dd08..c5114af2 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: 20
+parse/0: instruction: 21
 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 ca503f99..464a4565 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: 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_direct_offset b/cpp/.traces/index_direct_offset
index 67bbbde6..021f8452 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: 20
+parse/0: instruction: 21
 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 0b3bb283..e1f6c191 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: 20
+parse/0: instruction: 21
 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/loop b/cpp/.traces/loop
index cf494543..ba71abf6 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: 28
+parse/0: instruction: 29
 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 d6d78346..3b9fb46f 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: 29
+parse/0: instruction: 30
 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 9d5f5892..b26ad4c5 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: 30
+parse/0: instruction: 31
 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/new b/cpp/.traces/new
index 5e148caf..965d0333 100644
--- a/cpp/.traces/new
+++ b/cpp/.traces/new
@@ -1,7 +1,7 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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: 31
+parse/0: instruction: 32
 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 a480b46d..d41cc26b 100644
--- a/cpp/.traces/new_array
+++ b/cpp/.traces/new_array
@@ -1,8 +1,8 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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: 31
+parse/0: instruction: 32
 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_string b/cpp/.traces/new_string
index fe4fe3e8..525602e3 100644
--- a/cpp/.traces/new_string
+++ b/cpp/.traces/new_string
@@ -1,10 +1,10 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-8, properties: ["1": "address":"array":"character"]}
-parse/0: instruction: 20
-parse/0:   ingredient: {name: "1", value: 0, type: 2-5-8, properties: ["1": "address":"array":"character", "deref": ]}
+parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
+parse/0: instruction: 21
+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: 8, properties: ["2": "character"]}
+parse/0:   product: {name: "2", value: 0, type: 4, properties: ["2": "character"]}
 new/0: abc def -> 0
 after-brace/0: recipe main
 after-brace/0: new ...
@@ -12,11 +12,11 @@ after-brace/0: index ...
 run/0: instruction main/0
 mem/0: storing 1000 in location 1
 run/0: instruction main/1
-run/0: ingredient 0 is {name: "1", value: 1, type: 2-5-8, properties: ["1": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "1", value: 1, type: 2-5-4, properties: ["1": "address":"array":"character", "deref": ]}
 mem/0: location 1 is 1000
 run/0: ingredient 1 is {name: "5", value: 5, type: 0, properties: ["5": "literal"]}
 run/0: address to copy is 1006
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1006 is 101
 run/0: product 0 is 101
 mem/0: storing 101 in location 2
diff --git a/cpp/.traces/next_ingredient b/cpp/.traces/next_ingredient
index a296bd69..6f9da074 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: 23
+parse/0: instruction: 24
 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/reply b/cpp/.traces/reply
index 1dde3540..b83e094f 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: 23
+parse/0: instruction: 24
 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: 24
+parse/0: instruction: 25
 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 f
diff --git a/cpp/.traces/reply_container b/cpp/.traces/reply_container
index 1b491677..144b9b07 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: 23
+parse/0: instruction: 24
 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: 24
+parse/0: instruction: 25
 parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point"]}
 after-brace/0: recipe f
 after-brace/0: next-ingredient ...
diff --git a/cpp/.traces/string-equal-common-lengths-but-distinct b/cpp/.traces/string-equal-common-lengths-but-distinct
index 22b9eed7..ee87a24a 100644
--- a/cpp/.traces/string-equal-common-lengths-but-distinct
+++ b/cpp/.traces/string-equal-common-lengths-but-distinct
@@ -1,16 +1,16 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-parse/0:   product: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 31
+parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abd", value: 0, type: 0, properties: ["abd": "literal-string"]}
-parse/0:   product: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
-parse/0:   ingredient: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0:   ingredient: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
 new/0: location -> 1
 new/0: abc -> 0
@@ -78,22 +78,22 @@ mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1040 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 0
 run/0: address to copy is 1031
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1031 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1047
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1042 is 1034
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 0
 run/0: address to copy is 1035
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1035 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1048
@@ -130,22 +130,22 @@ mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1040 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 1
 run/0: address to copy is 1032
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1032 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1047
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1042 is 1034
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 1
 run/0: address to copy is 1036
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1036 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1048
@@ -182,22 +182,22 @@ mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1040 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 2
 run/0: address to copy is 1033
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1033 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1047
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1042 is 1034
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 2
 run/0: address to copy is 1037
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1037 is 100
 run/0: product 0 is 100
 mem/0: storing 100 in location 1048
diff --git a/cpp/.traces/string-equal-distinct-lengths b/cpp/.traces/string-equal-distinct-lengths
index 0c69eb1a..834292fe 100644
--- a/cpp/.traces/string-equal-distinct-lengths
+++ b/cpp/.traces/string-equal-distinct-lengths
@@ -1,16 +1,16 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-parse/0:   product: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 31
+parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
-parse/0:   product: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
-parse/0:   ingredient: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0:   ingredient: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
 new/0: location -> 1
 new/0: abc -> 0
diff --git a/cpp/.traces/string-equal-identical b/cpp/.traces/string-equal-identical
index 164582af..3e16bee4 100644
--- a/cpp/.traces/string-equal-identical
+++ b/cpp/.traces/string-equal-identical
@@ -1,16 +1,16 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-parse/0:   product: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 31
+parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-parse/0:   product: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
-parse/0:   ingredient: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0:   ingredient: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
 new/0: location -> 1
 new/0: abc -> 0
@@ -78,22 +78,22 @@ mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1040 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 0
 run/0: address to copy is 1031
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1031 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1047
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1042 is 1034
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 0
 run/0: address to copy is 1035
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1035 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1048
@@ -130,22 +130,22 @@ mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1040 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 1
 run/0: address to copy is 1032
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1032 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1047
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1042 is 1034
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 1
 run/0: address to copy is 1036
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1036 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1048
@@ -182,22 +182,22 @@ mem/0: location 1046 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1040 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 2
 run/0: address to copy is 1033
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1033 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1047
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1042 is 1034
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1045 is 2
 run/0: address to copy is 1037
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1037 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1048
diff --git a/cpp/.traces/string-equal-reflexive b/cpp/.traces/string-equal-reflexive
index 2a629bbb..3b478725 100644
--- a/cpp/.traces/string-equal-reflexive
+++ b/cpp/.traces/string-equal-reflexive
@@ -1,13 +1,13 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abc", value: 0, type: 0, properties: ["abc": "literal-string"]}
-parse/0:   product: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
+parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0: instruction: 100
-parse/0:   ingredient: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0:   ingredient: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
+parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
 new/0: location -> 1
 new/0: abc -> 0
@@ -70,22 +70,22 @@ mem/0: location 1042 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1036 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1041 is 0
 run/0: address to copy is 1031
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1031 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1043
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1038 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1041 is 0
 run/0: address to copy is 1031
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1031 is 97
 run/0: product 0 is 97
 mem/0: storing 97 in location 1044
@@ -122,22 +122,22 @@ mem/0: location 1042 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1036 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1041 is 1
 run/0: address to copy is 1032
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1032 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1043
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1038 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1041 is 1
 run/0: address to copy is 1032
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1032 is 98
 run/0: product 0 is 98
 mem/0: storing 98 in location 1044
@@ -174,22 +174,22 @@ mem/0: location 1042 is 0
 run/0: ingredient 0 is 0
 run/0: jump-if fell through
 run/0: instruction string-equal/16
-run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-8, properties: ["a": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "a", value: 1, type: 2-5-4, properties: ["a": "address":"array":"character", "deref": ]}
 mem/0: location 1036 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1041 is 2
 run/0: address to copy is 1033
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1033 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1043
 run/0: instruction string-equal/17
-run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-8, properties: ["b": "address":"array":"character", "deref": ]}
+run/0: ingredient 0 is {name: "b", value: 3, type: 2-5-4, properties: ["b": "address":"array":"character", "deref": ]}
 mem/0: location 1038 is 1030
 run/0: ingredient 1 is {name: "i", value: 6, type: 1, properties: ["i": "integer"]}
 mem/0: location 1041 is 2
 run/0: address to copy is 1033
-run/0: its type is 8
+run/0: its type is 4
 mem/0: location 1033 is 99
 run/0: product 0 is 99
 mem/0: storing 99 in location 1044
diff --git a/cpp/.traces/string-equal-with-empty b/cpp/.traces/string-equal-with-empty
index 803e017b..2d10802e 100644
--- a/cpp/.traces/string-equal-with-empty
+++ b/cpp/.traces/string-equal-with-empty
@@ -1,16 +1,16 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-0, properties: ["default-space": "address":"space"]}
-parse/0: instruction: 31
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "", value: 0, type: 0, properties: ["": "literal-string"]}
-parse/0:   product: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0: instruction: 31
+parse/0:   product: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0: instruction: 32
 parse/0:   ingredient: {name: "abcd", value: 0, type: 0, properties: ["abcd": "literal-string"]}
-parse/0:   product: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   product: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0: instruction: 100
-parse/0:   ingredient: {name: "x", value: 0, type: 2-5-8, properties: ["x": "address":"array":"character"]}
-parse/0:   ingredient: {name: "y", value: 0, type: 2-5-8, properties: ["y": "address":"array":"character"]}
+parse/0:   ingredient: {name: "x", value: 0, type: 2-5-4, properties: ["x": "address":"array":"character"]}
+parse/0:   ingredient: {name: "y", value: 0, type: 2-5-4, properties: ["y": "address":"array":"character"]}
 parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
 new/0: location -> 1
 new/0:  -> 0
diff --git a/cpp/.traces/string_literal b/cpp/.traces/string_literal
index 0562305b..bca008a9 100644
--- a/cpp/.traces/string_literal
+++ b/cpp/.traces/string_literal
@@ -1,8 +1,3 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-8, properties: ["1": "address":"array":"character"]}
-new/0: abc def -> 0
-after-brace/0: recipe main
-after-brace/0: new ...
-run/0: instruction main/0
-mem/0: storing 1000 in location 1
+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 d91739ec..aad3dc98 100644
--- a/cpp/.traces/string_literal_nested
+++ b/cpp/.traces/string_literal_nested
@@ -1,8 +1,3 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-8, properties: ["1": "address":"array":"character"]}
-new/0: abc [def] -> 0
-after-brace/0: recipe main
-after-brace/0: new ...
-run/0: instruction main/0
-mem/0: storing 1000 in location 1
+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 cf30be82..65a458fe 100644
--- a/cpp/.traces/string_literal_with_colons
+++ b/cpp/.traces/string_literal_with_colons
@@ -1,8 +1,3 @@
-parse/0: instruction: 31
+parse/0: instruction: 32
 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-8, properties: ["1": "address":"array":"character"]}
-new/0: abc:def/ghi -> 0
-after-brace/0: recipe main
-after-brace/0: new ...
-run/0: instruction main/0
-mem/0: storing 1000 in location 1
+parse/0:   product: {name: "1", value: 0, type: 2-5-4, properties: ["1": "address":"array":"character"]}
diff --git a/cpp/.traces/trace b/cpp/.traces/trace
index fb4fd081..2ef6ce77 100644
--- a/cpp/.traces/trace
+++ b/cpp/.traces/trace
@@ -1,4 +1,4 @@
-parse/0: instruction: 32
+parse/0: instruction: 18
 parse/0:   ingredient: {name: "foo", value: 0, type: 0, properties: ["foo": "literal-string"]}
 parse/0:   ingredient: {name: "this is a trace in mu", value: 0, type: 0, properties: ["this is a trace in mu": "literal-string"]}
 after-brace/0: recipe main
diff --git a/cpp/.traces/trace_in_mu b/cpp/.traces/trace_in_mu
index dc7d8d8a..1d0be2b2 100644
--- a/cpp/.traces/trace_in_mu
+++ b/cpp/.traces/trace_in_mu
@@ -1,4 +1,4 @@
-parse/0: instruction: 32
+parse/0: instruction: 18
 parse/0:   ingredient: {name: "foo", value: 0, type: 0, properties: ["foo": "literal-string"]}
 parse/0:   ingredient: {name: "aaa", value: 0, type: 0, properties: ["aaa": "literal-string"]}
 after-brace/0: recipe test-trace_in_mu
diff --git a/cpp/035literal_string b/cpp/013literal_string
index 9ca09115..f56cb928 100644
--- a/cpp/035literal_string
+++ b/cpp/013literal_string
@@ -61,31 +61,3 @@ recipe main [
   1:address:array:character <- new [abc [def]]
 ]
 +parse:   ingredient: {name: "abc [def]", value: 0, type: 0, properties: ["abc [def]": "literal-string"]}
-
-//: Next, extend 'new' to handle a string literal argument.
-:(scenario "new_string")
-recipe main [
-  1:address:array:character <- new [abc def]
-  2:character <- index 1:address:array:character/deref, 5:literal
-]
-# integer code for 'e'
-+mem: storing 101 in location 2
-
-:(before "End Mu Types Initialization")
-Type_number["character"] = Next_type_number++;
-
-:(after "case NEW" following "Primitive Recipe Implementations")
-if (instructions[pc].ingredients[0].properties[0].second[0] == "literal-string") {
-  // allocate an array just large enough for it
-  vector<int> result;
-  result.push_back(Current_routine->alloc);
-  write_memory(instructions[pc].products[0], result);
-  // assume that all characters fit in a single location
-//?   cout << "new string literal: " << instructions[pc].ingredients[0].name << '\n'; //? 1
-  Memory[Current_routine->alloc++] = instructions[pc].ingredients[0].name.size();
-  for (size_t i = 0; i < instructions[pc].ingredients[0].name.size(); ++i) {
-    Memory[Current_routine->alloc++] = instructions[pc].ingredients[0].name[i];
-  }
-  // mu strings are not null-terminated in memory
-  break;
-}
diff --git a/cpp/013run b/cpp/020run
index 91e242a7..91e242a7 100644
--- a/cpp/013run
+++ b/cpp/020run
diff --git a/cpp/014arithmetic b/cpp/021arithmetic
index 08647cbc..08647cbc 100644
--- a/cpp/014arithmetic
+++ b/cpp/021arithmetic
diff --git a/cpp/015boolean b/cpp/022boolean
index 6c677f7e..6c677f7e 100644
--- a/cpp/015boolean
+++ b/cpp/022boolean
diff --git a/cpp/016jump b/cpp/023jump
index 669c7258..669c7258 100644
--- a/cpp/016jump
+++ b/cpp/023jump
diff --git a/cpp/017compare b/cpp/024compare
index 145feaa2..145feaa2 100644
--- a/cpp/017compare
+++ b/cpp/024compare
diff --git a/cpp/042trace b/cpp/025trace
index bd05d848..bd05d848 100644
--- a/cpp/042trace
+++ b/cpp/025trace
diff --git a/cpp/020container b/cpp/030container
index fcdd82f9..fcdd82f9 100644
--- a/cpp/020container
+++ b/cpp/030container
diff --git a/cpp/021address b/cpp/031address
index 22355fc6..22355fc6 100644
--- a/cpp/021address
+++ b/cpp/031address
diff --git a/cpp/022array b/cpp/032array
index 3bdfe95e..3bdfe95e 100644
--- a/cpp/022array
+++ b/cpp/032array
diff --git a/cpp/023length b/cpp/033length
index 9d3bb714..9d3bb714 100644
--- a/cpp/023length
+++ b/cpp/033length
diff --git a/cpp/025call b/cpp/035call
index 3683db12..3683db12 100644
--- a/cpp/025call
+++ b/cpp/035call
diff --git a/cpp/026call_ingredient b/cpp/036call_ingredient
index ecf53539..ecf53539 100644
--- a/cpp/026call_ingredient
+++ b/cpp/036call_ingredient
diff --git a/cpp/027call_reply b/cpp/037call_reply
index b44552cc..b44552cc 100644
--- a/cpp/027call_reply
+++ b/cpp/037call_reply
diff --git a/cpp/030brace b/cpp/040brace
index d01fe359..d01fe359 100644
--- a/cpp/030brace
+++ b/cpp/040brace
diff --git a/cpp/031name b/cpp/041name
index 375f9854..375f9854 100644
--- a/cpp/031name
+++ b/cpp/041name
diff --git a/cpp/032new b/cpp/042new
index e0460170..0d7742f8 100644
--- a/cpp/032new
+++ b/cpp/042new
@@ -19,7 +19,7 @@ size_t alloc;
     calls.push(call(r));
   }
 
-//: first handle 'type' operands
+//: First handle 'type' operands
 :(before "End Mu Types Initialization")
 Type_number["type"] = 0;
 :(after "Per-recipe Transforms")
@@ -35,6 +35,7 @@ if (inst.operation == Recipe_number["new"]) {
   trace("new") << inst.ingredients[0].name << " -> " << inst.ingredients[0].value;
 }
 
+//: Now implement the primitive recipe.
 :(before "End Primitive Recipe Declarations")
 NEW,
 :(before "End Primitive Recipe Numbers")
@@ -73,4 +74,29 @@ recipe main [
 +run: instruction main/2
 +mem: storing 5 in location 3
 
+//: Next, extend 'new' to handle a string literal argument.
+:(scenario "new_string")
+recipe main [
+  1:address:array:character <- new [abc def]
+  2:character <- index 1:address:array:character/deref, 5:literal
+]
+# integer code for 'e'
++mem: storing 101 in location 2
+
+:(after "case NEW" following "Primitive Recipe Implementations")
+if (instructions[pc].ingredients[0].properties[0].second[0] == "literal-string") {
+  // allocate an array just large enough for it
+  vector<int> result;
+  result.push_back(Current_routine->alloc);
+  write_memory(instructions[pc].products[0], result);
+  // assume that all characters fit in a single location
+//?   cout << "new string literal: " << instructions[pc].ingredients[0].name << '\n'; //? 1
+  Memory[Current_routine->alloc++] = instructions[pc].ingredients[0].name.size();
+  for (size_t i = 0; i < instructions[pc].ingredients[0].name.size(); ++i) {
+    Memory[Current_routine->alloc++] = instructions[pc].ingredients[0].name[i];
+  }
+  // mu strings are not null-terminated in memory
+  break;
+}
+
 //: vim: ft=cpp
diff --git a/cpp/033space b/cpp/043space
index 1bb91b8e..1bb91b8e 100644
--- a/cpp/033space
+++ b/cpp/043space
diff --git a/cpp/034space_surround b/cpp/044space_surround
index 76cd5807..76cd5807 100644
--- a/cpp/034space_surround
+++ b/cpp/044space_surround
diff --git a/cpp/040scenario b/cpp/050scenario
index c595ce82..c595ce82 100644
--- a/cpp/040scenario
+++ b/cpp/050scenario
diff --git a/cpp/041scenario_test.mu b/cpp/051scenario_test.mu
index bf30ce8f..bf30ce8f 100644
--- a/cpp/041scenario_test.mu
+++ b/cpp/051scenario_test.mu
diff --git a/cpp/043scenario_trace b/cpp/052scenario_trace
index 90dab204..90dab204 100644
--- a/cpp/043scenario_trace
+++ b/cpp/052scenario_trace
diff --git a/cpp/044scenario_trace_test.mu b/cpp/053scenario_trace_test.mu
index abf0ef9a..abf0ef9a 100644
--- a/cpp/044scenario_trace_test.mu
+++ b/cpp/053scenario_trace_test.mu
diff --git a/cpp/045closure_name b/cpp/054closure_name
index 76a1bdd7..76a1bdd7 100644
--- a/cpp/045closure_name
+++ b/cpp/054closure_name
diff --git a/cpp/050string.mu b/cpp/060string.mu
index e85dc083..e85dc083 100644
--- a/cpp/050string.mu
+++ b/cpp/060string.mu