about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--cpp/.traces/add14
-rw-r--r--cpp/.traces/add_literal6
-rw-r--r--cpp/.traces/and14
-rw-r--r--cpp/.traces/brace_conversion4
-rw-r--r--cpp/.traces/break_cascading4
-rw-r--r--cpp/.traces/break_cascading212
-rw-r--r--cpp/.traces/break_empty_block4
-rw-r--r--cpp/.traces/break_if14
-rw-r--r--cpp/.traces/break_label6
-rw-r--r--cpp/.traces/break_nested16
-rw-r--r--cpp/.traces/break_nested_degenerate12
-rw-r--r--cpp/.traces/break_nested_degenerate28
-rw-r--r--cpp/.traces/break_unless14
-rw-r--r--cpp/.traces/calling_recipe6
-rw-r--r--cpp/.traces/convert_names4
-rw-r--r--cpp/.traces/convert_names_handles_records8
-rw-r--r--cpp/.traces/convert_names_passes_default_space6
-rw-r--r--cpp/.traces/convert_names_passes_dummy6
-rw-r--r--cpp/.traces/convert_names_passes_raw4
-rw-r--r--cpp/.traces/convert_names_transforms_record_elements12
-rw-r--r--cpp/.traces/copy8
-rw-r--r--cpp/.traces/copy_array20
-rw-r--r--cpp/.traces/copy_handles_nested_record_elements16
-rw-r--r--cpp/.traces/copy_indirect12
-rw-r--r--cpp/.traces/copy_literal4
-rw-r--r--cpp/.traces/copy_multiple_locations12
-rw-r--r--cpp/.traces/divide14
-rw-r--r--cpp/.traces/divide_literal6
-rw-r--r--cpp/.traces/divide_with_remainder16
-rw-r--r--cpp/.traces/divide_with_remainder_literal8
-rw-r--r--cpp/.traces/equal14
-rw-r--r--cpp/.traces/equal214
-rw-r--r--cpp/.traces/factorial32
-rw-r--r--cpp/.traces/first_recipe4
-rw-r--r--cpp/.traces/get14
-rw-r--r--cpp/.traces/get_address14
-rw-r--r--cpp/.traces/get_address_indirect18
-rw-r--r--cpp/.traces/get_handles_nested_record_elements18
-rw-r--r--cpp/.traces/get_indirect18
-rw-r--r--cpp/.traces/greater_or_equal14
-rw-r--r--cpp/.traces/greater_or_equal214
-rw-r--r--cpp/.traces/greater_or_equal314
-rw-r--r--cpp/.traces/greater_than14
-rw-r--r--cpp/.traces/greater_than214
-rw-r--r--cpp/.traces/include_nonderef_properties18
-rw-r--r--cpp/.traces/index22
-rw-r--r--cpp/.traces/index_address22
-rw-r--r--cpp/.traces/index_indirect26
-rw-r--r--cpp/.traces/jump_backward6
-rw-r--r--cpp/.traces/jump_can_skip_instructions6
-rw-r--r--cpp/.traces/jump_if8
-rw-r--r--cpp/.traces/jump_if_fallthrough8
-rw-r--r--cpp/.traces/jump_unless8
-rw-r--r--cpp/.traces/jump_unless_fallthrough8
-rw-r--r--cpp/.traces/lesser_or_equal14
-rw-r--r--cpp/.traces/lesser_or_equal214
-rw-r--r--cpp/.traces/lesser_or_equal314
-rw-r--r--cpp/.traces/lesser_than14
-rw-r--r--cpp/.traces/lesser_than214
-rw-r--r--cpp/.traces/loop12
-rw-r--r--cpp/.traces/loop_label8
-rw-r--r--cpp/.traces/loop_nested18
-rw-r--r--cpp/.traces/loop_unless14
-rw-r--r--cpp/.traces/multiply14
-rw-r--r--cpp/.traces/multiply_literal6
-rw-r--r--cpp/.traces/new14
-rw-r--r--cpp/.traces/new_array16
-rw-r--r--cpp/.traces/next_ingredient10
-rw-r--r--cpp/.traces/not8
-rw-r--r--cpp/.traces/or14
-rw-r--r--cpp/.traces/parse_comment_after_instruction4
-rw-r--r--cpp/.traces/parse_comment_amongst_instruction4
-rw-r--r--cpp/.traces/parse_comment_amongst_instruction24
-rw-r--r--cpp/.traces/parse_comment_amongst_instruction38
-rw-r--r--cpp/.traces/parse_comment_outside_recipe4
-rw-r--r--cpp/.traces/parse_multiple_ingredients8
-rw-r--r--cpp/.traces/parse_multiple_products6
-rw-r--r--cpp/.traces/parse_multiple_properties4
-rw-r--r--cpp/.traces/parse_multiple_types8
-rw-r--r--cpp/.traces/parse_properties4
-rw-r--r--cpp/.traces/reply18
-rw-r--r--cpp/.traces/run_dummy4
-rw-r--r--cpp/.traces/run_label8
-rw-r--r--cpp/.traces/set_default_space12
-rw-r--r--cpp/.traces/store_indirect8
-rw-r--r--cpp/.traces/string_literal4
-rw-r--r--cpp/.traces/subtract14
-rw-r--r--cpp/.traces/subtract_literal6
-rw-r--r--cpp/.traces/surrounding_space24
-rw-r--r--cpp/010vm4
-rw-r--r--cpp/011load56
-rw-r--r--cpp/029string2
92 files changed, 528 insertions, 528 deletions
diff --git a/cpp/.traces/add b/cpp/.traces/add
index 791297a5..88d06d43 100644
--- a/cpp/.traces/add
+++ b/cpp/.traces/add
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 2
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/add_literal b/cpp/.traces/add_literal
index 755cf2c4..5095f7bf 100644
--- a/cpp/.traces/add_literal
+++ b/cpp/.traces/add_literal
@@ -1,7 +1,7 @@
 parse/0: instruction: 2
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: add ...
 run/0: instruction main/0
