about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2015-03-17 11:23:29 -0700
committerKartik K. Agaram <vc@akkartik.com>2015-03-17 13:19:20 -0700
commit3ba6357924e1098a28e43c94a4573a3d2978b5e9 (patch)
tree9a5a4b181a82a77646b1c9d796bdd8b4159dc337
parent5f0e4762468c412d57fb54236a0ee90e23a2cb14 (diff)
downloadmu-3ba6357924e1098a28e43c94a4573a3d2978b5e9.tar.gz
949 - paving the way for jumps to labels
Addresses for reagents are now computed after all transforms.
-rw-r--r--cpp/.traces/add14
-rw-r--r--cpp/.traces/add_literal6
-rw-r--r--cpp/.traces/and12
-rw-r--r--cpp/.traces/brace_conversion2
-rw-r--r--cpp/.traces/break_cascading2
-rw-r--r--cpp/.traces/break_cascading26
-rw-r--r--cpp/.traces/break_empty_block2
-rw-r--r--cpp/.traces/break_if8
-rw-r--r--cpp/.traces/break_label8
-rw-r--r--cpp/.traces/break_nested8
-rw-r--r--cpp/.traces/break_nested_degenerate6
-rw-r--r--cpp/.traces/break_nested_degenerate24
-rw-r--r--cpp/.traces/calling_recipe6
-rw-r--r--cpp/.traces/copy8
-rw-r--r--cpp/.traces/copy_array20
-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/first_recipe4
-rw-r--r--cpp/.traces/get15
-rw-r--r--cpp/.traces/get_address14
-rw-r--r--cpp/.traces/get_address_indirect16
-rw-r--r--cpp/.traces/get_handles_record_fields19
-rw-r--r--cpp/.traces/get_indirect17
-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/index20
-rw-r--r--cpp/.traces/index_address20
-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_fallthrough6
-rw-r--r--cpp/.traces/jump_unless6
-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/loop6
-rw-r--r--cpp/.traces/multiply14
-rw-r--r--cpp/.traces/multiply_literal6
-rw-r--r--cpp/.traces/next_ingredient10
-rw-r--r--cpp/.traces/not8
-rw-r--r--cpp/.traces/or12
-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_label8
-rw-r--r--cpp/.traces/store_indirect8
-rw-r--r--cpp/.traces/subtract14
-rw-r--r--cpp/.traces/subtract_literal6
-rw-r--r--cpp/010vm5
-rw-r--r--cpp/011load56
-rw-r--r--cpp/012transform26
-rw-r--r--cpp/013run4
-rw-r--r--cpp/016jump6
-rw-r--r--cpp/018record9
-rw-r--r--cpp/019address28
-rw-r--r--cpp/020array23
-rw-r--r--cpp/024brace4
78 files changed, 433 insertions, 409 deletions
diff --git a/cpp/.traces/add b/cpp/.traces/add
index 59515bf1..ff1c01b5 100644
--- a/cpp/.traces/add
+++ b/cpp/.traces/add
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 dc2755f2..a111878f 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: 23, type: 0, properties: [23: literal]}
-parse/0:   ingredient: {name: "34", value: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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 0b259036..73efbe72 100644
--- a/cpp/.traces/and
+++ b/cpp/.traces/and
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 2, type: 1, properties: [2: integer]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
 parse/0: instruction: 7
-parse/0:   ingredient: {name: "1", value: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 b00da286..2c082bad 100644
--- a/cpp/.traces/brace_conversion
+++ b/cpp/.traces/brace_conversion
@@ -2,7 +2,7 @@ parse/0: label: {
 parse/0: instruction: 25
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
 parse/0: label: }
 brace/0: 24: push (open, 0)
 brace/0: push (close, 3)
diff --git a/cpp/.traces/break_cascading b/cpp/.traces/break_cascading
index 09ba7965..56a532a7 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: 1, type: 1, properties: [1: integer]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
 parse/0: label: {
 parse/0: instruction: 25
 parse/0: label: }
diff --git a/cpp/.traces/break_cascading2 b/cpp/.traces/break_cascading2
index 313c607c..7b837b2a 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: 1, type: 1, properties: [1: integer]}
+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: 2, type: 1, properties: [2: integer]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
 parse/0: label: {
 parse/0: instruction: 25
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "3", value: 3, type: 1, properties: [3: integer]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
 parse/0: label: }
 parse/0: label: {
 parse/0: instruction: 25
diff --git a/cpp/.traces/break_empty_block b/cpp/.traces/break_empty_block
index 37e4ced7..d66fe136 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: 1, type: 1, properties: [1: integer]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
 parse/0: label: {
 parse/0: instruction: 25
 parse/0: label: }
diff --git a/cpp/.traces/break_if b/cpp/.traces/break_if
index fdfce24d..34274a91 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: 1, type: 1, properties: [1: integer]}
+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: 2, type: 1, properties: [2: integer]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
 parse/0: label: {
 parse/0: instruction: 25
-parse/0:   ingredient: {name: "2", value: 2, 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: 3, type: 1, properties: [3: integer]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
 parse/0: label: }
 parse/0: label: {
 parse/0: instruction: 26
diff --git a/cpp/.traces/break_label b/cpp/.traces/break_label
index cefe3e2e..23ce2727 100644
--- a/cpp/.traces/break_label
+++ b/cpp/.traces/break_label
@@ -1,17 +1,17 @@
 parse/0: instruction: 1
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
+parse/0:   product: {name: "1", value: 0, type: 1, properties: [1: integer]}
 parse/0: label: {
 parse/0: instruction: 25
-parse/0:   ingredient: {name: "3", value: 3, type: 0, properties: [3: offset]}
+parse/0:   ingredient: {name: "+foo", value: 0, type: 0, properties: [+foo: offset]}
 parse/0: label: }
 brace/0: 24: push (open, 1)
 brace/0: push (close, 3)
 after-brace/0: recipe main
 after-brace/0: copy ...
-after-brace/0: jump 3:offset
+after-brace/0: jump +foo:offset
 run/0: instruction main/0
 run/0: ingredient 0 is 0
 mem/0: storing in location 1
 run/0: instruction main/2
-run/0: ingredient 0 is 3
+run/0: ingredient 0 is +foo
diff --git a/cpp/.traces/break_nested b/cpp/.traces/break_nested
index 3212847b..ed3afda6 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: 1, type: 1, properties: [1: integer]}
+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: 2, type: 1, properties: [2: integer]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
 parse/0: instruction: 25
 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: 3, type: 1, properties: [3: integer]}
+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: 4, type: 1, properties: [4: integer]}
+parse/0:   product: {name: "4", value: 0, type: 1, properties: [4: integer]}
 parse/0: label: }
 brace/0: 24: push (open, 1)
 brace/0: 24: push (open, 4)
diff --git a/cpp/.traces/break_nested_degenerate b/cpp/.traces/break_nested_degenerate
index 90a0d57f..2f09b01d 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: 1, type: 1, properties: [1: integer]}
+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: 2, type: 1, properties: [2: integer]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
 parse/0: instruction: 25
 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: 4, type: 1, properties: [4: integer]}
+parse/0:   product: {name: "4", value: 0, type: 1, properties: [4: integer]}
 parse/0: label: }
 brace/0: 24: push (open, 1)
 brace/0: 24: push (open, 4)
diff --git a/cpp/.traces/break_nested_degenerate2 b/cpp/.traces/break_nested_degenerate2
index 6ca10a5c..7dd3ba16 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: 1, type: 1, properties: [1: integer]}
+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: 2, type: 1, properties: [2: integer]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
 parse/0: instruction: 25
 parse/0: label: {
 parse/0: label: }
diff --git a/cpp/.traces/calling_recipe b/cpp/.traces/calling_recipe
index 078963f6..d1b79af2 100644
--- a/cpp/.traces/calling_recipe
+++ b/cpp/.traces/calling_recipe
@@ -1,8 +1,8 @@
 parse/0: instruction: 25
 parse/0: instruction: 2
-parse/0:   ingredient: {name: "2", value: 2, type: 0, properties: [2: literal]}
-parse/0:   ingredient: {name: "2", value: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "3", value: 3, 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/copy b/cpp/.traces/copy
index 3c12980d..075945a3 100644
--- a/cpp/.traces/copy
+++ b/cpp/.traces/copy
@@ -1,9 +1,9 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 2, 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 0cd0074a..00cab3ff 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: 3, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 14, type: 0, properties: [14: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 15, type: 0, properties: [15: literal]}
-parse/0:   product: {name: "3", value: 3, 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: 16, type: 0, properties: [16: literal]}
-parse/0:   product: {name: "4", value: 4, 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: 1, type: 6, properties: [1: integer-array]}
-parse/0:   product: {name: "5", value: 5, type: 6, properties: [5: integer-array]}
+parse/0:   ingredient: {name: "1", value: 0, type: 6, properties: [1: integer-array]}
+parse/0:   product: {name: "5", value: 0, type: 6, properties: [5: integer-array]}
 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 aa429126..8f83cd0c 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: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 2-1, properties: [1: address:integer, deref: ]}