diff --git a/cpp/.traces/and b/cpp/.traces/and
index 47823ef8..19163733 100644
--- a/cpp/.traces/and
+++ b/cpp/.traces/and
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-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:   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: 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:   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: 7
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/brace_conversion b/cpp/.traces/brace_conversion
index fa3dd47d..2db6bee0 100644
--- a/cpp/.traces/brace_conversion
+++ b/cpp/.traces/brace_conversion
@@ -1,8 +1,8 @@
 parse/0: label: {
 parse/0: instruction: 101
 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:   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: }
 brace/0: 100: push (open, 0)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_cascading b/cpp/.traces/break_cascading
index 6d5cbb82..340589e8 100644
--- a/cpp/.traces/break_cascading
+++ b/cpp/.traces/break_cascading
@@ -1,6 +1,6 @@
 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:   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: 101
 parse/0: label: }
diff --git a/cpp/.traces/break_cascading2 b/cpp/.traces/break_cascading2
index a321fc7e..995bda66 100644
--- a/cpp/.traces/break_cascading2
+++ b/cpp/.traces/break_cascading2
@@ -1,14 +1,14 @@
 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:   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: 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:   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: 101
 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:   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: 101
diff --git a/cpp/.traces/break_empty_block b/cpp/.traces/break_empty_block
index d2f97f93..b43601ac 100644
--- a/cpp/.traces/break_empty_block
+++ b/cpp/.traces/break_empty_block
@@ -1,6 +1,6 @@
 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:   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: 101
 parse/0: label: }
diff --git a/cpp/.traces/break_if b/cpp/.traces/break_if
index c082e6cc..6f8907e7 100644
--- a/cpp/.traces/break_if
+++ b/cpp/.traces/break_if
@@ -1,15 +1,15 @@
 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:   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: 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:   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: 101
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
+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:   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: 102
diff --git a/cpp/.traces/break_label b/cpp/.traces/break_label
index 30aaba9f..c0c939ea 100644
--- a/cpp/.traces/break_label
+++ b/cpp/.traces/break_label
@@ -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:   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: 101
-parse/0:   ingredient: {name: "+foo", value: 0, type: 0, properties: [+foo: offset]}
+parse/0:   ingredient: {name: "+foo", value: 0, type: 0, properties: ["+foo": "offset"]}
 parse/0: label: }
 brace/0: 100: push (open, 1)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_nested b/cpp/.traces/break_nested
index 212dcc63..261d39d1 100644
--- a/cpp/.traces/break_nested
+++ b/cpp/.traces/break_nested
@@ -1,19 +1,19 @@
 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:   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: 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:   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: 101
 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:   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: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "4", value: 0, type: 1, properties: [4: integer]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0: label: }
 brace/0: 100: push (open, 1)
 brace/0: 100: push (open, 4)
diff --git a/cpp/.traces/break_nested_degenerate b/cpp/.traces/break_nested_degenerate
index b8ba5f7e..1838fa75 100644
--- a/cpp/.traces/break_nested_degenerate
+++ b/cpp/.traces/break_nested_degenerate
@@ -1,16 +1,16 @@
 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:   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: 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:   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: 101
 parse/0: label: {
 parse/0: label: }
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "4", value: 0, type: 1, properties: [4: integer]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 parse/0: label: }
 brace/0: 100: push (open, 1)
 brace/0: 100: push (open, 4)
diff --git a/cpp/.traces/break_nested_degenerate2 b/cpp/.traces/break_nested_degenerate2
index 67018166..17339d4f 100644
--- a/cpp/.traces/break_nested_degenerate2
+++ b/cpp/.traces/break_nested_degenerate2
@@ -1,10 +1,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:   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: 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:   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: 101
 parse/0: label: {
 parse/0: label: }
diff --git a/cpp/.traces/break_unless b/cpp/.traces/break_unless
index a9e1778d..605ff6fd 100644
--- a/cpp/.traces/break_unless
+++ b/cpp/.traces/break_unless
@@ -1,15 +1,15 @@
 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:   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: 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:   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: 101
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
+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:   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: }
 brace/0: 100: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/calling_recipe b/cpp/.traces/calling_recipe
index aefedf58..01cba63e 100644
--- a/cpp/.traces/calling_recipe
+++ b/cpp/.traces/calling_recipe
@@ -1,8 +1,8 @@
 parse/0: instruction: 101
 parse/0: instruction: 2
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-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:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: f ...
 after-brace/0: recipe f
diff --git a/cpp/.traces/convert_names b/cpp/.traces/convert_names
index b8ed6d25..94efd274 100644
--- a/cpp/.traces/convert_names
+++ b/cpp/.traces/convert_names
@@ -1,6 +1,6 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "x", value: 0, type: 1, properties: [x: integer]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
 name/0: assign x 1
 after-brace/0: recipe main
 after-brace/0: copy ...
diff --git a/cpp/.traces/convert_names_handles_records b/cpp/.traces/convert_names_handles_records
index b758b1e4..7cc1c8bb 100644
--- a/cpp/.traces/convert_names_handles_records
+++ b/cpp/.traces/convert_names_handles_records
@@ -1,9 +1,9 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "a", value: 0, type: 5, properties: [a: point]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "a", value: 0, type: 5, properties: ["a": "point"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "b", value: 0, type: 1, properties: [b: integer]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "b", value: 0, type: 1, properties: ["b": "integer"]}
 name/0: assign a 1
 name/0: assign b 3
 after-brace/0: recipe main
diff --git a/cpp/.traces/convert_names_passes_default_space b/cpp/.traces/convert_names_passes_default_space
index c291c887..04a3ce44 100644
--- a/cpp/.traces/convert_names_passes_default_space
+++ b/cpp/.traces/convert_names_passes_default_space
@@ -1,7 +1,7 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "default_space", value: 0, type: 1, properties: [default_space: integer]}
-parse/0:   product: {name: "x", value: 0, type: 1, properties: [x: integer]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "default_space", value: 0, type: 1, properties: ["default_space": "integer"]}
+parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
 name/0: assign x 1
 after-brace/0: recipe main
 after-brace/0: copy ...