-parse/0:   product: {name: "3", value: 3, 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 a5a1dd6c..2530b7b7 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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 c4b8edb6..18c61d2d 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 35, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 4, properties: [1: point]}
-parse/0:   product: {name: "3", value: 3, type: 4, properties: [3: point]}
+parse/0:   ingredient: {name: "1", value: 0, type: 4, properties: [1: point]}
+parse/0:   product: {name: "3", value: 0, type: 4, 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 c521ccd8..c361b85d 100644
--- a/cpp/.traces/divide
+++ b/cpp/.traces/divide
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "27", value: 27, type: 0, properties: [27: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 3, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 85335d47..882a3e7e 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: 8, type: 0, properties: [8: literal]}
-parse/0:   ingredient: {name: "2", value: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 1, 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 8ae52475..4c417eed 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: 27, type: 0, properties: [27: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 11, type: 0, properties: [11: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, type: 1, properties: [3: integer]}
-parse/0:   product: {name: "4", value: 4, 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 be1f8f85..4447d109 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: 9, type: 0, properties: [9: literal]}
-parse/0:   ingredient: {name: "2", value: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 2, 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 e852c144..e114b915 100644
--- a/cpp/.traces/equal
+++ b/cpp/.traces/equal
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 3435ba18..1589df01 100644
--- a/cpp/.traces/equal2
+++ b/cpp/.traces/equal2
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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/first_recipe b/cpp/.traces/first_recipe
index 2d13cf1d..3ca1f8f4 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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 7043c0ef..7f1a7336 100644
--- a/cpp/.traces/get
+++ b/cpp/.traces/get
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "12", value: 12, 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: 35, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "13", value: 13, 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: 12, type: 4, properties: [12: point]}
-parse/0:   ingredient: {name: "1", value: 1, type: 0, properties: [1: offset]}
-parse/0:   product: {name: "15", value: 15, type: 1, properties: [15: integer]}
+parse/0:   ingredient: {name: "12", value: 0, type: 4, 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 ...
@@ -19,6 +19,7 @@ run/0: instruction main/1
 run/0: ingredient 0 is 35
 mem/0: storing in location 13
 run/0: instruction main/2
+run/0: foo: ingredient 0 is 12/12
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 13
diff --git a/cpp/.traces/get_address b/cpp/.traces/get_address
index 2011a897..7391d986 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "12", value: 12, 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: 35, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "13", value: 13, 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: 12, type: 4, properties: [12: point]}
-parse/0:   ingredient: {name: "1", value: 1, type: 0, properties: [1: offset]}
-parse/0:   product: {name: "15", value: 15, type: 2-1, properties: [15: address:integer]}
+parse/0:   ingredient: {name: "12", value: 0, type: 4, 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 398e28d1..b7e71e53 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: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 35, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "3", value: 3, 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: 1, type: 2-4, properties: [1: address:point, deref: ]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-4, properties: [1: address:point, deref: ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: offset]}
-parse/0:   product: {name: "4", value: 4, type: 1, properties: [4: 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/get_handles_record_fields b/cpp/.traces/get_handles_record_fields
index a5e4b6eb..428a9d2c 100644
--- a/cpp/.traces/get_handles_record_fields
+++ b/cpp/.traces/get_handles_record_fields
@@ -1,16 +1,16 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "34", value: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "12", value: 12, 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: 35, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "13", value: 13, 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: 36, type: 0, properties: [36: literal]}
-parse/0:   product: {name: "14", value: 14, 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: 12, type: 5, properties: [12: point-integer]}
-parse/0:   ingredient: {name: "1", value: 1, type: 0, properties: [1: offset]}
-parse/0:   product: {name: "15", value: 15, type: 1, properties: [15: integer]}
+parse/0:   ingredient: {name: "12", value: 0, type: 5, 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 ...
@@ -26,6 +26,7 @@ run/0: instruction main/2
 run/0: ingredient 0 is 36
 mem/0: storing in location 14
 run/0: instruction main/3
+run/0: foo: ingredient 0 is 12/12
 run/0: ingredient 0 is 12
 run/0: ingredient 1 is 1
 run/0: address to copy is 14
diff --git a/cpp/.traces/get_indirect b/cpp/.traces/get_indirect
index 8aa7606c..192f79cb 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: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 35, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "3", value: 3, 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: 1, type: 2-4, properties: [1: address:point, deref: ]}
+parse/0:   ingredient: {name: "1", value: 0, type: 2-4, properties: [1: address:point, deref: ]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: offset]}
-parse/0:   product: {name: "4", value: 4, type: 1, properties: [4: 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 ...
@@ -26,6 +26,7 @@ run/0: instruction main/2
 run/0: ingredient 0 is 35
 mem/0: storing in location 3
 run/0: instruction main/3
+run/0: foo: ingredient 0 is 1/1
 run/0: ingredient 0 is 1
 mem/0: location 1 is 2
 run/0: ingredient 1 is 0
diff --git a/cpp/.traces/greater_or_equal b/cpp/.traces/greater_or_equal
index d625a3f7..b91ff266 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 eb68b27a..dbaac94f 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 e78e6178..24d3969c 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 35, type: 0, properties: [35: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 9c3a2523..9d7645b3 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 31203a57..21ecf7ae 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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/index b/cpp/.traces/index
index 20460ed5..e56fcb07 100644
--- a/cpp/.traces/index
+++ b/cpp/.traces/index
@@ -1,19 +1,19 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "3", value: 3, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 14, type: 0, properties: [14: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 15, type: 0, properties: [15: literal]}
-parse/0:   product: {name: "3", value: 3, 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: 16, type: 0, properties: [16: literal]}
-parse/0:   product: {name: "4", value: 4, 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: 1, type: 6, properties: [1: integer-array]}
+parse/0:   ingredient: {name: "1", value: 0, type: 6, properties: [1: integer-array]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "5", value: 5, type: 1, properties: [5: integer]}
+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 d00a6a7c..87d6fdfc 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: 3, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 14, type: 0, properties: [14: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 15, type: 0, properties: [15: literal]}
-parse/0:   product: {name: "3", value: 3, 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: 16, type: 0, properties: [16: literal]}
-parse/0:   product: {name: "4", value: 4, 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: 1, type: 6, properties: [1: integer-array]}
+parse/0:   ingredient: {name: "1", value: 0, type: 6, properties: [1: integer-array]}
 parse/0:   ingredient: {name: "0", value: 0, type: 0, properties: [0: literal]}
-parse/0:   product: {name: "5", value: 5, type: 1, properties: [5: integer]}
+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/jump_backward b/cpp/.traces/jump_backward
index 2fc0f399..b9cf549c 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: 1, 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: 1, 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: -2, 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 8dbf5748..3e0f1bfd 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: 1, 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: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "1", value: 1, 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 c56b028b..1d0d7739 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: 999, type: 0, properties: [999: literal]}
-parse/0:   ingredient: {name: "1", value: 1, 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: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "1", value: 1, 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 601bbc3d..74e1a479 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: 1, 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: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "123", value: 123, 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 15587ff0..62fc389a 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: 1, 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: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "1", value: 1, 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 e87ac12e..b640b6be 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: 999, type: 0, properties: [999: literal]}
-parse/0:   ingredient: {name: "1", value: 1, 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: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "123", value: 123, 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 6898935d..f0f012e2 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: 32, type: 0, properties: [32: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 2434a4de..57a72378 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 74e5f592..d81e0530 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 d7b086e7..ccf85cfc 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: 32, type: 0, properties: [32: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 48967738..f2a6d7dc 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 33, type: 0, properties: [33: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 48f94a4e..2c05c2fb 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: 1, type: 1, properties: [1: integer]}
+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: 2, type: 1, properties: [2: integer]}
+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: 3, type: 1, properties: [3: integer]}
+parse/0:   product: {name: "3", value: 0, type: 1, properties: [3: integer]}
 parse/0: instruction: 25
 parse/0: label: }
 brace/0: 24: push (open, 2)
diff --git a/cpp/.traces/multiply b/cpp/.traces/multiply
index ce15063f..e5c78165 100644
--- a/cpp/.traces/multiply
+++ b/cpp/.traces/multiply
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "4", value: 4, type: 0, properties: [4: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 6, type: 0, properties: [6: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 9c18759b..6822d54c 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: 2, type: 0, properties: [2: literal]}
-parse/0:   ingredient: {name: "3", value: 3, type: 0, properties: [3: literal]}
-parse/0:   product: {name: "1", value: 1, 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/next_ingredient b/cpp/.traces/next_ingredient
index 9c779fcd..5c77e068 100644
--- a/cpp/.traces/next_ingredient
+++ b/cpp/.traces/next_ingredient
@@ -1,11 +1,11 @@
 parse/0: instruction: 25
-parse/0:   ingredient: {name: "2", value: 2, 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: 12, 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: 1, type: 0, properties: [1: literal]}
-parse/0:   ingredient: {name: "12", value: 12, type: 1, properties: [12: integer]}
-parse/0:   product: {name: "13", value: 13, 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 d0f35946..ab7d4348 100644
--- a/cpp/.traces/not
+++ b/cpp/.traces/not
@@ -1,9 +1,9 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 2, 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 bf8bf538..17582d99 100644
--- a/cpp/.traces/or
+++ b/cpp/.traces/or
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "1", value: 1, type: 0, properties: [1: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 2, type: 1, properties: [2: integer]}
+parse/0:   product: {name: "2", value: 0, type: 1, properties: [2: integer]}
 parse/0: instruction: 8
-parse/0:   ingredient: {name: "1", value: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 2d13cf1d..3ca1f8f4 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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 2d13cf1d..3ca1f8f4 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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 2d13cf1d..3ca1f8f4 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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 6f7f2dce..6df04dee 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "2", value: 2, 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 2d13cf1d..3ca1f8f4 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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 e40fb659..8b18e719 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: 23, type: 0, properties: [23: literal]}
-parse/0:   ingredient: {name: "4", value: 4, type: 1, properties: [4: integer]}
-parse/0:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 2, 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 47be43c4..83970be9 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 2, 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 c3c79ae2..c18265b2 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: 23, type: 0, properties: [23: literal, foo: bar:baz]}
-parse/0:   product: {name: "1", value: 1, 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 1b6903cd..8230f9ac 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: 23, type: 0, properties: [23: literal]}
-parse/0:   ingredient: {name: "4", value: 4, type: 1, properties: [4: integer]}
-parse/0:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 2, 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 01bfb40a..c72f91b4 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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 e94e9610..65f49f5b 100644
--- a/cpp/.traces/reply
+++ b/cpp/.traces/reply
@@ -1,16 +1,16 @@
 parse/0: instruction: 25
-parse/0:   ingredient: {name: "2", value: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "3", value: 3, type: 1, properties: [3: integer]}
-parse/0:   product: {name: "4", value: 4, 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: 12, 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: 1, type: 0, properties: [1: literal]}
-parse/0:   ingredient: {name: "12", value: 12, type: 1, properties: [12: integer]}
-parse/0:   product: {name: "13", value: 13, 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: 12, type: 1, properties: [12: integer]}
-parse/0:   ingredient: {name: "13", value: 13, 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_label b/cpp/.traces/run_label
index 6d1065b9..59dded7d 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: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   product: {name: "2", value: 2, 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/store_indirect b/cpp/.traces/store_indirect
index 44c5f10c..2ac8aa81 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: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "1", value: 1, 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/subtract b/cpp/.traces/subtract
index 4275117e..f7bc4113 100644
--- a/cpp/.traces/subtract
+++ b/cpp/.traces/subtract
@@ -1,13 +1,13 @@
 parse/0: instruction: 1
-parse/0:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal]}
-parse/0:   product: {name: "1", value: 1, 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: 34, type: 0, properties: [34: literal]}
-parse/0:   product: {name: "2", value: 2, 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: 1, type: 1, properties: [1: integer]}
-parse/0:   ingredient: {name: "2", value: 2, type: 1, properties: [2: integer]}
-parse/0:   product: {name: "3", value: 3, 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 5bd95f68..8e601f9b 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: 5, type: 0, properties: [5: literal]}
-parse/0:   ingredient: {name: "2", value: 2, type: 0, properties: [2: literal]}
-parse/0:   product: {name: "1", value: 1, 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/010vm b/cpp/010vm
index 049630d3..8bb1604b 100644
--- a/cpp/010vm
+++ b/cpp/010vm
@@ -139,7 +139,7 @@ void setup_recipes() {
   void instruction::clear() { is_label=false; label.clear(); operation=IDLE; ingredients.clear(); products.clear(); }
 
   // Reagents have the form <name>:<type>:<type>:.../<property>/<property>/...
-  reagent::reagent(string s) {
+  reagent::reagent(string s) :value(0) {
     istringstream in(s);
     // properties
     while (!in.eof()) {
@@ -152,12 +152,11 @@ void setup_recipes() {
     }
     // structures for the first row of properties
     name = properties[0].first;
-    value = to_int(name);
     for (size_t i = 0; i < properties[0].second.size(); ++i) {
       types.push_back(Type_number[properties[0].second[i]]);
     }
   }
-  reagent::reagent(type_number t) {
+  reagent::reagent(type_number t) :value(0) {
     types.push_back(t);
   }
   string reagent::to_string() {
diff --git a/cpp/011load b/cpp/011load
index 97483e93..d9da1fe3 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: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 1, 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) {
@@ -166,8 +166,8 @@ recipe main [
   1:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 1, 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 [
@@ -175,8 +175,8 @@ recipe main [
   1:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 1, 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 [
@@ -185,8 +185,8 @@ recipe main [
   # comment
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 1, 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 [
@@ -195,19 +195,19 @@ recipe main [
   2:integer <- copy 23:literal
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 1, 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: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "2", value: 2, 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: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 1, 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 [
@@ -221,40 +221,40 @@ recipe main [
   1:integer <- copy 23:literal/foo:bar:baz
 ]
 +parse: instruction: 1
-+parse:   ingredient: {name: "23", value: 23, type: 0, properties: [23: literal, foo: bar:baz]}
-+parse:   product: {name: "1", value: 1, 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: 23, type: 0, properties: [23: literal]}
-+parse:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
-+parse:   product: {name: "2", value: 2, 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: 23, type: 0, properties: [23: literal]}
-+parse:   ingredient: {name: "4", value: 4, type: 1, properties: [4: integer]}
-+parse:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
-+parse:   product: {name: "2", value: 2, 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: 23, type: 0, properties: [23: literal]}
-+parse:   ingredient: {name: "4", value: 4, type: 1, properties: [4: integer]}
-+parse:   product: {name: "1", value: 1, type: 1, properties: [1: integer]}
-+parse:   product: {name: "2", value: 2, 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: 1, 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/012transform b/cpp/012transform
index bb130187..8cd29c94 100644
--- a/cpp/012transform
+++ b/cpp/012transform
@@ -25,4 +25,30 @@ void transform_all() {
       r.transformed_until = t;
     }
   }
+  parse_int_reagents();  // do this after all other transforms have run
+}
+
+void parse_int_reagents() {
+//?   cout << "parse_int_reagents\n"; //? 1
+  for (unordered_map<recipe_number, recipe>::iterator p = Recipe.begin(); p != Recipe.end(); ++p) {
+    recipe& r = p->second;
+    if (r.steps.empty()) continue;
+    for (size_t index = 0; index < r.steps.size(); ++index) {
+      instruction& inst = r.steps[index];
+      for (size_t i = 0; i < inst.ingredients.size(); ++i) {
+        populate_value(inst.ingredients[i]);
+      }
+      for (size_t i = 0; i < inst.products.size(); ++i) {
+        populate_value(inst.products[i]);
+      }
+    }
+  }
+}
+
+void populate_value(reagent& r) {
+  char* end = NULL;
+  int result = strtol(r.name.c_str(), &end, /*any base*/0);
+  if (*end != '\0') return;
+//?   cout << "setting value\n"; //? 1
+  r.value = result;
 }
diff --git a/cpp/013run b/cpp/013run
index 1fc6ded8..102a7dfb 100644
--- a/cpp/013run
+++ b/cpp/013run
@@ -38,6 +38,7 @@ void run(routine rr) {
     // Running one instruction.
     if (instructions[pc].is_label) { ++pc; continue; }
     trace("run") << "instruction " << recipe_name(rr) << '/' << pc;
+//?     cout << instructions[pc].operation << '\n'; //? 1
     switch (instructions[pc].operation) {
       // Primitive Recipe Implementations.
       case COPY: {
@@ -127,7 +128,7 @@ vector<int> read_memory(reagent x) {
 }
 
 void write_memory(reagent x, vector<int> data) {
-  int base = to_int(x.name);
+  int base = x.value;
   size_t size = size_of(x);
   if (size != data.size()) raise << "size mismatch in storing to " << x.to_string();
   for (size_t offset = 0; offset < size; ++offset) {
@@ -139,6 +140,7 @@ void write_memory(reagent x, vector<int> data) {
 :(code)
 size_t size_of(reagent r) {
   type_info t = Type[r.types[0]];
+  if (!t.is_record && !t.is_array) return t.size;
   // End size_of Cases.
   return t.size;
 }
diff --git a/cpp/016jump b/cpp/016jump
index 2ce18859..827e70f4 100644
--- a/cpp/016jump
+++ b/cpp/016jump
@@ -8,7 +8,7 @@ Next_recipe_number++;
 :(before "End Primitive Recipe Implementations")
 case JUMP: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
-  pc += to_int(instructions[pc].ingredients[0].name);
+  pc += instructions[pc].ingredients[0].value;
   break;
 }
 
@@ -49,7 +49,7 @@ case JUMP_IF: {
     break;
   }
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
-  pc += to_int(instructions[pc].ingredients[1].name);
+  pc += instructions[pc].ingredients[1].value;
   trace("run") << "jumping to instruction " << pc+1;
   break;
 }
@@ -91,7 +91,7 @@ case JUMP_UNLESS: {
     break;
   }
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
-  pc += to_int(instructions[pc].ingredients[1].name);
+  pc += instructions[pc].ingredients[1].value;
   trace("run") << "jumping to instruction " << pc+1;
   break;
 }
diff --git a/cpp/018record b/cpp/018record
index f42531be..b6ca40dc 100644
--- a/cpp/018record
+++ b/cpp/018record
@@ -31,15 +31,16 @@ Recipe_number["get"] = GET;
 assert(Next_recipe_number == GET);
 Next_recipe_number++;
 :(before "End Primitive Recipe Implementations")
+//: beware: overridden in later layers
 case GET: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
-  int base_address = to_int(instructions[pc].ingredients[0].name);
+  int base_address = instructions[pc].ingredients[0].value;
   int base_type = instructions[pc].ingredients[0].types[0];
   assert(Type[base_type].is_record);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
   assert(instructions[pc].ingredients[1].types.size() == 1);
   assert(instructions[pc].ingredients[1].types[0] == 0);  // must be literal
-  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
     src += size_of(reagent(Type[base_type].elements[i][0]));
@@ -110,13 +111,13 @@ Next_recipe_number++;
 :(before "End Primitive Recipe Implementations")
 case GET_ADDRESS: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
-  int base_address = to_int(instructions[pc].ingredients[0].name);
+  int base_address = instructions[pc].ingredients[0].value;
   int base_type = instructions[pc].ingredients[0].types[0];
   assert(Type[base_type].is_record);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
   assert(instructions[pc].ingredients[1].types.size() == 1);
   assert(instructions[pc].ingredients[1].types[0] == 0);  // must be literal
-  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
     src += size_of(reagent(Type[base_type].elements[i][0]));
diff --git a/cpp/019address b/cpp/019address
index cd4f180e..c8685f3d 100644
--- a/cpp/019address
+++ b/cpp/019address
@@ -16,11 +16,11 @@ recipe main [
 vector<int> read_memory(reagent x) {
   vector<int> result;
   if (x.types[0] == 0) {  // literal
-    result.push_back(to_int(x.name));
+    result.push_back(x.value);
     return result;
   }
   x = canonize(x);
-  int base = to_int(x.name);
+  int base = x.value;
   size_t size = size_of(x);
   for (size_t offset = 0; offset < size; ++offset) {
     int val = Memory[base+offset];
@@ -44,7 +44,7 @@ recipe main [
 :(replace{} "void write_memory(reagent x, vector<int> data)")
 void write_memory(reagent x, vector<int> data) {
   x = canonize(x);
-  int base = to_int(x.name);
+  int base = x.value;
   if (!Type[x.types[0]].is_array && size_of(x) != data.size())
     raise << "size mismatch in storing to " << x.to_string();
   for (size_t offset = 0; offset < data.size(); ++offset) {
@@ -72,11 +72,9 @@ reagent deref(reagent x) {
   reagent result("");
   assert(x.types[0] == 2);  // address
 
-  // compute name
-  ostringstream out;
-  out << Memory[to_int(x.name)];
-  result.name = out.str();
-  trace("mem") << "location " << x.name << " is " << result.name;
+  // compute value
+  result.value = Memory[x.value];
+  trace("mem") << "location " << x.value << " is " << result.value;
 
   // populate types
   copy(++x.types.begin(), x.types.end(), inserter(result.types, result.types.begin()));
@@ -112,15 +110,16 @@ recipe main [
 
 :(replace{} "case GET:")
 case GET: {
+  trace("run") << "foo: ingredient 0 is " << instructions[pc].ingredients[0].name << "/" << instructions[pc].ingredients[0].value;
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
   reagent base = canonize(instructions[pc].ingredients[0]);
-  int base_address = to_int(base.name);
+  int base_address = base.value;
   int base_type = base.types[0];
   assert(Type[base_type].is_record);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
   assert(instructions[pc].ingredients[1].types.size() == 1);
   assert(instructions[pc].ingredients[1].types[0] == 0);  // must be literal
-  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
     src += size_of(reagent(Type[base_type].elements[i][0]));
@@ -130,9 +129,8 @@ case GET: {
   assert(Type[base_type].elements.size() > offset);
   int src_type = Type[base_type].elements[offset][0];
   trace("run") << "its type is " << src_type;
-  ostringstream s;
-  s << src;
-  reagent tmp(s.str());
+  reagent tmp(src_type);
+  tmp.value = src;
   tmp.types.push_back(src_type);
   vector<int> result(read_memory(tmp));
   trace("run") << "product 0 is " << result[0];
@@ -156,13 +154,13 @@ recipe main [
 case GET_ADDRESS: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
   reagent base = canonize(instructions[pc].ingredients[0]);
-  int base_address = to_int(base.name);
+  int base_address = base.value;
   int base_type = base.types[0];
   assert(Type[base_type].is_record);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
   assert(instructions[pc].ingredients[1].types.size() == 1);
   assert(instructions[pc].ingredients[1].types[0] == 0);  // must be literal
-  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address;
   for (size_t i = 0; i < offset; ++i) {
     src += size_of(reagent(Type[base_type].elements[i][0]));
diff --git a/cpp/020array b/cpp/020array
index f76342c9..709fd65a 100644
--- a/cpp/020array
+++ b/cpp/020array
@@ -29,13 +29,10 @@ recipe main [
 
 :(before "End size_of Cases")
 if (t.is_array) {
-  assert(!r.name.empty());
-  int base = to_int(r.name);
+  int base = r.value;
   if (Memory[base] == 0) return 0;
-  ostringstream out;
-  out << base+1;
-  reagent x(out.str());
-  x.types.push_back(t.element[0]);
+  reagent x(t.element[0]);
+  x.value = base+1;
   return 1 + Memory[base]*size_of(x);
 }
 
@@ -50,19 +47,17 @@ Next_recipe_number++;
 case INDEX: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
   reagent base = canonize(instructions[pc].ingredients[0]);
-  int base_address = to_int(base.name);
+  int base_address = base.value;
   int base_type = base.types[0];
   assert(Type[base_type].is_array);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
-  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address + 1 + offset*size_of(reagent(Type[base_type].element[0]));
   trace("run") << "address to copy is " << src;
   int src_type = Type[base_type].element[0];
   trace("run") << "its type is " << src_type;
-  ostringstream s;
-  s << src;
-  reagent tmp(s.str());
-  tmp.types.push_back(src_type);
+  reagent tmp(src_type);
+  tmp.value = src;
   vector<int> result(read_memory(tmp));
   trace("run") << "product 0 is " << result[0];
   write_memory(instructions[pc].products[0], result);
@@ -97,11 +92,11 @@ Next_recipe_number++;
 case INDEX_ADDRESS: {
   trace("run") << "ingredient 0 is " << instructions[pc].ingredients[0].name;
   reagent base = canonize(instructions[pc].ingredients[0]);
-  int base_address = to_int(base.name);
+  int base_address = base.value;
   int base_type = base.types[0];
   assert(Type[base_type].is_array);
   trace("run") << "ingredient 1 is " << instructions[pc].ingredients[1].name;
-  size_t offset = to_int(instructions[pc].ingredients[1].name);
+  size_t offset = instructions[pc].ingredients[1].value;
   int src = base_address + 1 + offset*size_of(reagent(Type[base_type].element[0]));
   trace("run") << "address to copy is " << src;
   vector<int> result;
diff --git a/cpp/024brace b/cpp/024brace
index 0385b3b1..0a13ddda 100644
--- a/cpp/024brace
+++ b/cpp/024brace
@@ -248,7 +248,7 @@ recipe main [
 recipe main [
   1:integer <- copy 0:literal
   {
-    break 3:offset
+    break +foo:offset
   }
 ]
-+after-brace: jump 3:offset
++after-brace: jump +foo:offset