diff --git a/cpp/.traces/convert_names_passes_dummy b/cpp/.traces/convert_names_passes_dummy
index c836a7aa..4587e3e0 100644
--- a/cpp/.traces/convert_names_passes_dummy
+++ b/cpp/.traces/convert_names_passes_dummy
@@ -1,7 +1,7 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "_", value: 0, type: 0, properties: [_: dummy]}
-parse/0:   product: {name: "x", value: 0, type: 1, properties: [x: integer]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
+parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer"]}
 name/0: assign x 1
 after-brace/0: recipe main
 after-brace/0: copy ...
diff --git a/cpp/.traces/convert_names_passes_raw b/cpp/.traces/convert_names_passes_raw
index c97b23ab..58b83277 100644
--- a/cpp/.traces/convert_names_passes_raw
+++ b/cpp/.traces/convert_names_passes_raw
@@ -1,6 +1,6 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "x", value: 0, type: 1, properties: [x: integer, raw: ]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "x", value: 0, type: 1, properties: ["x": "integer", "raw": ]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 run/0: instruction main/0
diff --git a/cpp/.traces/convert_names_transforms_record_elements b/cpp/.traces/convert_names_transforms_record_elements
index a563eecc..fca15808 100644
--- a/cpp/.traces/convert_names_transforms_record_elements
+++ b/cpp/.traces/convert_names_transforms_record_elements
@@ -1,11 +1,11 @@
 parse/0: instruction: 18
-parse/0:   ingredient: {name: "0", value: 0, type: 5, 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:   ingredient: {name: "0", value: 0, type: 5, 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:   ingredient: {name: "0", value: 0, type: 5, 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]}
+parse/0:   ingredient: {name: "0", value: 0, type: 5, 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"]}
 name/0: field y of type point is at offset 1
 name/0: assign a 1
 name/0: field x of type point is at offset 0
diff --git a/cpp/.traces/copy b/cpp/.traces/copy
index 3005054c..acaa8bf0 100644
--- a/cpp/.traces/copy
+++ b/cpp/.traces/copy
@@ -1,9 +1,9 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {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]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/copy_array b/cpp/.traces/copy_array
index 3b1af366..3fa366c5 100644
--- a/cpp/.traces/copy_array
+++ b/cpp/.traces/copy_array
@@ -1,18 +1,18 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: [14: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: [15: literal]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
+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:   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: 1
-parse/0:   ingredient: {name: "1", value: 0, type: 4-1, properties: [1: array:integer]}
-parse/0:   product: {name: "5", value: 0, type: 4-1, properties: [5: array:integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 4-1, properties: ["1": "array":"integer"]}
+parse/0:   product: {name: "5", value: 0, type: 4-1, properties: ["5": "array":"integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/copy_handles_nested_record_elements b/cpp/.traces/copy_handles_nested_record_elements
index e00667b7..62861f27 100644
--- a/cpp/.traces/copy_handles_nested_record_elements
+++ b/cpp/.traces/copy_handles_nested_record_elements
@@ -1,15 +1,15 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "12", value: 0, type: 1, properties: [12: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+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:   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: 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:   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: 1
-parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: [12: point-integer]}
-parse/0:   product: {name: "15", value: 0, type: 6, properties: [15: point-integer]}
+parse/0:   ingredient: {name: "12", value: 0, type: 6, properties: ["12": "point-integer"]}
+parse/0:   product: {name: "15", value: 0, type: 6, properties: ["15": "point-integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/copy_indirect b/cpp/.traces/copy_indirect
index c6d0b54c..e2bb8bdd 100644
--- a/cpp/.traces/copy_indirect
+++ b/cpp/.traces/copy_indirect
@@ -1,12 +1,12 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 2-1, properties: [1: address:integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: [1: address:integer, deref: ]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "deref": ]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/copy_literal b/cpp/.traces/copy_literal
index 7e812f2c..c587d0f7 100644
--- a/cpp/.traces/copy_literal
+++ b/cpp/.traces/copy_literal
@@ -1,6 +1,6 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 run/0: instruction main/0
diff --git a/cpp/.traces/copy_multiple_locations b/cpp/.traces/copy_multiple_locations
index 5cf623e2..2012361e 100644
--- a/cpp/.traces/copy_multiple_locations
+++ b/cpp/.traces/copy_multiple_locations
@@ -1,12 +1,12 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 0, type: 5, properties: [1: point]}
-parse/0:   product: {name: "3", value: 0, type: 5, properties: [3: point]}
+parse/0:   ingredient: {name: "1", value: 0, type: 5, properties: ["1": "point"]}
+parse/0:   product: {name: "3", value: 0, type: 5, properties: ["3": "point"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/divide b/cpp/.traces/divide
index 4e80b55d..2bb1f5b0 100644
--- a/cpp/.traces/divide
+++ b/cpp/.traces/divide
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "27", value: 0, type: 0, properties: [27: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "27", value: 0, type: 0, properties: ["27": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 5
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/divide_literal b/cpp/.traces/divide_literal
index c45bd661..deba8b6a 100644
--- a/cpp/.traces/divide_literal
+++ b/cpp/.traces/divide_literal
@@ -1,7 +1,7 @@
 parse/0: instruction: 5
-parse/0:   ingredient: {name: "8", value: 0, type: 0, properties: [8: literal]}
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "8", value: 0, type: 0, properties: ["8": "literal"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: divide ...
 run/0: instruction main/0
diff --git a/cpp/.traces/divide_with_remainder b/cpp/.traces/divide_with_remainder
index 38d40c9c..867b2c0d 100644
--- a/cpp/.traces/divide_with_remainder
+++ b/cpp/.traces/divide_with_remainder
@@ -1,14 +1,14 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "27", value: 0, type: 0, properties: [27: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "27", value: 0, type: 0, properties: ["27": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "11", value: 0, type: 0, properties: [11: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "11", value: 0, type: 0, properties: ["11": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 6
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-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:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
+parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/divide_with_remainder_literal b/cpp/.traces/divide_with_remainder_literal
index 13f41d9f..8cb01953 100644
--- a/cpp/.traces/divide_with_remainder_literal
+++ b/cpp/.traces/divide_with_remainder_literal
@@ -1,8 +1,8 @@
 parse/0: instruction: 6
-parse/0:   ingredient: {name: "9", value: 0, type: 0, properties: [9: literal]}
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "9", value: 0, type: 0, properties: ["9": "literal"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
 after-brace/0: divide_with_remainder ...
 run/0: instruction main/0
diff --git a/cpp/.traces/equal b/cpp/.traces/equal
index b44ac6bc..87960ead 100644
--- a/cpp/.traces/equal
+++ b/cpp/.traces/equal
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 13
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/equal2 b/cpp/.traces/equal2
index ecbcf102..90eada03 100644
--- a/cpp/.traces/equal2
+++ b/cpp/.traces/equal2
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 13
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/factorial b/cpp/.traces/factorial
index 9708c6e3..4b90d290 100644
--- a/cpp/.traces/factorial
+++ b/cpp/.traces/factorial
@@ -1,29 +1,29 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: [5: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: label: {
 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:   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: 101
-parse/0:   ingredient: {name: "3", value: 0, type: 3, properties: [3: boolean]}
+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]}
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 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:   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: 102
 parse/0: label: }
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "4", value: 0, type: 1, properties: [4: integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
 brace/0: 100: push (open, 2)
 brace/0: push (close, 8)
 after-brace/0: recipe factorial
diff --git a/cpp/.traces/first_recipe b/cpp/.traces/first_recipe
index 3ca1f8f4..5fc3dbfd 100644
--- a/cpp/.traces/first_recipe
+++ b/cpp/.traces/first_recipe
@@ -1,3 +1,3 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/get b/cpp/.traces/get
index ee6cc6a6..683c03fd 100644
--- a/cpp/.traces/get
+++ b/cpp/.traces/get
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "12", value: 0, type: 1, properties: [12: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+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:   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:   ingredient: {name: "12", value: 0, type: 5, 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]}
+parse/0:   ingredient: {name: "12", value: 0, type: 5, 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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/get_address b/cpp/.traces/get_address
index aaab6c0e..3ec7c7bc 100644
--- a/cpp/.traces/get_address
+++ b/cpp/.traces/get_address
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "12", value: 0, type: 1, properties: [12: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+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:   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:   ingredient: {name: "12", value: 0, type: 5, 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]}
+parse/0:   ingredient: {name: "12", value: 0, type: 5, 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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/get_address_indirect b/cpp/.traces/get_address_indirect
index ef1d9365..c7a2dfd7 100644
--- a/cpp/.traces/get_address_indirect
+++ b/cpp/.traces/get_address_indirect
@@ -1,16 +1,16 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+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:   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:   ingredient: {name: "1", value: 0, type: 2-5, 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]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5, 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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/get_handles_nested_record_elements b/cpp/.traces/get_handles_nested_record_elements
index eeb1558d..e048dbd2 100644
--- a/cpp/.traces/get_handles_nested_record_elements
+++ b/cpp/.traces/get_handles_nested_record_elements
@@ -1,16 +1,16 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "12", value: 0, type: 1, properties: [12: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+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:   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: 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:   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:   ingredient: {name: "12", value: 0, type: 6, 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]}
+parse/0:   ingredient: {name: "12", value: 0, type: 6, 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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/get_indirect b/cpp/.traces/get_indirect
index 7624acc1..9f0c38b5 100644
--- a/cpp/.traces/get_indirect
+++ b/cpp/.traces/get_indirect
@@ -1,16 +1,16 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+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:   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:   ingredient: {name: "1", value: 0, type: 2-5, 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]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5, 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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/greater_or_equal b/cpp/.traces/greater_or_equal
index 201ee58d..eb2a71a3 100644
--- a/cpp/.traces/greater_or_equal
+++ b/cpp/.traces/greater_or_equal
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 16
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/greater_or_equal2 b/cpp/.traces/greater_or_equal2
index 53ae7103..048630c8 100644
--- a/cpp/.traces/greater_or_equal2
+++ b/cpp/.traces/greater_or_equal2
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 16
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/greater_or_equal3 b/cpp/.traces/greater_or_equal3
index 537c15b7..8aa418bc 100644
--- a/cpp/.traces/greater_or_equal3
+++ b/cpp/.traces/greater_or_equal3
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "35", value: 0, type: 0, properties: ["35": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 16
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/greater_than b/cpp/.traces/greater_than
index 3270a580..54d309f7 100644
--- a/cpp/.traces/greater_than
+++ b/cpp/.traces/greater_than
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 14
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/greater_than2 b/cpp/.traces/greater_than2
index 723816e0..bd2f6b9f 100644
--- a/cpp/.traces/greater_than2
+++ b/cpp/.traces/greater_than2
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 14
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/include_nonderef_properties b/cpp/.traces/include_nonderef_properties
index 4c0b69dd..77d3a94e 100644
--- a/cpp/.traces/include_nonderef_properties
+++ b/cpp/.traces/include_nonderef_properties
@@ -1,16 +1,16 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+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:   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:   ingredient: {name: "1", value: 0, type: 2-5, 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]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-5, 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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/index b/cpp/.traces/index
index 8bb37551..685ad173 100644
--- a/cpp/.traces/index
+++ b/cpp/.traces/index
@@ -1,19 +1,19 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: [14: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: [15: literal]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
+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:   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:   ingredient: {name: "1", value: 0, type: 4-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]}
+parse/0:   ingredient: {name: "1", value: 0, type: 4-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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/index_address b/cpp/.traces/index_address
index 2c405958..c6f3ce4a 100644
--- a/cpp/.traces/index_address
+++ b/cpp/.traces/index_address
@@ -1,19 +1,19 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: [14: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: [15: literal]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
+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:   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:   ingredient: {name: "1", value: 0, type: 4-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]}
+parse/0:   ingredient: {name: "1", value: 0, type: 4-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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/index_indirect b/cpp/.traces/index_indirect
index 784daf9a..428e3f56 100644
--- a/cpp/.traces/index_indirect
+++ b/cpp/.traces/index_indirect
@@ -1,22 +1,22 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: [14: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "14", value: 0, type: 0, properties: ["14": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: [15: literal]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "15", value: 0, type: 0, properties: ["15": "literal"]}
+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:   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: 1
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "5", value: 0, type: 2-4-1, properties: [5: address:array:integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "5", value: 0, type: 2-4-1, properties: ["5": "address":"array":"integer"]}
 parse/0: instruction: 20
-parse/0:   ingredient: {name: "5", value: 0, type: 2-4-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]}
+parse/0:   ingredient: {name: "5", value: 0, type: 2-4-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"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/jump_backward b/cpp/.traces/jump_backward
index 4b9f17df..09a861a9 100644
--- a/cpp/.traces/jump_backward
+++ b/cpp/.traces/jump_backward
@@ -1,9 +1,9 @@
 parse/0: instruction: 10
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: offset]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0: instruction: 10
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: offset]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0: instruction: 10
-parse/0:   ingredient: {name: "-2", value: 0, type: 0, properties: [-2: offset]}
+parse/0:   ingredient: {name: "-2", value: 0, type: 0, properties: ["-2": "offset"]}
 after-brace/0: recipe main
 after-brace/0: jump ...
 after-brace/0: jump ...
diff --git a/cpp/.traces/jump_can_skip_instructions b/cpp/.traces/jump_can_skip_instructions
index 3a42a0f1..3cffa226 100644
--- a/cpp/.traces/jump_can_skip_instructions
+++ b/cpp/.traces/jump_can_skip_instructions
@@ -1,8 +1,8 @@
 parse/0: instruction: 10
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: offset]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0: instruction: 1
-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:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: jump ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/jump_if b/cpp/.traces/jump_if
index 1d0d7739..328e74c7 100644
--- a/cpp/.traces/jump_if
+++ b/cpp/.traces/jump_if
@@ -1,9 +1,9 @@
 parse/0: instruction: 11
-parse/0:   ingredient: {name: "999", value: 0, type: 0, properties: [999: literal]}
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: offset]}
+parse/0:   ingredient: {name: "999", value: 0, type: 0, properties: ["999": "literal"]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0: instruction: 1
-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:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: jump-if ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/jump_if_fallthrough b/cpp/.traces/jump_if_fallthrough
index 2d1119cc..1c4753d1 100644
--- a/cpp/.traces/jump_if_fallthrough
+++ b/cpp/.traces/jump_if_fallthrough
@@ -1,9 +1,9 @@
 parse/0: instruction: 11
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: offset]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "123", value: 0, type: 1, properties: [123: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "123", value: 0, type: 1, properties: ["123": "integer"]}
 after-brace/0: recipe main
 after-brace/0: jump-if ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/jump_unless b/cpp/.traces/jump_unless
index 62fc389a..fc794cd2 100644
--- a/cpp/.traces/jump_unless
+++ b/cpp/.traces/jump_unless
@@ -1,9 +1,9 @@
 parse/0: instruction: 12
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: offset]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0: instruction: 1
-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:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: jump-unless ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/jump_unless_fallthrough b/cpp/.traces/jump_unless_fallthrough
index dc1a7c40..7ab74af2 100644
--- a/cpp/.traces/jump_unless_fallthrough
+++ b/cpp/.traces/jump_unless_fallthrough
@@ -1,9 +1,9 @@
 parse/0: instruction: 12
-parse/0:   ingredient: {name: "999", value: 0, type: 0, properties: [999: literal]}
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: offset]}
+parse/0:   ingredient: {name: "999", value: 0, type: 0, properties: ["999": "literal"]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "offset"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "123", value: 0, type: 1, properties: [123: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 0, properties: ["1": "literal"]}
+parse/0:   product: {name: "123", value: 0, type: 1, properties: ["123": "integer"]}
 after-brace/0: recipe main
 after-brace/0: jump-unless ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/lesser_or_equal b/cpp/.traces/lesser_or_equal
index bc747e14..c82f7c7f 100644
--- a/cpp/.traces/lesser_or_equal
+++ b/cpp/.traces/lesser_or_equal
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: [32: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: ["32": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 17
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/lesser_or_equal2 b/cpp/.traces/lesser_or_equal2
index dea05c02..74dac1f6 100644
--- a/cpp/.traces/lesser_or_equal2
+++ b/cpp/.traces/lesser_or_equal2
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 17
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/lesser_or_equal3 b/cpp/.traces/lesser_or_equal3
index 9c30cc23..1becdf6a 100644
--- a/cpp/.traces/lesser_or_equal3
+++ b/cpp/.traces/lesser_or_equal3
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 17
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/lesser_than b/cpp/.traces/lesser_than
index 33bef26c..9628c081 100644
--- a/cpp/.traces/lesser_than
+++ b/cpp/.traces/lesser_than
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: [32: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: ["32": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 15
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/lesser_than2 b/cpp/.traces/lesser_than2
index d82b89fc..dc373a53 100644
--- a/cpp/.traces/lesser_than2
+++ b/cpp/.traces/lesser_than2
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 15
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/loop b/cpp/.traces/loop
index 2600600d..4191e4df 100644
--- a/cpp/.traces/loop
+++ b/cpp/.traces/loop
@@ -1,13 +1,13 @@
 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:   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: 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:   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: 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:   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: 101
 parse/0: label: }
 brace/0: 100: push (open, 2)
diff --git a/cpp/.traces/loop_label b/cpp/.traces/loop_label
index 990c175f..b0c4c2a8 100644
--- a/cpp/.traces/loop_label
+++ b/cpp/.traces/loop_label
@@ -1,10 +1,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:   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: +foo
 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:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/loop_nested b/cpp/.traces/loop_nested
index 40fc1441..1eba2a21 100644
--- a/cpp/.traces/loop_nested
+++ b/cpp/.traces/loop_nested
@@ -1,20 +1,20 @@
 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:   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: 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:   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: 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:   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: 101
-parse/0:   ingredient: {name: "4", value: 0, type: 3, properties: [4: boolean]}
+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]}
-parse/0:   product: {name: "5", value: 0, type: 1, properties: [5: 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"]}
 parse/0: label: }
 brace/0: 100: push (open, 1)
 brace/0: 100: push (open, 3)
diff --git a/cpp/.traces/loop_unless b/cpp/.traces/loop_unless
index a33c9374..2de78b4a 100644
--- a/cpp/.traces/loop_unless
+++ b/cpp/.traces/loop_unless
@@ -1,15 +1,15 @@
 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:   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: 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:   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: 101
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
+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:   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: }
 brace/0: 100: push (open, 2)
 brace/0: push (close, 5)
diff --git a/cpp/.traces/multiply b/cpp/.traces/multiply
index c4e3d986..438ec231 100644
--- a/cpp/.traces/multiply
+++ b/cpp/.traces/multiply
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "4", value: 0, type: 0, properties: [4: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "4", value: 0, type: 0, properties: ["4": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "6", value: 0, type: 0, properties: [6: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "6", value: 0, type: 0, properties: ["6": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 4
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/multiply_literal b/cpp/.traces/multiply_literal
index 95134fea..7bbcfb3a 100644
--- a/cpp/.traces/multiply_literal
+++ b/cpp/.traces/multiply_literal
@@ -1,7 +1,7 @@
 parse/0: instruction: 4
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   ingredient: {name: "3", value: 0, type: 0, properties: ["3": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: multiply ...
 run/0: instruction main/0
diff --git a/cpp/.traces/new b/cpp/.traces/new
index c76e910b..d2e291d7 100644
--- a/cpp/.traces/new
+++ b/cpp/.traces/new
@@ -1,13 +1,13 @@
 parse/0: instruction: 24
-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:   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: 24
-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:   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
-parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: [1: address:integer, raw: ]}
-parse/0:   ingredient: {name: "2", value: 0, type: 2-1, properties: [2: address:integer, raw: ]}
-parse/0:   product: {name: "3", value: 0, type: 3, properties: [3: boolean, raw: ]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "raw": ]}
+parse/0:   ingredient: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
+parse/0:   product: {name: "3", value: 0, type: 3, properties: ["3": "boolean", "raw": ]}
 new/0: integer -> 1
 new/0: integer -> 1
 after-brace/0: recipe main
diff --git a/cpp/.traces/new_array b/cpp/.traces/new_array
index 2fc43f51..6070d166 100644
--- a/cpp/.traces/new_array
+++ b/cpp/.traces/new_array
@@ -1,14 +1,14 @@
 parse/0: instruction: 24
-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-4-1, properties: [1: address:array:integer, raw: ]}
+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-4-1, properties: ["1": "address":"array":"integer", "raw": ]}
 parse/0: instruction: 24
-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:   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
-parse/0:   ingredient: {name: "2", value: 0, type: 2-1, properties: [2: address:integer, raw: ]}
-parse/0:   ingredient: {name: "1", value: 0, type: 2-4-1, properties: [1: address:array:integer, raw: ]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer, raw: ]}
+parse/0:   ingredient: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer", "raw": ]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-4-1, properties: ["1": "address":"array":"integer", "raw": ]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer", "raw": ]}
 new/0: integer -> 1
 new/0: integer -> 1
 after-brace/0: recipe main
diff --git a/cpp/.traces/next_ingredient b/cpp/.traces/next_ingredient
index bcd6f45e..d1a3adfd 100644
--- a/cpp/.traces/next_ingredient
+++ b/cpp/.traces/next_ingredient
@@ -1,11 +1,11 @@
 parse/0: instruction: 101
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
 parse/0: instruction: 22
-parse/0:   product: {name: "12", value: 0, type: 1, properties: [12: integer]}
+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:   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"]}
 after-brace/0: recipe main
 after-brace/0: f ...
 after-brace/0: recipe f
diff --git a/cpp/.traces/not b/cpp/.traces/not
index 6a466f32..ed2222e6 100644
--- a/cpp/.traces/not
+++ b/cpp/.traces/not
@@ -1,9 +1,9 @@
 parse/0: instruction: 1
-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:   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: 9
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: not ...
diff --git a/cpp/.traces/or b/cpp/.traces/or
index 0cfbced4..c11ba07a 100644
--- a/cpp/.traces/or
+++ b/cpp/.traces/or
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-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:   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: 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:   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: 8
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/parse_comment_after_instruction b/cpp/.traces/parse_comment_after_instruction
index 3ca1f8f4..5fc3dbfd 100644
--- a/cpp/.traces/parse_comment_after_instruction
+++ b/cpp/.traces/parse_comment_after_instruction
@@ -1,3 +1,3 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_comment_amongst_instruction b/cpp/.traces/parse_comment_amongst_instruction
index 3ca1f8f4..5fc3dbfd 100644
--- a/cpp/.traces/parse_comment_amongst_instruction
+++ b/cpp/.traces/parse_comment_amongst_instruction
@@ -1,3 +1,3 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_comment_amongst_instruction2 b/cpp/.traces/parse_comment_amongst_instruction2
index 3ca1f8f4..5fc3dbfd 100644
--- a/cpp/.traces/parse_comment_amongst_instruction2
+++ b/cpp/.traces/parse_comment_amongst_instruction2
@@ -1,3 +1,3 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_comment_amongst_instruction3 b/cpp/.traces/parse_comment_amongst_instruction3
index 6df04dee..bcd82cfb 100644
--- a/cpp/.traces/parse_comment_amongst_instruction3
+++ b/cpp/.traces/parse_comment_amongst_instruction3
@@ -1,6 +1,6 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/parse_comment_outside_recipe b/cpp/.traces/parse_comment_outside_recipe
index 3ca1f8f4..5fc3dbfd 100644
--- a/cpp/.traces/parse_comment_outside_recipe
+++ b/cpp/.traces/parse_comment_outside_recipe
@@ -1,3 +1,3 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_multiple_ingredients b/cpp/.traces/parse_multiple_ingredients
index 8b18e719..c94b33e7 100644
--- a/cpp/.traces/parse_multiple_ingredients
+++ b/cpp/.traces/parse_multiple_ingredients
@@ -1,5 +1,5 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   ingredient: {name: "4", value: 0, type: 1, properties: [4: integer]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/parse_multiple_products b/cpp/.traces/parse_multiple_products
index 83970be9..fed63a5d 100644
--- a/cpp/.traces/parse_multiple_products
+++ b/cpp/.traces/parse_multiple_products
@@ -1,4 +1,4 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
diff --git a/cpp/.traces/parse_multiple_properties b/cpp/.traces/parse_multiple_properties
index c18265b2..77a2916d 100644
--- a/cpp/.traces/parse_multiple_properties
+++ b/cpp/.traces/parse_multiple_properties
@@ -1,3 +1,3 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal, foo: bar:baz]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal", "foo": "bar":"baz"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
diff --git a/cpp/.traces/parse_multiple_types b/cpp/.traces/parse_multiple_types
index 8230f9ac..a0c075d6 100644
--- a/cpp/.traces/parse_multiple_types
+++ b/cpp/.traces/parse_multiple_types
@@ -1,5 +1,5 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   ingredient: {name: "4", value: 0, type: 1, properties: [4: integer]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 0, type: 2-1, properties: [2: address:integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer"]}
diff --git a/cpp/.traces/parse_properties b/cpp/.traces/parse_properties
index c72f91b4..242ee0e4 100644
--- a/cpp/.traces/parse_properties
+++ b/cpp/.traces/parse_properties
@@ -1,3 +1,3 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1-2, properties: [1: integer:address, deref: ]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1-2, properties: ["1": "integer":"address", "deref": ]}
diff --git a/cpp/.traces/reply b/cpp/.traces/reply
index b75224fd..86ed6d2c 100644
--- a/cpp/.traces/reply
+++ b/cpp/.traces/reply
@@ -1,16 +1,16 @@
 parse/0: instruction: 101
-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:   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: 22
-parse/0:   product: {name: "12", value: 0, type: 1, properties: [12: integer]}
+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:   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: 23
-parse/0:   ingredient: {name: "12", value: 0, type: 1, properties: [12: integer]}
-parse/0:   ingredient: {name: "13", value: 0, type: 1, properties: [13: integer]}
+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
 after-brace/0: f ...
 after-brace/0: recipe f
diff --git a/cpp/.traces/run_dummy b/cpp/.traces/run_dummy
index 0fe1b491..a64f4467 100644
--- a/cpp/.traces/run_dummy
+++ b/cpp/.traces/run_dummy
@@ -1,6 +1,6 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "_", value: 0, type: 0, properties: [_: dummy]}
+parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: ["0": "literal"]}
+parse/0:   product: {name: "_", value: 0, type: 0, properties: ["_": "dummy"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 run/0: instruction main/0
diff --git a/cpp/.traces/run_label b/cpp/.traces/run_label
index 2a853c54..0b2103ad 100644
--- a/cpp/.traces/run_label
+++ b/cpp/.traces/run_label
@@ -1,10 +1,10 @@
 parse/0: label: +foo
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {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]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/set_default_space b/cpp/.traces/set_default_space
index 3292565f..618aeb19 100644
--- a/cpp/.traces/set_default_space
+++ b/cpp/.traces/set_default_space
@@ -1,12 +1,12 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: [5: literal]}
-parse/0:   product: {name: "10", value: 0, type: 1, properties: [10: integer]}
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
+parse/0:   product: {name: "10", value: 0, type: 1, properties: ["10": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: [10: literal]}
-parse/0:   product: {name: "default-space", value: 0, type: 2-0, properties: [default-space: address:space]}
+parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: ["10": "literal"]}
+parse/0:   product: {name: "default-space", value: 0, type: 2-0, properties: ["default-space": "address":"space"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 name/0: assign default-space 1
 after-brace/0: recipe main
 after-brace/0: copy ...
diff --git a/cpp/.traces/store_indirect b/cpp/.traces/store_indirect
index 165a8c07..546ad01f 100644
--- a/cpp/.traces/store_indirect
+++ b/cpp/.traces/store_indirect
@@ -1,9 +1,9 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 2-1, properties: [1: address:integer]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 0, type: 2-1, properties: [1: address:integer, deref: ]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 2-1, properties: ["1": "address":"integer", "deref": ]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/string_literal b/cpp/.traces/string_literal
index d07ce441..b989b04a 100644
--- a/cpp/.traces/string_literal
+++ b/cpp/.traces/string_literal
@@ -1,6 +1,6 @@
 parse/0: instruction: 24
-parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: [abc def: literal-string]}
-parse/0:   product: {name: "s", value: 0, type: 2-4-0, properties: [s: address:array:character]}
+parse/0:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
+parse/0:   product: {name: "s", value: 0, type: 2-4-0, properties: ["s": "address":"array":"character"]}
 new/0: abc def -> 0
 name/0: assign s 1
 after-brace/0: recipe main
diff --git a/cpp/.traces/subtract b/cpp/.traces/subtract
index e6cddc03..2342365e 100644
--- a/cpp/.traces/subtract
+++ b/cpp/.traces/subtract
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
+parse/0:   ingredient: {name: "34", value: 0, type: 0, properties: ["34": "literal"]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 parse/0: instruction: 3
-parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
+parse/0:   ingredient: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: ["3": "integer"]}
 after-brace/0: recipe main
 after-brace/0: copy ...
 after-brace/0: copy ...
diff --git a/cpp/.traces/subtract_literal b/cpp/.traces/subtract_literal
index f4f50afb..a1a10250 100644
--- a/cpp/.traces/subtract_literal
+++ b/cpp/.traces/subtract_literal
@@ -1,7 +1,7 @@
 parse/0: instruction: 3
-parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: [5: literal]}
-parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
+parse/0:   ingredient: {name: "2", value: 0, type: 0, properties: ["2": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 after-brace/0: recipe main
 after-brace/0: subtract ...
 run/0: instruction main/0
diff --git a/cpp/.traces/surrounding_space b/cpp/.traces/surrounding_space
index baf29200..87391ba7 100644
--- a/cpp/.traces/surrounding_space
+++ b/cpp/.traces/surrounding_space
@@ -1,21 +1,21 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: [5: literal]}
-parse/0:   product: {name: "10", value: 0, type: 1, properties: [10: integer]}
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
+parse/0:   product: {name: "10", value: 0, type: 1, properties: ["10": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: [5: literal]}
-parse/0:   product: {name: "20", value: 0, type: 1, properties: [20: integer]}
+parse/0:   ingredient: {name: "5", value: 0, type: 0, properties: ["5": "literal"]}
+parse/0:   product: {name: "20", value: 0, type: 1, properties: ["20": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: [10: literal]}
-parse/0:   product: {name: "default-space", value: 0, type: 2-0, properties: [default-space: address:space]}
+parse/0:   ingredient: {name: "10", value: 0, type: 0, properties: ["10": "literal"]}
+parse/0:   product: {name: "default-space", value: 0, type: 2-0, properties: ["default-space": "address":"space"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "20", value: 0, type: 0, properties: [20: literal]}
-parse/0:   product: {name: "0", value: 0, type: 2-0, properties: [0: address:space]}
+parse/0:   ingredient: {name: "20", value: 0, type: 0, properties: ["20": "literal"]}
+parse/0:   product: {name: "0", value: 0, type: 2-0, properties: ["0": "address":"space"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: [32: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
+parse/0:   ingredient: {name: "32", value: 0, type: 0, properties: ["32": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer, space: 1]}
+parse/0:   ingredient: {name: "33", value: 0, type: 0, properties: ["33": "literal"]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer", "space": "1"]}
 name/0: assign default-space 1
 after-brace/0: recipe main
 after-brace/0: copy ...
diff --git a/cpp/010vm b/cpp/010vm
index 966b095e..5c8e120c 100644
--- a/cpp/010vm
+++ b/cpp/010vm
@@ -184,9 +184,9 @@ void setup_recipes() {
     if (!properties.empty()) {
       out << ", properties: [";
       for (size_t i = 0; i < properties.size(); ++i) {
-        out << properties[i].first << ": ";
+        out << "\"" << properties[i].first << "\": ";
         for (size_t j = 0; j < properties[i].second.size(); ++j) {
-          out << properties[i].second[j];
+          out << "\"" << properties[i].second[j] << "\"";
           if (j < properties[i].second.size()-1) out << ":";
         }
         if (i < properties.size()-1) out << ", ";
diff --git a/cpp/011load b/cpp/011load
index 1e86ae3d..27ccb17d 100644
--- a/cpp/011load
+++ b/cpp/011load
@@ -5,8 +5,8 @@ recipe main [
   1:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
 :(code)
 vector<recipe_number> add_recipes(string form) {
@@ -167,8 +167,8 @@ recipe main [
   1:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
 :(scenario parse_comment_amongst_instruction)
 recipe main [
@@ -176,8 +176,8 @@ recipe main [
   1:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
 :(scenario parse_comment_amongst_instruction2)
 recipe main [
@@ -186,8 +186,8 @@ recipe main [
   # comment
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
 :(scenario parse_comment_amongst_instruction3)
 recipe main [
@@ -196,19 +196,19 @@ recipe main [
   2:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 
 :(scenario parse_comment_after_instruction)
 recipe main [
   1:integer <- copy 23:literal  # comment
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
 :(scenario parse_label)
 recipe main [
@@ -222,40 +222,40 @@ recipe main [
   1:integer <- copy 23:literal/foo:bar:baz
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal, foo: bar:baz]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal", "foo": "bar":"baz"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
 
 :(scenario parse_multiple_products)
 recipe main [
   1:integer, 2:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
-+parse:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
++parse:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 
 :(scenario parse_multiple_ingredients)
 recipe main [
   1:integer, 2:integer <- copy 23:literal, 4:integer
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   ingredient: {name: "4", value: 0, type: 1, properties: [4: integer]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
-+parse:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
++parse:   product: {name: "2", value: 0, type: 1, properties: ["2": "integer"]}
 
 :(scenario parse_multiple_types)
 recipe main [
   1:integer, 2:address:integer <- copy 23:literal, 4:integer
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 0, type: 0, properties: [23: literal]}
-+parse:   ingredient: {name: "4", value: 0, type: 1, properties: [4: integer]}
-+parse:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
-+parse:   product: {name: "2", value: 0, type: 2-1, properties: [2: address:integer]}
++parse:   ingredient: {name: "23", value: 0, type: 0, properties: ["23": "literal"]}
++parse:   ingredient: {name: "4", value: 0, type: 1, properties: ["4": "integer"]}
++parse:   product: {name: "1", value: 0, type: 1, properties: ["1": "integer"]}
++parse:   product: {name: "2", value: 0, type: 2-1, properties: ["2": "address":"integer"]}
 
 :(scenario parse_properties)
 recipe main [
   1:integer:address/deref <- copy 23:literal
 ]
-+parse:   product: {name: "1", value: 0, type: 1-2, properties: [1: integer:address, deref: ]}
++parse:   product: {name: "1", value: 0, type: 1-2, properties: ["1": "integer":"address", "deref": ]}
diff --git a/cpp/029string b/cpp/029string
index 4379c8ec..fd6b2824 100644
--- a/cpp/029string
+++ b/cpp/029string
@@ -2,7 +2,7 @@
 recipe main [
   s:address:array:character <- new [abc def]
 ]
-+parse:   ingredient: {name: "abc def", value: 0, type: 0, properties: [abc def: literal-string]}
++parse:   ingredient: {name: "abc def", value: 0, type: 0, properties: ["abc def": "literal-string"]}
 
 :(before "End Mu Types Initialization")
 Type_number["literal-string"] = 0;